我已经设置了Jenkins,但是我想知道在当前版本和先前版本之间添加/更改了哪些文件。我想运行一些长时间运行的测试,具体取决于源树的某些部分是否被更改。
尽管已经有人建议使用SVN提交后钩子,但在Internet上搜寻时,我在Hudson / Jenkins中找不到提及此功能的信息。也许很简单,每个人(我除外)都知道该怎么做!
这可能吗?
如果正在轮询更改并使用SVN更新,CI服务器将显示更改列表。但是,您似乎想根据修改了哪些文件来更改构建的行为。我认为仅凭詹金斯(Jenkins)并没有开箱即用的方法。
很简单,但这对我有用:
我试图将其添加到注释中,但注释中的代码为no way
:
我已经按照以下方式完成了。我不确定这是否是正确的方法,但似乎可行。您需要安装Jenkins Groovy插件并执行以下脚本。
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`
使用Build Flow
您可以使用Jenkins Remote Access API来获取当前版本的机器可读说明,包括其完整更改集。此处的微妙之处在于,如果您配置了“安静期”,Jenkins可能会将对同一存储库的多次提交批处理到单个版本中,因此仅依靠一个修订号就显得有些天真。
通过Groovy:
#!/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;
[使用Jenkins管道(支持API插件2.2或更高版本的管道),此解决方案对我有效:
注意:您必须使用Jenkins自己的SVN客户端来获取更改列表。通过shell构建步骤执行此操作不会列出构建中的更改。