簡體   English   中英

詹金斯的日志更改

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM