SVN提交后触发Hudson构建

12

我已经设置了一个版本控制系统(Subversion),开发人员将使用它来提交和更新代码(假设其地址为https://server/svn/project)。只有经过身份验证的用户才能访问项目的SVN。

另一方面,我已经安装了Hudson作为项目的持续集成服务器(项目地址为server:8080/job/project)。

我想要实现以下目标:

  • 当SVN提交时自动触发Hudson构建。
  • 当提交的代码无法构建时(即用户A提交的代码无法构建),将向相应的开发人员发送邮件通知,只有用户A会收到包含该通知的邮件。

我已经为Hudson用户设置了基于矩阵的授权,因为我不希望对任何人开放。

我已经看到了一些针对post-commit钩子的建议,但直到现在都没有起作用。

有人可以就这两个问题提供建议吗?非常感谢具体步骤。


2
我认为Hudson需要对你的repo进行读取权限。以防万一。 - sbi
1
为什么 post-commit hook 没有起作用?是认证问题吗?你也可以设置定期轮询存储库以检测更改。 - Rup
当提交示例代码到 SVN 时,返回了一个“'post-commit' 钩子失败并输出错误”的信息。 - canadiangeo
@canadiangeo:你解决了你的问题吗?希望你已经解决了。 - ArunRaj
4个回答

7
根据"在Subversion/CVS中构建软件项目 # 通过更改构建", Hudson需要轮询您的SVN仓库以便检测变更并触发构建。
然而,这可以像此线程中所述的那样在每次提交SVN时启动。
官方脚本位于Subversion插件页面。
REPOS="$1"
REV="$2"
UUID=`svnlook uuid $REPOS`
/usr/bin/wget \
  --header "Content-Type:text/plain;charset=UTF-8" \
  --post-data "`svnlook changed --revision $REV $REPOS`" \
  --output-document "-" \
  --timeout=2 \
  http://server/hudson/subversion/${UUID}/notifyCommit?rev=$REV

但是需要指定:

为了使其工作,您的Hudson必须允许匿名读取系统
如果对您的Hudson进行了更严格的访问控制,则可能需要根据身份验证配置的方式指定用户名和密码。


那么在我的情况下,最后一行中URL的“server/hudson/subversion”部分应该是什么? - canadiangeo
我也尝试了这个建议(http://borys.name/blog/build_with_hudson_on_subversion_commit.html),它适用于我的情况,但也没有起作用。也许我搞错了提供的URL中需要替换的内容。 - canadiangeo
如果我阅读http://wiki.hudson-ci.org/display/HUDSON/Subversion+Plugin,您只需将“server”替换为您的服务器(在您的情况下:`http://server:8080`),但保留`/hudson/subversion/...`。 - VonC

4

当SVN中有提交时触发构建的方法是:(1)将您的Hudson作业设置为远程构建;(2)制作一个SVN挂钩...

第一部分非常简单...将挂钩放到 /var/lib/svn//hooks 并将 post-commit.tmpl 重命名为 post-commit,然后你可以做一些操作。

#!/bin/bash
# Este script comprueba si se han hecho cambios en un directorio concreto,
# y en tal caso lanza una build en Jenkins

REPOS="$1"
REV="$2"
JENKINS_JOB="$3"
JENKINS_USER=admin
JENKINS_PASSWORD=****
JENKINS_HOST=<hostname>

if [ -n $(svnlook dirs-changed $REPOS --revision $REV | fgrep "tags\/") ];then
 wget --quiet --auth-no-challenge --no-check-certificate --http-user=$JENKINS_USER --http-password=$JENKINS_PASSWORD http://$JENKINS_HOST/job/$JENKINS_JOB/build?token=TOKEN
fi

exit 0

请查看这篇文章 http://blogsyntagma.blogspot.com.ar/2012/04/hook-de-subversion-para-ejecutar-un-job.html(它是用西班牙语写的)

这篇文章介绍了如何使用Subversion钩子来自动运行作业。它解释了如何在存储库提交时自动触发作业,并提供了示例脚本来实现此目的。通过使用Subversion钩子,可以大大简化IT工作流程,特别是在处理重复性任务时。

1

以下是所需步骤:

  • 创建一个 SVN 用户,让 Hudson 可以使用该用户获得对您的存储库的只读访问权限
  • 配置 Hudson 使用此 SVN 用户访问存储库
  • 创建一个新作业,使用指定地址的存储库(即特定分支)
  • 将作业配置为每分钟至少轮询一次以查找任何更改
  • 将作业配置为构建所需内容
  • 将作业配置为在构建失败时发送电子邮件

我建议向所有开发人员发送电子邮件,以便他们被通知构建不稳定,而不仅仅是罪犯。这不仅提供了更多的可见性,而且会激励罪犯立即修复问题,否则接受同事开发人员的责备。相信我,这是有效的。


谢谢你的回答。也许你是对的,如果每个开发者都在不稳定的构建中得到通知,那么效果会更好。然而,我认为你在第三步提出的建议比较简单。 :) 我希望在 svn 提交代码时触发构建,而不是每分钟轮询存储库。我猜这种情况下需要很多时间,并且可能会出现冲突(当两个开发者同时提交他们的代码时)。或者我错了吗? - canadiangeo
我仍然建议配置Hudson来轮询存储库。这样,您可以在一个地方控制和配置构建。如果您愿意,您可以向SVN添加提交后挂钩(post-commit hooks),但是我使用上述步骤时没有遇到任何问题。 - Bernard

0

这是我在提交到 SVN 仓库后,如何让 Jenkins 2.157 开始构建的方法。

1. 在 Jenkins 中允许读取权限

使用 Jenkins 的网页界面,进入 管理 Jenkins配置全局安全性,勾选 允许匿名读取权限

allow anonymous read access screenshot

如果您跳过此步骤,在尝试使用HTTP请求触发构建时,将会收到以下响应(在第三步中描述):
Authentication required
<!--
You are authenticated as: anonymous
Groups that you are in:

Permission you need to have (but didn't): hudson.model.Hudson.Read
... which is implied by: hudson.security.Permission.GenericRead
... which is implied by: hudson.model.Hudson.Administer
-->

2. 配置构建触发器

仍然在 Jenkins 的 Web 界面中,进入您的构建作业并定义您要使用脚本触发构建(这将是下一步中的 SVN 提交钩子):

configure build trigger

3. 创建 post-commit 钩子

最后,进入你的代码库的 hooks 目录,并添加一个名为 post-commit 的 shell 脚本(名称很重要,否则 SVN 在提交后不会执行它):

#!/bin/sh

# Name of the Jenkins build job
yourJob="your_job"

# You defined this in Jenkins' build job
build_token="yourSecretToken"

jenkins_address_with_port="localhost:8090"

curl $jenkins_address_with_port/job/$yourJob/build?token="$build_token"

使脚本可执行:chmod +x post-commit
这是一个扩展版的post-commit,它记录有关提交的数据,例如提交者的信息。
#!/bin/sh

# The path to this repository
repo_path="$1"
# The number of the revision just committed
rev="$2"
# The name of the transaction that has become rev
transaction_name="$3"

# See http://svnbook.red-bean.com/en/1.7/svn.ref.svnlook.c.author.html
commit_author="$(svnlook author --revision $rev $repo_path)"
# The UUID of the repository, something like e3b3abdb-82c2-419e-a100-60b1d0727d12
repo_uuid=$(svnlook uuid $repo_path)

# Which files were changed, added, or deleted. For example:
# U   src/main/java/com/bullbytes/MyProgram.java
what_has_changed=$(svnlook changed --revision $rev $repo_path)

log_file=/tmp/post_commit.log

echo "Post-commit hook of revision $rev committed by $commit_author to repo at $repo_path with ID $repo_uuid was run on $(date). Transaction name: $transaction_name. User $(whoami) executed this script. This has changed: $what_has_changed" >> $log_file

# Name of the Jenkins build job
yourJob="your_job"

# You defined this in Jenkins' build job
build_token="yourSecretToken"

jenkins_address_with_port="localhost:8090"

curl $jenkins_address_with_port/job/$yourJob/build?token="$build_token"

要了解有关提交钩子的更多信息,请访问文档


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