5

我已经处理这个问题几个小时了,似乎我做错了什么。

首先,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

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

有任何想法吗?

卷曲的回复:

* 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

4

3 回答 3

6

我已经成功使用了两种在 Jenkins 中远程启动构建的方法。(示例是针对 shell 脚本的)

一种是使用 URL 并开始一项特定的工作:

方法一:

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=sampletoken 的部分不是必需的,但增加了一点安全性。您可以在“远程触发构建”下的作业配置中配置令牌。

另一种方法是使用 Jenkins 颠覆 API:

方法二:

# 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,如前面的示例中所示。

最后一部分对我来说是有问题的,所以可能需要一些试验和错误......

于 2013-01-24T13:26:56.527 回答
2

当您想远程触发 Jenkins 构建时,您必须在作业的构建触发器部分中选择远程触发构建(例如,从脚本) 。当你这样做时,你给它一个必须传递给 Jenkins 项目的令牌。

例如,如果您的构建令牌是BUILD,您将通过

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

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

于 2012-10-22T04:20:10.313 回答
0

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

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

于 2012-10-22T05:52:52.797 回答