2012-10-22 39 views
4

我一直在處理這個問題幾個小時,現在看來我做錯了什麼。Jenkins notifyCommit觸發器不工作?

首先,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存儲庫。

什麼不工作是詹金斯notifyCommit,會自動建立在詹金斯項目:

/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 --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

+0

嘗試添加-v到您的curl命令來查看響應頭說些什麼。你的詹金斯也有一個用戶名:密碼?如果是這樣,你可以嘗試在curl請求中加入http:// username:password @ localhost:8080/...... – Baldur

+0

Hi Baldur,我已經附上了curl的回覆。我也嘗試了用戶名和密碼 - 相同的響應,但仍然jenkins沒有開始構建。 – czetsuya

回答

0

我發現了一個工作,但它不是優雅。我用jenkins cli手動調用構建。我記錄了我在這裏所做的:

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

+0

像David W的答案一樣,這是一個很好的解決方案,但它沒有解決如何獲得notifyCommit工作的原始問題。這個解決方案需要提交鉤子知道實際的作業名稱,這比將全局提交通知發送給Jenkins要複雜得多。 –

2

當你要火了詹金斯遠程版本,你必須選擇觸發遠程構建(例如,從腳本)在構建觸發器部分工作。當你這樣做時,你給它一個令牌,必須傳遞給Jenkins項目。

例如,如果你的構建令牌是BUILD,你會通過

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

我這個做了很多與CVS,因爲CVS將採取太長,需要太多的資源詹金斯,看看是否有過一個提交。 CVS必須通過項目中的每個文件來查看是否有更新。我通常不會在Subversion中這樣做,因爲Subversion可以即時查看存儲庫中是否存在更改,並且該檢查只佔用很少的資源。

+1

這是正確的,但是您正在描述開始構建的替代方法。最初的問題是關於通過Subversion插件API的方法,所以說(使用UUID而不是Job名稱)。 – Stan

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 

帶有標記= sampletocken i的部分不需要,但增加了一點安全性。您可以在「觸發器遠程構建」下的作業配置中配置令牌。

的另一種方法是使用詹金斯顛覆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 

對於這一切工作,你必須給予適當的權限,在詹金斯匿名用戶。然而,這可能是你不想做的事情,因爲它引發了安全問題。

認證

爲了使它更安全,您可以創建將在腳本中用於身份驗證到詹金斯一個單獨的用戶。配置此用戶以在腳本中使用一些「API令牌」。 (不要忘記刪除了匿名用戶的全部權利)

然後,你需要將以下添加到您的wget命令:

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

的「--auth-NO-挑戰」來避免「403禁止」錯誤。 您也可以將其他標記添加到URL,如上例所示。

最後這部分被證明是對我有問題的,所以它可能需要一些試驗和錯誤...