Jenkins notifyCommit触发器无法正常工作?

时间:2012-10-22 02:35:48

标签: svn jenkins

我已经在这个问题上工作了几个小时,而且看起来我做错了。

首先,svn的post-commit钩子已经工作了,因为我已经能够看到日志了,这里是post-commit的代码:

#!/bin/sh

REPOS="$1"
REV="$2"
UUID=`svnlook uuid $REPOS`

/bin/echo "$REPOS $REV $UUID" >> /var/subversion/svn-post-commit.out

请注意,要使其正常工作,您需要执行chmod 777以提交并执行chown www-data:www-data到svn存储库。

什么行不通的是jenkins notifyCommit,它将在jenkins中自动构建项目:

/usr/bin/wget \
  --header "Content-Type:text/plain;charset=UTF-8" \
  --post-data "'svnlook changed --revision $REV $REPOS'" \
  --output-document "-" \
  --timeout=2 \
  http://localhost:8080/subversion/${UUID}/notifyCommit?rev=$REV

我也试过通过curl调用

curl --data "rev=4" http://localhost:8080/subversion/c8bb87ec-9a19-4975-ab9d-8b15741e6d7e/notifyCommit

没有错误,但詹金斯没有建立。

有什么想法吗?

curl的回复:

* About to connect() to 10.1.1.133 port 8080 (#0)
*   Trying 10.1.1.133... connected
> POST /subversion/c8bb87ec-9a19-4975-ab9d-8b15741e6d7e/notifyCommit HTTP/1.1
> User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
> Host: 10.1.1.133:8080
> Accept: */*
> Content-Length: 5
> Content-Type: application/x-www-form-urlencoded
> 
* upload completely sent off: 5out of 5 bytes
< HTTP/1.1 200 OK
< Server: Winstone Servlet Engine v0.9.10
< Connection: Close
< Content-Type: text/html;charset=UTF-8
< Date: Mon, 22 Oct 2012 05:48:49 GMT
< X-Powered-By: Servlet/2.5 (Winstone/0.9.10)
< 
* Closing connection #0

谢谢,
czetsuya

3 个答案:

答案 0 :(得分:4)

有两种方法可以在Jenkins中远程启动构建,我已经成功使用了。 (这些示例适用于shell脚本)

一个是使用URL并启动一个特殊的工作:

方法1:

WGET="/usr/bin/wget"
JENKINS_JOB="Your-Job-Name"
$WGET http://ip:port/job/$JENKINS_JOB/build?token=sampletocken

如果您正在尝试启动参数化作业,可以这样指定参数(否则作业无法启动):

$WGET http://ip:port/job/$JENKINS_JOB/buildWithParameters?param-name=param-value&token=sampletocken

不需要带有token = sampletocken的部分,但增加了一点安全性。您可以在“远程触发构建”下的作业配置中配置令牌。

另一种方法是使用Jenkins subversion API:

方法2:

# REPOS is the local path of the repository.
# REV is the revision that we want to build.
# SERVER is the full URL of Jenkins.
# UUID of the repository (it will be used to identify it to Jenkins)

REPOS="$1"
REV="$2"
SERVER="http://ip:port"
UUID=`svnlook uuid $REPOS`

$WGET \
  --header "Content-Type:text/plain;charset=UTF-8" \
  --post-data "`svnlook changed --revision $REV $REPOS`" \
  --output-document "-" \
  --timeout=2 \
  $SERVER/subversion/${UUID}/notifyCommit?rev=$REV

为了使这一切正常运行,您必须已经为Jenkins中的匿名用户授予了适当的权限。但是,这可能是您不想做的事情,因为它会引发安全问题。

<强>验证

为了使其更安全,您可以创建一个单独的用户,该脚本将在脚本中用于向Jenkins进行身份验证。将此用户配置为具有您将在脚本中使用的一些“API令牌”。 (不要忘记删除匿名用户的所有权利)

然后你需要在wget命令中添加以下内容:

wget --auth-no-challenge --http-user=user --http-password=apiToken

“ - auth-no-challenge”用于避免“403禁止”错误。 您还可以将其他标记添加到URL,如上例所示。

最后一部分证明对我来说有问题,所以可能需要一些反复试验......

答案 1 :(得分:2)

如果要远程启动Jenkins构建,则必须在作业的构建触发器部分中远程选择触发构建(例如,从脚本)。当你这样做时,你给它一个必须传递给Jenkins项目的标记。

例如,如果您的构建令牌为BUILD,则会传递

http://<JenkinsURL>/job/<jobName>/build?token=BUILD

我用CVS做了很多,因为CVS花费的时间太长,需要太多的资源让Jenkins看看是否有提交。 CVS必须遍历项目中的每个文件以查看是否有更新。我通常不会使用Subversion执行此操作,因为Subversion可以立即查看存储库中是否存在更改,并且该检查只需要很少的资源。

答案 2 :(得分:0)

我找到了一个解决方案,但它并不优雅。我已经使用jenkins cli手动调用构建。我记录了我在这里所做的事情:

http://czetsuya-tech.blogspot.com/2012/10/an-alternative-way-of-invoking-jenkins.html