2011-06-07 56 views
29

建立了詹金斯,但想找出添加/当前版本和以前的版本之间改变了哪些文件被修改的文件列表。我想运行一些长时间运行的测试,具体取决于源树的某些部分是否发生了变化。如何获得自詹金斯/哈德森最后构建

已经走遍了interwebs我可以找到没有提到的哈得逊/詹金斯内的这种能力,虽然提出了修订建议使用SVN后提交挂钩。也许这很简单,每个人(除了我)都知道如何去做!

有谁知道这是可能的吗?

回答

4

的CI服务器会告诉你更改列表,如果你是轮询更改和使用SVN更新。但是,您似乎想要根据修改哪些文件来更改构建的行为。我不认为詹金斯一个人就有这样的开箱即用方法。

后提交挂钩是一个合理的想法。您可以参数化作业,并让您的钩子脚本根据所做的更改启动构建,并设置参数值。我不确定这对你有多困难。

然而,你可能要考虑这个分成两个单独的作业 - 一个运行在每次提交,和一个单独的一个,你并不总是需要长时间运行测试。就我个人而言,我更愿意保持执行之间的工作行为一致。否则,可追溯性受损。

+1

“您似乎想要根据修改哪些文件来更改构建的行为”例如,使用Maven增量构建(插件)完成此操作。 – 2015-02-19 20:56:23

0

注意:你必须使用詹自己的svn客户端得到一个改变列表。通过shell构建步骤执行它不会列出构建中的更改。

16

我已经这样做了。不知道这是否正确,但似乎正在工作。您需要安装jenkins groovy插件并执行以下脚本。

import hudson.model.*; 
import hudson.util.*; 
import hudson.scm.*; 
import hudson.plugins.accurev.* 

def thr = Thread.currentThread(); 
def build = thr?.executable; 

def changeSet= build.getChangeSet(); 

changeSet.getItems(); 

ChangeSet.getItems()为您提供了更改。由于我使用的AccuRev,我做List<AccurevTransaction> accurevTransList = changeSet.getItems();

这里,修改后的列表包含重复的文件/名称是否已在当前构建窗口期间一直致力于更多然后一次。

+0

用你的代码来解决这个问题:http://stackoverflow.com/a/12939663/734687,非常感谢! – ChrLipp 2012-10-17 17:13:23

+0

如果在'thr'上使用安全导航('?')运算符,那么'build'不可能为null,然后在'build.getChangeSet()'中得到空指针异常下一行? – solstice333 2017-04-03 06:48:02

4
echo $SVN_REVISION 
svn_last_successful_build_revision=`curl $JOB_URL'lastSuccessfulBuild/api/json' | python -c 'import json,sys;obj=json.loads(sys.stdin.read());print obj["'"changeSet"'"]["'"revisions"'"][0]["'"revision"'"]'` 
diff=`svn di -r$SVN_REVISION:$svn_last_successful_build_revision --summarize` 
+0

你能解释一下如何做到这一点?你的解决方案似乎是我正在寻找的,但我不知道如何实现它。 – Mike 2013-12-10 13:49:23

+0

@ user1725378仅在subversion中运行'build shell' – jollychang 2014-01-16 10:28:53

2

可以使用詹金斯Remote Access API获得当前构建的机器可读的描述,包括它的全部变更集。这里的精妙之处在于,如果您配置了“安静期”,Jenkins可能会将多个提交到同一个存储库的批量提交到一个单一版本,因此依赖单个版本号有点幼稚。

我喜欢让我的Subversion的post-commit挂钩相对简单,手工的东西掉在CI服务器。要做到这一点,我使用wget触发构建,这样的事情...

/usr/bin/wget --output-document "-" --timeout=2 \ 
    https://ci.example.com/jenkins/job/JOBID/build?token=MYTOKEN 

然后将该作业的詹金斯侧配置为执行利用了BUILD_URL环境变量和构建URL的Python脚本从那个API。 URL最终看起来是这样的:

https://ci.example.com/jenkins/job/JOBID/BUILDID/api/json/ 

下面是一些可以在shell脚本中运行的示例Python代码。我遗漏了任何错误处理或HTTP身份验证的东西,以保持在这里可读。

import os 
import json 
import urllib2 


# Make the URL 
build_url = os.environ['BUILD_URL'] 
api = build_url + 'api/json/' 

# Call the Jenkins server and figured out what changed 
f = urllib2.urlopen(api) 
build = json.loads(f.read()) 
change_set = build['changeSet'] 
items = change_set['items'] 
touched = [] 
for item in items: 
    touched += item['affectedPaths'] 
1

通过Groovy:在

<!-- CHANGE SET --> 
<% changeSet = build.changeSet 
if (changeSet != null) { 
hadChanges = false %> 
<h2>Changes</h2> 
<ul> 
<% changeSet.each { cs -> 
hadChanges = true 
aUser = cs.author %> 
<li>Commit <b>${cs.revision}</b> by <b><%= aUser != null ? aUser.displayName :  it.author.displayName %>:</b> (${cs.msg}) 
<ul> 
<% cs.affectedFiles.each { %> 
<li class="change-${it.editType.name}"><b>${it.editType.name}</b>: ${it.path}        </li> <% } %> </ul> </li> <% } 

if (!hadChanges) { %> 
    <li>No Changes !!</li> 
<% } %> </ul> <% } %> 
3

使用构建流程插件和git:

final changeSet = build.getChangeSet() 
final changeSetIterator = changeSet.iterator() 
while (changeSetIterator.hasNext()) { 
    final gitChangeSet = changeSetIterator.next() 
    for (final path : gitChangeSet.getPaths()) { 
    println path.getPath() 
    } 
} 
+0

有没有办法获得文件的绝对路径?这给出了相对于存储库的路径,所以我不知道该文件在哪个存储库。 – 2015-02-13 15:11:34

+0

我不知道我的头顶。你必须通过源代码,https://github.com/jenkinsci/git-plugin/blob/master/src/main/java/hudson/plugins/git/GitChangeSet.java,和/或试验自己。 – 2015-02-16 21:27:38

+0

构建流程插件现在已弃用,对我来说(Jenkins 2.89)此解决方案不起作用。 – heroin 2018-01-15 14:38:06

2
#!/bin/bash 

set -e 

job_name="whatever" 
JOB_URL="http://myserver:8080/job/${job_name}/" 
FILTER_PATH="path/to/folder/to/monitor" 

python_func="import json, sys 
obj = json.loads(sys.stdin.read()) 
ch_list = obj['changeSet']['items'] 
_list = [ j['affectedPaths'] for j in ch_list ] 
for outer in _list: 
    for inner in outer: 
    print inner 
" 

_affected_files=`curl --silent ${JOB_URL}${BUILD_NUMBER}'/api/json' | python -c "$python_func"` 

if [ -z "`echo \"$_affected_files\" | grep \"${FILTER_PATH}\"`" ]; then 
    echo "[INFO] no changes detected in ${FILTER_PATH}" 
    exit 0 
else 
    echo "[INFO] changed files detected: " 
    for a_file in `echo "$_affected_files" | grep "${FILTER_PATH}"`; do 
    echo " $a_file" 
    done; 
fi; 

略有不同 - 我需要混帐的脚本上的特定文件夹.. 所以,我写了一张支票,根据jollychang

它可以直接添加到作业的exec shell脚本。如果没有检测到文件,也exit 0,即SUCCESS ..这样你可以随时触发签入的回购,但建设时,兴趣变化的文件夹

但是...文件如果你想建立导通需求(即点击现在构建)与上次生成的改变.. _affected_files你会改变:

_affected_files=`curl --silent $JOB_URL'lastSuccessfulBuild/api/json' | python -c "$python_func"` 
1

随着詹金斯管道(管道支持的API插件2.2以上),对于我这种解决方案的工作:

def changeLogSets = currentBuild.changeSets 
for (int i = 0; i < changeLogSets.size(); i++) { 
    def entries = changeLogSets[i].items 
    for (int j = 0; j < entries.length; j++) { 
    def entry = entries[j] 
    def files = new ArrayList(entry.affectedFiles) 
    for (int k = 0; k < files.size(); k++) { 
     def file = files[k] 
     println file.path 
    } 
    } 
} 

请参阅https://support.cloudbees.com/hc/en-us/articles/217630098-How-to-access-Changelogs-in-a-Pipeline-Job-

相关问题