我的过程是Jenkins每隔三分钟轮询SVN一次构建,在发生更改时执行构建,然后创建一个部署包,然后将其推送到Octopus。部署完成后,它会通过电子邮件向所有相关人员发送部署报告。
现在,报告中的构建注释只是典型的样板文件,即Jenkins Build 35.如果我可以为触发构建的变更集提取注释并构建发布说明,那将会是多么棒的事情。
如果我能得到评论,那么将它们放入发行说明非常简单。如果有人对此有任何想法,我将不胜感激。
更新:有关如何使用email-ext插件执行此操作的相关问题,但我没有使用该插件,据我所知,答案是使用该语法表达的插件,我无法弄清楚如何适应它。我希望得到的回答直接关系到我的用法。
答案 0 :(得分:11)
有三种方法可以获得SCM更改
Groovy与Java类似,是Jenkins的原生,因此您可以直接使用Groovy引用Jenkins对象模型和数据。您仍然需要插件来执行Groovy代码,例如 Groovy Plugin 。以下是从这个答案中采用的一些示例代码:
How to get the list of changed file in SVN from 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在$JENKINS_HOME/jobs/$JOB_NAME/builds/$BUILD_ID
下的文件系统上存储构建。在1.597版之前,$BUILD_ID
是2015-03-16_00-13-19
格式的时间戳。 After version 1.597 ,$BUILD_ID
现在是$BUILD_NUMBER
的内部版本号123
(与您在构建历史记录日志中看到的相同)。
那里有一个文件:$JENKINS_HOME/jobs/$JOB_NAME/builds/$BUILD_ID/changelog.xml
。它包含您在UI中看到的所有相同的SCM更改集,从SCM中提取,所有这些都在XML文件中。解析文件,每个<msg>...</msg>
元素都包含注释。可能不止一个。
但是,尽管在构建期间运行时可以使用所有变量(如果在Windows上,将$VAR
更改为%VAR%
),则特定的构建位置为 NOT 直到构建完成,因此您无法在当前构建期间访问它。但是,您可以将所有这些变量传递给下游构建(例如,您的部署作业,如果它是独立的),并且下游构建可以提取changelog文件。您需要 Parameterized Trigger Plugin 将变量传递给另一个版本。
Jenkins附带的邮件程序除了&#34;样板外,几乎什么都不做。信息。如果您希望任何与电子邮件相关,则需要 Email-ext (Extended Email) Plugin 。关于电子邮件分机,甚至标签email-ext,关于SO有很多问题/答案,但我建议搜索文本email-ext
而不是使用标签,因为很多问题都没有完全标记。
您的第一个起点是&#34; 内容令牌参考&#34;页面帮助(单击该文本旁边的 ? 图标。列出了可在电子邮件标题/正文中使用的所有可能的标记
您想要&#34; SCM评论&#34;。这些是通过%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>"}
在我提供的密切重复问题中引用:
How can I get the SVN log entry in Jenkins when sending email
如果您的要求是&#34;没有插件&#34;,那么您需要找到一个与Jenkins不同的构建系统。 Jenkins是一个开源项目,为开放社区维护的几乎所有其他内容提供核心和插件。 Jenkins中的所有内容都是&#34;插件&#34;甚至 Subversion SCM 步骤和 Freestyle 和 Maven 项目都是&#34;插件&#34 ;.有些与安装捆绑在一起,大多数都需要在安装后添加。
答案 1 :(得分:0)
使用Jenkins管道脚本时,这是一个解决方案。此处输出的格式设置为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"
}
}
您需要取消选中&#34;使用Groovy Sandbox&#34;为了这个工作。