如何检索Jenkins构建的SVN Changeset注释?

时间:2015-03-09 21:49:35

标签: svn jenkins continuous-integration continuous-deployment

我的过程是Jenkins每隔三分钟轮询SVN一次构建,在发生更改时执行构建,然后创建一个部署包,然后将其推送到Octopus。部署完成后,它会通过电子邮件向所有相关人员发送部署报告。

现在,报告中的构建注释只是典型的样板文件,即Jenkins Build 35.如果我可以为触发构建的变更集提取注释并构建发布说明,那将会是多么棒的事情。

如果我能得到评论,那么将它们放入发行说明非常简单。如果有人对此有任何想法,我将不胜感激。

更新:有关如何使用email-ext插件执行此操作的相关问题,但我没有使用该插件,据我所知,答案是使用该语法表达的插件,我无法弄清楚如何适应它。我希望得到的回答直接关系到我的用法。

2 个答案:

答案 0 :(得分:11)

有三种方法可以获得SCM更改

Groovy的

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_ID2015-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 。关于电子邮件分机,甚至标签,关于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

P.S。

如果您的要求是&#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;为了这个工作。