Как я могу получить комментарии набора изменений SVN для сборки Jenkins?


Мой процесс заключается в том, что Дженкинс опрашивает SVN для сборки каждые три минуты, выполняет сборку, когда происходит изменение, и создает пакет развертывания, который затем отправляет в Octopus. После завершения развертывания он отправляет отчет о развертывании по электронной почте всем участникам.

На данный момент заметки о сборке в отчете являются типичными шаблонными, т. е. Дженкинс строит 35. Что было бы здорово, если бы я мог вытащить комментарии для набора изменений, который вызвал сборку и построил примечания к выпуску от этого.

Если я могу добраться до комментариев, то поместить их в заметки о выпуске довольно просто. Если у кого-то есть какие-то идеи на этот счет, я был бы признателен.

UPDATE: есть связанный вопрос о том, как это сделать с плагином email-ext, но я не использую этот плагин, и, насколько я могу судить, ответ выражается с помощью синтаксиса этого плагина, и я не могу понять, как его адаптировать. Я был бы признателен за ответ, который непосредственно связан с моим использованием здесь.

2 3

2 ответа:

Есть 3 способа получить изменения SCM

Заводной

Заводной он похож на Java и является родным для Jenkins, поэтому вы можете ссылаться на объектные модели и данные Jenkins непосредственно с Groovy. Вам все еще требуются плагины для выполнения Заводного кода, например Заводной плагин. Вот немного примерного кода, взятого из этого ответа:
Как получить список измененных файлов в SVN от Jenkins

import hudson.model.*
import hudson.util.*
import hudson.scm.*
import hudson.scm.SubversionChangeLogSet.LogEntry

// work with current build
def build = Thread.currentThread()?.executable

// for testing, use last build or specific build number
//def item = hudson.model.Hudson.instance.getItem("Update_SRC_Branch") 
//def build = item.getLastBuild()   
//def build = item.getBuildByNumber(35)   

// get ChangesSets with all changed items
def changeSet= build.getChangeSet()
List<LogEntry> items = changeSet.getItems()

Оттуда, items Список теперь содержит набор изменений. Используйте как хотите. Это все, что я собираюсь сделать с Groovy, потому что, честно говоря, я не использую его.

Файловая система

Магазинах Дженкинса опирается на файловую систему под $JENKINS_HOME/jobs/$JOB_NAME/builds/$BUILD_ID. До версии 1.597 $BUILD_ID была меткой времени в формате 2015-03-16_00-13-19. После версии 1.597, теперь $BUILD_ID является номером сборки $BUILD_NUMBER, Как 123 (то же самое, что вы видите в журнале истории сборки).

Там есть файл: $JENKINS_HOME/jobs/$JOB_NAME/builds/$BUILD_ID/changelog.xml. Оно содержит все те же наборы изменений SCM, которые вы видите в пользовательском интерфейсе, извлеченные из вашего SCM, все в XML-файле. Проанализируйте файл, и каждый элемент <msg>...</msg> содержит комментарии. Их может быть несколько.

Однако, хотя все переменные доступны вам во время выполнения во время сборки (измените $VAR на %VAR%, если в Windows), конкретное расположение сборки не создается до завершения сборки, поэтому вы не можете получить к нему доступ во время текущей сборки. Однако вы можете пройти все это переменные в нижестоящую сборку (например, задание развертывания, если оно отдельное), и эта нижестоящая сборка может извлечь файл журнала изменений. Вам бы понадобилось параметризованный триггерный плагин для передачи переменных в другую сборку.

Электронная почта

Действие почтовой программы, которое приходит с Дженкинсом, не может сделать почти ничего, кроме "шаблонного" сообщения. Если вы хотите что-нибудь сделать с электронной почтой, вам нужно Email-ext (Расширенная электронная почта) Плагин. Есть тонна вопросов/ответов на SO здесь о email-ext, даже тег email-ext , однако я бы посоветовал искать текст email-ext, а не использовать тег, так как многие вопросы не полностью помечены.

Первым местом для начала будет" ссылка на маркер содержимого " на странице справки (нажмите кнопку ? значок рядом с этим текстом. Здесь перечислены все возможные маркеры, которые могут быть использованы в заголовке/теле письма

Ты хотел получить "комментарии СКМ". На них ссылаются через %m токена ${CHANGES_SINCE_LAST_SUCCESS}. Чтобы получить просто комментарии, используйте следующее:

${CHANGES_SINCE_LAST_SUCCESS, changesFormat=" %m<br>"}

Просто поместите вышеуказанную строку в конфигурацию тела электронной почты. Вы можете окружить его любым простым текстом, который захотите.

Для более удобного форматирования вывода используйте

${CHANGES_SINCE_LAST_SUCCESS, reverse=true, format="<b>Changes for Build #%n</b><br>%c<br>", changesFormat="<br>[<a href='${JENKINS_URL}/user/%a/builds'>%a</a>] - (%r) %p<br> %m<br>"}

Как указано в близких дублирующих вопросах, которые я предоставил:
как я могу получить запись журнала SVN в Jenkins при отправке электронная почта

P.S.

Если ваше требование -" нет плагинов", то вам нужно найти другую систему сборки, чем Дженкинс. Jenkins-это проект с открытым исходным кодом, который предоставляет ядро и плагин для почти всего остального, поддерживаемого открытым сообществом. Все в Дженкинсе является "плагином", даже Subversion SCM step и Freestyle и Maven проекты являются"плагинами". Некоторые из них поставляются в комплекте с установкой, большинство должны быть добавлены после установки. устанавливать.

Вот решение при использовании сценария конвейера Дженкинса. Форматирование выходных данных здесь осуществляется в виде таблицы HTML. Таблица заключена в кавычки, в моем случае это необходимо при отправке результатов в другие скрипты.

#!groovy

@NonCPS
def getChangeString(buildItem) {
    def buildChanges = ''
    if (buildItem.size() > 0) {
        def changeNbr = 1;
        buildItem.each { buildChanges += changeNbr++ + '. ' + it.msg.text() + '<br>'}
        // Escape quotation marks
        buildChanges = buildChanges.replaceAll('"','\"')
        // Replace new lines with HTML
        buildChanges = buildChanges.replaceAll('\n','<br>')
    } else {
        buildChanges += 'No changes in this build'
    }
    buildChanges
}

node(){
    stage ('deploy') {
        // work with current build
        def buildUrl = BUILD_URL
        // for testing
        //def buildUrl = "http://localhost:8082/job/job_name/167/"

        def buildXml = new XmlSlurper().parse("${buildUrl}api/xml")
        def buildCause = buildXml.action.cause.shortDescription.text()
        def buildCh = getChangeString(buildXml.changeSet.item)

        def releaseNotes = "\"<table><tr><td>Jenkins build</td><td><a href='$BUILD_URL'>$BUILD_NUMBER</a><br></td></tr><tr><td>Build cause: </td><td>$buildCause</td></tr><tr><td>Changes:</td><td>$buildCh</td><tr></table>\""
        // Set variables to null to avoid NotSerializableException
        buildXml = null
        buildCause = null
        buildCh = null
        echo "releaseNotes is $releaseNotes"
    }
}

Вам нужно снять флажок "Использовать Groovy Sandbox", чтобы это сработало.