[英]Log changes in Jenkins
在这里继续我的问题: Jenkins在外部可执行文件上通过还是失败
现在,我的构建过程使用MS Build从源进行构建,并在构建过程中执行自定义程序。 我在程序中写入控制台的所有内容都记录在控制台输出中。
但是,我也想在用户界面的“更改”和/或“状态”部分中记录一些条目(类似于SVN的操作)。
如何才能做到这一点?
这是我为每个构建将自己的日志添加到普通的Jenkins'Changes'链接时所做的事情:我最终不得不编写我的svn ant例程(使用svnant)来进行签出和更新等操作。
我的秘诀:
1.)在“源代码管理”下添加“ Subversion模块”。 不要填写该部分。 我不希望它检查任何东西。 我必须执行此操作,以使Jenkins显示我创建的changelog.xml文件,否则它可以存在,但Jenkins将不显示它。 在job config.xml文件中,您将看到SCM ... null ...没有此内容。 当添加空的svn存储库时,它认为您正在使用svn,然后显示changelog.xml。 (谁知道这可以工作多长时间?)
在构建中,您要按以下顺序执行以下步骤:
2.)编写一个create-changelog目标。 它应该在您的构建文件夹中找到代码的修订版。 在svn中找到代码的修订版。 svn从start-rev到stop-rev记录asXml =“ true”或“ --xml”。 如果需要创建$ {Jenkins_Home} / jobs / $ {MYJOB} / builds / $ {BUILD_NUMBER} /changelog.xml,可将多个日志文件连接在一起
3.)现在,您可以删除$ workspace区域。
4.)svn更新签出
5.)建立
6.)构建后,“更改”链接将显示您的changelog.xml
我遇到的问题:
scm轮询没有做标签。
scm url不够灵活。
groovy-postbuild-plugin弄乱了我的jenkins ui,所以我现在不能使用它。
sidebar-link-plugin似乎不允许您为每个版本进行。 您可能可以使用其他插件来执行构建历史记录,但是我现在还没有进行。
// This is a deliciously convoluted and fragile hack to force Jenkins to show the
// changes via a Groovy Postbuild script:
// fake a Subversion changelog.xml file
changes = new File(manager.build.getRootDir(), "../../workspace/changes.txt")
changelog = new File(manager.build.getRootDir(), "changelog.xml")
changelog.withWriter {
out ->
out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?><log><logentry revision=\""
+ manager.build.number + "\"><date>"
+ new java.util.Date() + "</date><paths>")
message = ""
changes.eachLine {
line ->
if (line.startsWith("./")) line = line.substring(2)
if (!".checksums".equals(line)) {
out.println("<path action=\"M\">" + line + "</path>")
message += line + "\n"
}
}
out.println("</paths><msg>" + message + "</msg></logentry></log>")
}
// get an instance of the SubversionChangeLogParser
import java.net.URL;
import java.net.URLClassLoader;
baseDir = new File(jenkins.model.Jenkins.getInstance().getRootDir(),
"plugins/subversion/WEB-INF/")
urls = new URL[2];
urls[0] = new File(baseDir, "classes/").toURI().toURL()
urls[1] = new File(baseDir, "lib/svnkit-1.3.4-hudson-2.jar").toURI().toURL()
loader = new URLClassLoader(urls, manager.getClass().getClassLoader())
svn = loader.loadClass("hudson.scm.SubversionChangeLogParser").newInstance()
// force the current build to take that parser, parse the changelog.xml,
// and force it down AbstractBuild's throat, too
scmField = manager.build.getClass().getSuperclass().getSuperclass().getDeclaredField("scm")
scmField.setAccessible(true)
scmField.set(manager.build, svn)
changeSet = svn.parse(manager.build, changelog)
changeSetField = manager.build.getClass().getSuperclass().getSuperclass().getDeclaredField("changeSet");
changeSetField.setAccessible(true)
import java.lang.ref.WeakReference;
if (changeSetField.getDeclaringClass().isAssignableFrom(WeakReference.class))
changeSet = new WeakReference(changeSet)
changeSetField.set(manager.build, changeSet)
又是我 :)
在最简单的范围内,只需在边栏上添加另一个链接以及“更改”和“状态”链接,便有一个边栏链接插件
https://wiki.jenkins-ci.org/display/JENKINS/Sidebar-Link+Plugin
它允许您在作业页面上创建一个链接(但是不能运行单个作业),该链接可以链接到绝对或相对(相对于作业的配置)位置。 您可以通过将以下内容放入链接URL来引用工作空间中的文件:
ws/my_output.txt
但是,这意味着该文件始终存在于工作空间中,并且充其量只能显示上一次作业执行的结果。 另外,单击链接会将您带到工作区中的文件,它将不再显示Jenkins UI的其余部分。
更高级的方法是使用Groovy脚本
https://wiki.jenkins-ci.org/display/JENKINS/Groovy+Postbuild+Plugin
看例子#1和#6
黄色感叹号图标旁边的内容是此插件添加到作业状态页面的内容,并且可以完全自定义并允许HTML代码。 但是,这需要了解Groovy脚本,但是示例提供了足够的功能来快速完成操作
我已经创建了一个简单的詹金斯插件来做到这一点...
https://github.com/rmalchow/changelog-appender
此操作将创建自上次成功构建以来所有构建的变更集列表,并将这些变更集写入文件,并在标题中包含版本或内部版本号和日期。
更新:
这是用于詹金斯的旧版本,并且很长一段时间都没有更新(我们切换到gitlab-ci),所以我删除了该回购协议。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.