自Jenkins/Hudson上次构建以来如何获取已更改文件的列表

All*_*lan 33 hudson jenkins

我已经设置了Jenkins,但是我想知道在当前版本和之前版本之间添加/更改了哪些文件.我想运行一些长时间运行的测试,具体取决于源树的某些部分是否已更改.

在浏览过互联网之后,我发现在Hudson/Jenkins中没有提到这种能力,尽管建议使用SVN后提交钩子.也许这很简单,每个人(除了我)都知道怎么做!

这可能吗?

小智 18

我是通过以下方式完成的.我不确定这是否是正确的方法,但似乎有效.您需要安装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();
Run Code Online (Sandbox Code Playgroud)

ChangeSet.getItems()为您提供更改.因为我使用accurev,我做到了List<AccurevTransaction> accurevTransList = changeSet.getItems();.

这里,如果修改后的列表在当前构建窗口中已多次提交,则它包含重复的文件/名称.

  • 如果在 `thr` 上使用了安全导航 (`?`) 运算符,`build` 是否可能为空,然后你会在下一个 `build.getChangeSet()` 处得到一个空指针异常下线? (2认同)

Zac*_*son 5

如果您轮询更改并使用 SVN 更新,CI 服务器将显示更改列表。但是,您似乎希望根据修改的文件来更改构建的行为。我认为单独使用 Jenkins 没有任何开箱即用的方法。

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

但是,您可能需要考虑将其拆分为两个单独的作业 - 一个在每次提交时运行,一个单独的用于您并不总是需要的长时间运行的测试。我个人更喜欢在执行之间保持工作行为的一致性。否则可追溯性会受到影响。


小智 5

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`
Run Code Online (Sandbox Code Playgroud)

  • 你能解释一下如何做到这一点以及在哪里吗?您的解决方案似乎是我正在寻找的解决方案,但我不知道如何实施。 (2认同)

Joe*_*way 5

您可以使用 Jenkins远程访问 API获取当前构建的机器可读描述,包括其完整的更改集。这里的微妙之处在于,如果您配置了“安静期”,Jenkins 可能会将对同一存储库的多次提交批处理到单个构建中,因此依赖单个修订号有点天真。

我喜欢让我的 Subversion 提交后挂钩相对简单,并将事情交给 CI 服务器。为此,我使用 wget 来触发构建,如下所示......

/usr/bin/wget --output-document "-" --timeout=2 \
    https://ci.example.com/jenkins/job/JOBID/build?token=MYTOKEN
Run Code Online (Sandbox Code Playgroud)

然后,该作业在 Jenkins 端配置为执行一个 Python 脚本,该脚本利用BUILD_URL环境变量并从中构建 API 的 URL。URL 最终看起来像这样:

https://ci.example.com/jenkins/job/JOBID/BUILDID/api/json/
Run Code Online (Sandbox Code Playgroud)

下面是一些可以在 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']
Run Code Online (Sandbox Code Playgroud)