在这里继续我的问题: Jenkins pass or fail build on external executable
我的构建过程现在使用 MS Build 从源代码构建,并在构建过程中执行自定义程序。我在程序中写入控制台的任何内容都记录在控制台输出中。
但是,我还想在用户界面的“更改”和/或“状态”部分中记录一些条目(类似于 SVN 所做的)。
如何才能做到这一点?
在这里继续我的问题: Jenkins pass or fail build on external executable
我的构建过程现在使用 MS Build 从源代码构建,并在构建过程中执行自定义程序。我在程序中写入控制台的任何内容都记录在控制台输出中。
但是,我还想在用户界面的“更改”和/或“状态”部分中记录一些条目(类似于 SVN 所做的)。
如何才能做到这一点?
这是我在每次构建时将自己的日志添加到正常的 Jenkins 'Changes' 链接中所做的:我最终不得不编写我的 svn ant 例程(使用 svnant)来进行检查和更新等......
我让它工作的技巧:
1.) 在“源代码管理”下添加“Subversion 模块”。不要填写该部分。我不希望它检查任何东西。我必须这样做才能让 Jenkins 显示我创建的 changelog.xml 文件,否则它可以存在但 Jenkins 不会显示它。在作业 config.xml 文件中,您将看到 SCM...null... 没有这个。当您添加空的 svn 存储库时,它认为您正在使用 svn,然后让您的 changelog.xml 显示出来。(谁知道这会工作多久?)
在您的构建中,您希望按以下顺序执行这些步骤:
2.) 编写一个 create-changelog 目标。它应该在您的构建文件夹中找到代码的修订版。在 svn 中找到代码的修订版本。从 start-rev 到 stop-rev 执行 svn log asXml="true" 或 "--xml"。如果需要,将多个日志文件连接在一起以创建 ${Jenkins_Home}/jobs/${MYJOB}/builds/${BUILD_NUMBER}/changelog.xml
3.) 现在您可以根据需要删除 $workspace 区域。
4.) svn checkout 更新
5.) 构建
6.) 构建后,“更改”链接将显示您的 changelog.xml
我遇到的问题:
scm polling 没有做标签。
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 /侧边栏链接+插件
它允许您在作业页面上创建一个链接(但不是单独的作业运行),该链接可以链接到绝对或相对(到作业的配置)位置。您可以通过将以下内容放入链接 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
这需要创建一个自上次成功构建以来所有构建的变更集列表,并将它们写入文件,标题包含版本或构建号和日期。
更新:
这是针对 jenkins 的旧版本,并且很长时间没有更新(我们切换到 gitlab-ci),所以我删除了那个 repo。