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

Posted

技术标签:

【中文标题】Jenkins CI:如何在 SVN 提交上触发构建【英文标题】:Jenkins CI: How to trigger builds on SVN commit 【发布时间】:2012-04-18 08:18:13 【问题描述】:

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

我已经安装了标准 SVN 插件和 SVN 标记插件,但我没有看到任何允许配置触发器的新功能。

【问题讨论】:

Trigger hudson build when svn commit 的可能重复项 【参考方案1】:

有两种方法可以解决这个问题:

我最初推荐第一个选项,因为它易于实施。一旦你的构建过程成熟,就切换到第二个。

    轮询存储库以查看是否发生了更改。如果两个提交在同一个轮询间隔内出现,这可能会“跳过”一个提交。 Description of how to do so here,请注意第四个屏幕截图,您在作业中配置了基于轮询存储库的“构建触发器”(使用类似 crontab 的配置)。

    将您的存储库配置为具有一个提交后挂钩,该挂钩通知 Jenkins 需要开始构建。 Description of the plugin here,在“提交后挂钩”部分中

SVN 标记功能不是轮询的一部分,它是将源代码的当前“头部”提升为标记的一部分,以对构建进行快照。这允许您将 Jenkins buid #32 称为 SVN 标记 /tags/build-32 (或类似名称)。

【讨论】:

提交后挂钩摇滚。更快的响应时间,并且(在规模上)您的 CI 系统不会因数百个更改日志请求而破坏源存储库。 @EricMinick 他们很棒,但有时他们可以融化 CI 服务器,如果您在短时间内获得大量小提交。课程都是马,如果不分析您的开发流程当前的运作方式,很难知道哪种方法是有利的。 @EdwinBuck:您知道是否有办法将 Jenkins 配置为仅构建选择性提交?我将解释一下,我有一个 tortoiseSVN 和一个不断轮询存储库的 Jenkins 项目。现在,如果我希望我所做的提交不应该触发 Jenkins,有没有办法做到这一点? @UnderDog 如果您已经成熟到在 maven 中有提交后触发器的程度,那么我更喜欢在提交后触发器中查找特殊“关键字”并在发现时的解决方案他们选择不告诉 Jenkins 服务器启动新版本。例如,如果在提交的第一行中提供了“^DONTBUILD -.*”,则可以将其用作“不构建”标志。 @EvilSmurf 好吧,他们只用了 10 年就断开了链接。它更新了!谢谢。【参考方案2】:

您只需要一个插件,即 Subversion 插件。

然后简单地进入 Jenkins → job_name → Build Trigger 部分 → (i) 远程触发构建(即,从脚本) 认证令牌:Token_name

转到 SVN 服务器的 hooks 目录,然后在触发以下命令后:

    cp post-commit.tmpl post-commit chmod 777 post-commit chown -R www-data:www-data post-commit

    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

【讨论】:

这个答案和this answer差不多。【参考方案3】:

我使用 Python 和一些 bash 制作了一个工具来触发 Jenkins 构建。基本上,当提交到达 SVN 服务器时,您必须从提交后收集这两个值:

REPOS="$1"
REV="$2"

然后你使用“svnlook dirs-changed $1 -r $2”来获取刚刚提交的路径。然后,您可以从中检查要构建的存储库。想象一下,您有数十万个项目。你不能检查整个存储库,对吧?

您可以查看my script from GitHub。

【讨论】:

【参考方案4】:

您可以使用提交后挂钩。

将提交后挂钩脚本放在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%    

其中测试 = 作业名称

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

【讨论】:

以上是关于Jenkins CI:如何在 SVN 提交上触发构建的主要内容,如果未能解决你的问题,请参考以下文章

Docker——Jenkins + Git + Registry构建自动化持续集成环境(CI/CD)

docker与jenkins的自动化CI/CD流水线实战(svn)

快速获取Jenkins上build

jenkins提交SVN文件

Linux 各种软件的安装-Jenkins和svn结合

docker与jenkins的自动化CI/CD流水线实战(php-svn)