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

我需要设置哪些插件和插件特性来使我的 Jenkins 工作在任何时候触发构建代码提交给 SVN 项目?

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

117645 次浏览

有两种方法可以做到这一点:

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

  1. 轮询存储库以查看是否发生了更改。如果在同一轮询间隔内有两个提交,这可能会“跳过”一个提交。说明如何这样做,请注意第四个屏幕快照,其中您根据轮询存储库(使用类似 crontab 的配置)在作业上配置了“构建触发器”。

  2. 将您的存储库配置为具有提交后挂钩,该挂钩通知 Jenkins 需要启动构建。这里对插件的描述,在“后提交钩子”一节中

SVN 标记特性不是轮询的一部分,它是将源代码的当前“头”提升为标记的一部分,从而对构建进行快照。这允许您将 Jenkins build # 32引用为 SVN 标记/标记/build-32(或类似的东西)。

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

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

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

你可以看看 我在 GitHub 上的剧本

您可以使用后提交钩子。

将提交后的钩子脚本放在 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,以了解问题以及提交后钩子脚本是否正在运行。

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

然后简单地进入 Jenkins → job _ name → 构建触发器章节→ (i)远程触发器构建(即从脚本) 身份验证令牌: Token _ name

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

  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