Как я могу получить комментарии набора изменений SVN для сборки Jenkins?
Мой процесс заключается в том, что Дженкинс опрашивает SVN для сборки каждые три минуты, выполняет сборку, когда происходит изменение, и создает пакет развертывания, который затем отправляет в Octopus. После завершения развертывания он отправляет отчет о развертывании по электронной почте всем участникам.
На данный момент заметки о сборке в отчете являются типичными шаблонными, т. е. Дженкинс строит 35. Что было бы здорово, если бы я мог вытащить комментарии для набора изменений, который вызвал сборку и построил примечания к выпуску от этого.
Если я могу добраться до комментариев, то поместить их в заметки о выпуске довольно просто. Если у кого-то есть какие-то идеи на этот счет, я был бы признателен.
UPDATE: есть связанный вопрос о том, как это сделать с плагином email-ext, но я не использую этот плагин, и, насколько я могу судить, ответ выражается с помощью синтаксиса этого плагина, и я не могу понять, как его адаптировать. Я был бы признателен за ответ, который непосредственно связан с моим использованием здесь.
2 ответа:
Есть 3 способа получить изменения SCM
Заводной
Заводной он похож на Java и является родным для Jenkins, поэтому вы можете ссылаться на объектные модели и данные Jenkins непосредственно с Groovy. Вам все еще требуются плагины для выполнения Заводного кода, например Заводной плагин. Вот немного примерного кода, взятого из этого ответа:
Как получить список измененных файлов в SVN от Jenkinsimport 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", чтобы это сработало.