我已经在这个问题上工作了几个小时,而且看起来我做错了。
首先,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
答案 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