Jenkins CI:如何在SVN提交时触发构建

80

我需要设置哪些插件和插件功能,才能让我的Jenkins工作在代码提交到SVN项目时触发构建?

我已经安装了标准的SVN插件和SVN标签插件,但是我并没有看到任何新的特性来进行触发配置。


1
可能是当SVN提交时触发Hudson构建的重复问题 - highlycaffeinated
4个回答

89

这里有两种方法:

我建议一开始采用第一种方法,因为它易于实现。 当您的构建流程变得成熟后,请切换到第二个选项。

  1. 轮询存储库以查看是否发生更改。 如果在同一轮询间隔内出现两次提交,则可能会“跳过”提交。 此处描述如何执行此操作,请注意第四个屏幕截图,在作业上配置“基于轮询存储库的构建触发器”(使用类似于crontab的配置)。

  2. 配置您的存储库以具有后提交挂钩,该挂钩通知Jenkins需要启动构建。 此处插件的描述,在“后提交钩子”部分

SVN标记功能不是轮询的一部分,而是将当前的“head”源代码推广到标记以快照构建的一部分。 这使您可以将Jenkins构建#32称为SVN标记/tags/build-32(或类似的内容)。


5
@EricMinick 他们很好,但有时如果短时间内提交了大量小的代码更改,可能会导致CI服务器崩溃。适合的方法因人而异,很难在不分析您的开发流程的情况下知道哪种方法更好。 - Edwin Buck
1
@EdwinBuck:你知道是否有一种方法可以配置Jenkins仅构建选择性提交吗?我来解释一下,我有一个tortoiseSVN和一个Jenkins项目,它不断轮询存储库。现在,如果我希望我所做的提交不应触发Jenkins,是否有一种方法可以实现呢? - SandBag_1996
@UnderDog 如果您已经成熟到在Maven中具有后提交触发器的程度,那么我更喜欢一种解决方案,该解决方案查找后提交触发器中的特殊“关键词”,并在发现它们时选择不告诉Jenkins服务器启动新构建。例如,“^DONTBUILD-.*”可以用作“不构建”标志,如果在提交的第一行中提供。 - Edwin Buck
@mxdsp 更新了链接。虽然它不像旧的wandisco那样漂亮,但它能完成工作。谢谢! - Edwin Buck
1
@EvilSmurf 嗯,他们只用了10年就打破了链接。现在已经更新了!谢谢。 - Edwin Buck
显示剩余2条评论

2
您只需要安装一个插件,即Subversion插件。
然后,进入Jenkins → job_name → Build Trigger部分 → (i) 远程触发构建(从脚本触发) 认证令牌:Token_name 进入SVN服务器的钩子目录,然后执行以下命令:
  1. cp post-commit.tmpl post-commit
  2. chmod 777 post-commit
  3. chown -R www-data:www-data post-commit
  4. vi post-commit

    注意:所有行都应该被注释 在最后添加以下行

语法(适用于Linux用户):
/usr/bin/curl http://username:API_token@localhost:8081/job/job_name/build?token=Token_name

语法(适用于Windows用户):

C:/curl_for_win/curl http://username:API_token@localhost:8081/job/job_name/build?token=Token_name

这个答案与此答案几乎相同。 - Peter Mortensen

1
我使用Python和一些bash编写了一个工具,以触发Jenkins构建。基本上,当提交到SVN服务器时,您必须从post-commit中收集这两个值:
REPOS="$1"
REV="$2"

然后你可以使用 "svnlook dirs-changed $1 -r $2" 命令获取刚刚提交的路径。从中,你可以检查想要构建的存储库。想象一下,如果你有成千上万个项目,你不能检查整个存储库,对吧?

你可以从 我的GitHub脚本 进行检出。


-1

您可以使用后提交钩子。

将后提交钩子脚本放置在hooks文件夹中,在C:\驱动器中创建一个wget_folder文件夹,并将wget.exe文件放入此文件夹中。 在名为post-commit.bat的文件中添加以下代码:

SET REPOS=%1   
SET REV=%2

FOR /f "tokens=*" %%a IN (  
'svnlook uuid %REPOS%'  
) DO (  
SET UUID=%%a  
)  

FOR /f "tokens=*" %%b IN (  
'svnlook changed --revision %REV% %REPOS%'  
) DO (  
SET POST=%%b   
)

echo %REPOS% ----- 1>&2

echo %REV% -- 1>&2

echo %UUID% --1>&2

echo %POST% --1>&2

C:\wget_folder\wget ^   
    --header="Content-Type:text/plain" ^   
    --post-data="%POST%" ^   
    --output-document="-" ^   
    --timeout=2 ^     
    http://localhost:9090/job/Test/build/%UUID%/notifyCommit?rev=%REV%    

其中Test是工作的名称。

echo用于查看值,您还可以在末尾添加exit 2以了解问题以及后提交钩子脚本是否正在运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接