2014-06-29 84 views
0

我希望能夠讓Jenkins通過API對特定提交進行構建。使用Jenkins API構建特定提交

到目前爲止,我能找到的最好方法是使用「api-build」分支,並在那裏強制推送所需的提交,然後以典型的方式觸發構建。如果沒有更好的東西,我會感到驚訝,但到目前爲止我還沒有找到它。什麼是「正確」的方式來做到這一點(如果有的話)?

回答

1

您可以使用git掛鉤一起Jenkins遠程構建來完成此操作。

我使用post-receive hook這種類型的東西。

在代碼中的鉤(這是一個shell腳本,但你可以把它包裹別的東西,如的Python腳本),您可以檢查最後一次提交(保持合併在心中,在這如果您不得不返回最後一次非合併提交來查找實際的最後提交),以查看它是否是要在其上觸發構建的提交類型(即包含特定子目錄中的更改)。

的變更可通過標準GIT中命令行工具來獲得,然後正則表達式用於查看是否變更集包含感興趣的任何路徑。

一旦它確定了構建應該被觸發,你可以掏出來捲曲打必要的URL來觸發詹金斯遠程打造(遠程觸發建立需要在工作中啓用,以及可選,令牌集合)。

有關遠程更多信息構建,請參見:響應https://wiki.jenkins-ci.org/display/JENKINS/Remote+access+API

編輯從OP評論:

如果使用後收到掛鉤,我相信它會工作,不管什麼分支或承諾(雖然我個人只做大師記住)。它特定於* git r * epo *,因爲後接收掛鉤代碼位於該回購協議內部。您可以通過鉤子代碼來控制,如何根據已更改的內容確定是否要觸發構建。該鉤子代碼將在每個git push下運行。

編輯迴應跟進評論從OP:

我不相信,當沒有變化,這將觸發,如混帳其實不會在這種情況下,一個推動。如果您想要在完全沒有任何更改時觸發構建,則可以使用前面提到的通過API的 - 無論通過curl命令if 遠程構建已在作業中啓用。

在告訴詹金斯建設什麼樣的,即由構建完成的條件>執行shell命令,在那裏你可以指定生成操作,比如運行一個特定的shell腳本,或螞蟻命令等

我不認爲你會想通過鉤子創造新的工作(offhand,我不認爲這實際上是你可以通過API做的事情 - 它適用於現有的工作,IIRC)。

編輯一些額外的信息:

在指定分支建立在其上的條件,在這個時候,我不甚至可以通過一個git鉤任意指定,想。但是,您可以指定多個分支以在Jenkins作業的SCM配置部分中構建。因此,如果你想在每次提交時創建一組分支,那麼你可以在該部分中定義多個分支,然後它將建立在每個分支上(儘管當給定的構建被觸發時,大概只有一個分支會有這個提交)。

它可能是更實際的克隆上詹金斯的工作,每一個分支,它會建立公正的分支,然後將git的鉤可以針對剛剛基礎上提交的分支工作了一把,而不是跨越一大堆分支,其中大多數分支不適用。

雖然不會讓你隨心所欲的分支機構,這將是一個方式做出來了一把,說,開發測試,或類似的規定(或者也許是少數發佈版本)。

如果您確實需要任意分支,您可以使用作業DSL插件https://wiki.jenkins-ci.org/display/JENKINS/Job+DSL+Plugin),這應該允許對作業創建進行非常具體的控制。這可以通過調用另一個腳本從git鉤子中完成(DSL使用Groovy)。

我自己並沒有嘗試過這個插件,但它聽起來很有希望。它還有助於使用模板,然後可以指定模板,這聽起來可能對您的案例有好處,分支可能會有所不同,但其他大部分內容會相當靜態。

+0

我需要能夠觸發任意分支上的構建,並且可能是任意提交(儘管通常是最近的)。我見過的配置僅限於在硬編碼分支上構建最新的提交。你知道有沒有辦法解決這個問題? –

+0

添加到答案。 – khampson

+0

「每一個git推送」 - 這是否包括不包含更改的推送?另外,你如何告訴詹金斯*要構建什麼?我確實想到了一個原始問題的另一種方式 - 我可以使用可以控制作業配置的API,但這看起來還是有點怪異的。也許正確的答案是每次創建一個新的工作與後接收掛鉤? –