建立了詹金斯,但想找出添加/当前版本和以前的版本之间改变了哪些文件被修改的文件列表。我想运行一些长时间运行的测试,具体取决于源树的某些部分是否发生了变化。如何获得自詹金斯/哈德森最后构建
已经走遍了interwebs我可以找到没有提到的哈得逊/詹金斯内的这种能力,虽然提出了修订建议使用SVN后提交挂钩。也许这很简单,每个人(除了我)都知道如何去做!
有谁知道这是可能的吗?
建立了詹金斯,但想找出添加/当前版本和以前的版本之间改变了哪些文件被修改的文件列表。我想运行一些长时间运行的测试,具体取决于源树的某些部分是否发生了变化。如何获得自詹金斯/哈德森最后构建
已经走遍了interwebs我可以找到没有提到的哈得逊/詹金斯内的这种能力,虽然提出了修订建议使用SVN后提交挂钩。也许这很简单,每个人(除了我)都知道如何去做!
有谁知道这是可能的吗?
的CI服务器会告诉你更改列表,如果你是轮询更改和使用SVN更新。但是,您似乎想要根据修改哪些文件来更改构建的行为。我不认为詹金斯一个人就有这样的开箱即用方法。
后提交挂钩是一个合理的想法。您可以参数化作业,并让您的钩子脚本根据所做的更改启动构建,并设置参数值。我不确定这对你有多困难。
然而,你可能要考虑这个分成两个单独的作业 - 一个运行在每次提交,和一个单独的一个,你并不总是需要长时间运行测试。就我个人而言,我更愿意保持执行之间的工作行为一致。否则,可追溯性受损。
注意:你必须使用詹自己的svn客户端得到一个改变列表。通过shell构建步骤执行它不会列出构建中的更改。
我已经这样做了。不知道这是否正确,但似乎正在工作。您需要安装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();
这里,修改后的列表包含重复的文件/名称是否已在当前构建窗口期间一直致力于更多然后一次。
用你的代码来解决这个问题:http://stackoverflow.com/a/12939663/734687,非常感谢! – ChrLipp 2012-10-17 17:13:23
如果在'thr'上使用安全导航('?')运算符,那么'build'不可能为null,然后在'build.getChangeSet()'中得到空指针异常下一行? – solstice333 2017-04-03 06:48:02
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`
你能解释一下如何做到这一点?你的解决方案似乎是我正在寻找的,但我不知道如何实现它。 – Mike 2013-12-10 13:49:23
@ user1725378仅在subversion中运行'build shell' – jollychang 2014-01-16 10:28:53
可以使用詹金斯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']
通过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> <% } %>
使用构建流程插件和git:
final changeSet = build.getChangeSet()
final changeSetIterator = changeSet.iterator()
while (changeSetIterator.hasNext()) {
final gitChangeSet = changeSetIterator.next()
for (final path : gitChangeSet.getPaths()) {
println path.getPath()
}
}
有没有办法获得文件的绝对路径?这给出了相对于存储库的路径,所以我不知道该文件在哪个存储库。 – 2015-02-13 15:11:34
我不知道我的头顶。你必须通过源代码,https://github.com/jenkinsci/git-plugin/blob/master/src/main/java/hudson/plugins/git/GitChangeSet.java,和/或试验自己。 – 2015-02-16 21:27:38
构建流程插件现在已弃用,对我来说(Jenkins 2.89)此解决方案不起作用。 – heroin 2018-01-15 14:38:06
#!/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"`
随着詹金斯管道(管道支持的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
}
}
}
“您似乎想要根据修改哪些文件来更改构建的行为”例如,使用Maven增量构建(插件)完成此操作。 – 2015-02-19 20:56:23