2012-10-09 89 views
101

如何從Jenkins遠程觸發構建?
如何配置Git後提交掛鉤?如何配置Git post commit hook

我的要求是,無論何時在特定項目的Git存儲庫中進行更改,它都會自動爲該項目啓動Jenkins構建。

在Jenkins觸發器構建部分我選擇了遠程觸發器構建。
.git目錄中,掛鉤目錄在那裏,我們必須配置提交後文件。
我很困惑如何從那裏觸發構建(我知道我們應該使用curl命令的一部分)。


curl cmbuild.aln.com/jenkins/view/project name/job/myproject/buildwithparameters?Branch=feat-con 

我在git的服務器掛鉤目錄放在這個命令(後commit鉤子)。
只要在存儲庫中發生更改,它就會運行自動構建。

我想檢查changeset是否至少有一個java文件是否應該啓動構建。
假設開發人員只更改了xml文件或屬性文件,構建不應該啓動。
隨着xml,假設.java文件是在那裏生成應該開始。

+0

我編輯了我的答案以解決問題的第二部分。 – VonC

回答

125

正如在「Polling must die: triggering Jenkins builds from a git hook」提到的,可以通知新的詹金斯承諾:

隨着最新Git plugin 1.1.14(即我剛纔發佈),你現在可以做更多>通過簡單地執行以下命令:

curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository> 

這將掃描是配置爲檢查指定URL的所有作業,如果他們還與輪詢配置,它會立即觸發輪詢(並且如果發現一個變化值得構建,將依次觸發構建。)

這允許腳本在Jenkins工作來臨時保持不變。
或者,如果您在單個存儲庫主機應用程序(如Gitosis)下有多個存儲庫,則可以與所有存儲庫共享一個後接收掛接腳本。最後,即使對於安全的Jenkins,這個URL也不需要認證,因爲服務器不直接使用客戶端發送的任何內容。它在實際開始構建之前運行輪詢來驗證是否有更改。

由於mentioned here,請務必使用正確的地址爲您詹金斯服務器:

因爲我們在8080端口上的URL應該已經沒有/jenkins,像這樣運行詹金斯作爲獨立的Web服務器:

http://jenkins:8080/git/[email protected]:tools/common.git 

爲了強調最後一點,ptha增加in the comments

這可能是顯而易見的,但我有問題,有:

curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>. 

網址參數應匹配正是你在你的詹金斯工作庫網址
在複製示例時,我省去了協議,在我們的示例中爲ssh://,但它不起作用。


您也可以使用像一個簡單的後收到鉤「Push based builds using Jenkins and GIT

#!/bin/bash 
/usr/bin/curl --user USERNAME:PASS -s \ 

http://jenkinsci/job/PROJECTNAME/build?token=1qaz2wsx 

配置詹金斯的工作能夠「觸發遠程建立」和使用認證令牌(本例中爲1qaz2wsx)。

但是,這是一個項目特定的腳本,作者提到了一種推廣它的方法。
第一種解決方案更簡單,因爲它不依賴於身份驗證或特定的項目。


我想改變設置是否至少一個java的文件,檢查是否有構建應該開始。
假設開發人員只更改了XML文件或屬性文件,那麼構建不應該啓動。

基本上,構建腳本可以:

  • 把「建設」筆記(見git notes)在第一次通話
  • 在後續調用,搶的HEAD之間提交的名單你分支候選版本和git notes'build'引用的提交(git show refs/notes/build):git diff --name-only SHA_build HEAD
  • 您的腳本可以解析該列表並決定是否需要繼續構建。
  • 在任何情況下,創建/移動您的git notes'build'至HEAD

2016年5月:cwhsu指出in the comments以下可能網址:

你可以只使用curl --user USER:PWD http://JENKINS_SERVER/job/JOB_NAME/build?token=YOUR_TOKEN如果您在您的項目設置觸發配置

http://i.imgur.com/IolrOOj.png


2016年6月,polaretto指出in the comments

我想補充一點,只是一個小shell腳本,你可以避免手動URL配置,特別是如果你有一個共同的目錄下有許多倉庫。
例如我用這些參數擴展來獲得回購名稱

repository=${PWD%/hooks}; 
repository=${repository##*/} 

,然後用它喜歡:

curl $JENKINS_URL/git/notifyCommit?url=$GIT_URL/$repository 
+0

hi von正如你在第一次調用時所說的,我必須建立一個notes.my,第一次調用是讀取.java文件,只要開發人員將更改推送到git repo。我對所有這些事物都陌生,所以我每一步都在問。請不要介意,我必須完成這項任務。 –

+0

這對我很有幫助。我在這個主題的幫助下編寫了Git鉤子。 Tnx傢伙! –

+0

我不得不將curl調用添加到post-receive文件,這個答案並不完全清楚。無論如何非常有幫助! – Magnilex

3

由於以前的答案確實顯示的一個例子,如何充分掛鉤可能看起來像這裏是我的工作後接收鉤的代碼:

#!/usr/bin/python 

import sys 
from subprocess import call 

if __name__ == '__main__': 
    for line in sys.stdin.xreadlines(): 
     old, new, ref = line.strip().split(' ') 
     if ref == 'refs/heads/master': 
      print "==============================================" 
      print "Pushing to master. Triggering jenkins.  " 
      print "==============================================" 
      sys.stdout.flush() 
      call(["curl", "-sS", "http://jenkinsserver/git/notifyCommit?url=ssh://[email protected]/var/git/repo.git"]) 

在這種情況下,我t嚴格jenkins工作只有當推動到主而不是其他分支。

+1

你如何將這個Python腳本綁定到Jenkins?或者你只是運行一次? –

+0

Jenkins不知道這個鉤子,主要部分是加載jenkins服務器上的notifyCommit url,它將觸發一個poll。我認爲投票是啓用的,但沒有詹金斯方面的時間表。 – Zitrax

+0

那麼這個python腳本駐留在哪裏?我假設你用你的git安裝來跟蹤提交... –

15

希望這有助於:http://nrecursions.blogspot.in/2014/02/how-to-trigger-jenkins-build-on-git.html

這只是一個使用curl使用混帳提供的混帳掛鉤觸發詹金斯工作的問題。
命令

curl http://localhost:8080/job/someJob/build?delay=0sec 

可以運行詹金斯的工作,其中someJob是詹金斯作業的名稱。

搜索隱藏的.git文件夾中的hooks文件夾。將post-commit.sample文件重命名爲post-commit。用記事本打開它,刪除: Nothing行並將上面的命令粘貼到它。

就是這樣。每當你做一個提交時,Git都會觸發文件中定義的提交後命令。

+0

在從開發機器提交後,post-receive被調用,而不是提交後。將日誌語句放入鉤子中進行驗證。我是否閱讀錯誤的文檔,是不是應該被稱爲post-commit? –

+0

@Sirirish:那很奇怪。也許你正在做一些不同的事 – Nav

+1

這是一個完美的答案。謝謝! – chao

2

我想添加上面的答案,如果啓用Jenkins授權,它會變得更加困難。

啓用它之後,我收到了一條匿名用戶需要讀取權限的錯誤消息。

我看到了兩個可能的解決方案:

1:更改我的鉤:

curl --user name:passwd -s http://domain?token=whatevertokenuhave 

2:根據設定項目的授權。

以前的解決方案有缺點,我不得不在公開我的passwd鉤子文件。在我的情況下是不可接受的。

第二個爲我工作。在全局認證設置中,我必須爲匿名用戶啓用「整體」>「讀取」。在我想觸發的項目中,我必須啓用作業>生成和作業>讀取匿名。

這仍然不是一個完美的解決方案,因爲現在您可以在沒有登錄的情況下在Jenkins中看到該項目。使用http登錄的前一種方法可能會有更好的解決方案,但我還沒有弄明白。