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を実行して、svnリポジトリへのchown www-data:www-dataをポストコミットして実行する必要があることに注意してください。

動作しなかったのは、jenkinsでプロジェクトを自動ビルドするjenkinsnotifyCommitです。

/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

エラーはありませんが、jenkinsはビルドされませんでした。

何か案は?

カールの返事:

* 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 でビルドをリモートで開始する方法は 2 つあります。(例はシェルスクリプト用です)

1 つは、URL を使用して PARTICULAR JOB を開始する方法です。

方法 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=sampletoken の部分は必須ではありませんが、セキュリティを少し追加します。「リモートでビルドをトリガーする」の下のジョブ構成でトークンを構成できます。

もう 1 つの方法は、Jenkins サブバージョン 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 に追加することもできます。

この最後の部分は私にとって問題があることが判明したため、試行錯誤が必要になる可能性があります...

于 2013-01-24T13:26:56.527 に答える
2

Jenkins ビルドをリモートで起動したい場合は、ジョブのBuild TriggersセクションでTrigger builds remote (スクリプトなどから)を選択する必要があります。その際、Jenkins プロジェクトに渡す必要があるトークンを与えます。

たとえば、ビルド トークンがBUILDの場合は、

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

CVS は時間がかかりすぎて、Jenkins がコミットがあったかどうかを確認するにはあまりにも多くのリソースを必要とするため、私はこれを CVS で何度も行いました。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 に答える