记录Jenkins的更改

时间:2012-11-29 17:15:50

标签: jenkins

继续我的问题: Jenkins pass or fail build on external executable

我的构建过程现在使用MS Build从源代码构建,并在构建过程中执行自定义程序。我在程序中写入控制台的任何内容都记录在控制台输出中。

但是,我还要在用户界面的“更改”和/或“状态”部分中记录一些条目(类似于SVN所做的那样)。

如何做到这一点?

3 个答案:

答案 0 :(得分:2)

以下是我将自己的日志添加到每个版本的正常Jenkins“更改”链接的操作: 我最终不得不编写我的svn ant例程(使用svnant)来执行检查和更新等...

我的诀窍让它发挥作用:
1.)在“源代码管理”下添加“Subversion模块”。不要填写该部分。我不想让它检查出来。我必须这样做才能让Jenkins显示我创建的changelog.xml文件,否则它可以存在,但Jenkins不会显示它。在job config.xml文件中,您将看到SCM ... null ...没有这个。当你添加空的svn repo时,它认为你正在使用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 of update

5.)build

6。)构建完成后,“更改”链接将显示您的changelog.xml

我遇到的问题:
scm polling没有做标签 scm url不够灵活。
groovy-postbuild-plugin搞砸了我的jenkins ui所以我此时无法使用它。
sidebar-link-plugin似乎不允许你为每个构建做这件事。您可能可以使用其他插件来构建历史记录,但此时我并没有追求它。

答案 1 :(得分:1)

// 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)

答案 2 :(得分:0)

我再次:)

在最简单的一端,只需在侧栏上添加另一个链接,以及“更改”和“状态”链接,就会有一个侧边栏链接插件
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
enter image description here enter image description here

黄色感叹号图标旁边的内容是此插件添加到作业状态页面的内容,这是完全可自定义的并允许HTML代码。然而,这需要了解Groovy脚本,但这些示例提供了足够的快速执行操作