我已经设置了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();.
这里,如果修改后的列表在当前构建窗口中已多次提交,则它包含重复的文件/名称.
如果您轮询更改并使用 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)
您可以使用 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)
| 归档时间: |
|
| 查看次数: |
57376 次 |
| 最近记录: |