2015-06-29 72 views
16

在一個正常的自由式項目中,我將SCM插件配置爲指向我想要發佈的Git倉庫,並啓用「Poll SCM」選項,該選項允許我配置一個Stash webhook,告訴Jenkins每當該回購有變化時。通過這種方式,只要將更改推送到回購庫,就可以觸發作業。如何使SCM輪詢與Jenkins Workflow插件配合使用

但是,當我使用工作流而不是自由式項目時,需要構建的代碼的SCM以編程方式在groovy工作流腳本中指定,這意味着它不會偵聽Stash webhook。相反,直接在工作流中配置的SCM是groovy腳本本身的SCM,它與我試圖構建/發佈的代碼庫不同,所以我不希望觸發器基於此。

node('docker_builder') { 
    git url: serviceRepo 
    releaseVersion = getVersion() 
    pipelineSpec = getPipelineSpec() 
    sh "./gradlew clean build pushDockerImage" 
} 

使用工作流程插件時如何實現SCM輪詢的任何想法?

回答

30

我已經用大量的研究和實驗解決了這個問題。這個文檔讓我走上了正確的軌道:https://github.com/jenkinsci/workflow-scm-step-plugin/blob/master/README.md。它說:

輪詢跨多個供應鏈管理系統的支持(在一個或更多的變化將觸發一個新的版本),並再次根據在工作流程的最後建造中使用的供應鏈管理系統進行「

這意味着SCM輪詢仍然支持Jenkins工作流程,但與普通自由式項目不同,您必須在開始監聽SCM更改之前手動運行一次,這很有意義,因爲SCM是在Groovy代碼中定義的;它們直到他們運行一次才知道。

這是一個棘手的因素,你可以在您的工作流程中定義許多SCM。例如,我有三個:一個用於服務本身,一個部署腳本和Groovy工作流DSL。默認情況下,對這三個SCM中的任何一個的更改都會導致「SCM輪詢」選項觸發構建,這可能不合意。幸運的是,在Groovy代碼的「git」步驟中設置「poll:false」選項將禁用對該回購的輪詢。如果您正在從SCM讀取您的Groovy DSL,則可以通過單擊Jenkins UI中的「其他行爲」並添加「不觸發構建在提交通知上」來禁用對該回購的輪詢。

另一個棘手的因素是默認情況下,Stash Web掛鉤插件包含在與Jenkins匹配的RESTful URL中提交的SHA1哈希碼。不幸的是,Jenkins在嘗試提取可能已經定義的多個SCM時使用了相同的提交代碼。哈希碼當然只與一個SCM有關,所以它會中斷。您可以通過在Stash Web掛鉤插件中設置「省略SHA1散列代碼」來解決此問題。然後,詹金斯將在每個SCM的任何分支上使用最新的提交。

+0

不熟悉Stash插件,但關於提交哈希的警告可能適用於[GitHub插件](https://issues.jenkins-ci.org/browse/JENKINS-27136)。 –

+0

對於父作業的輪詢,您有任何特殊配置(您在此啓用了哪些觸發器)?我似乎無法得到輪詢工作,當我去查看配置生成的作業(從jenkinsfile),我沒有看到任何觸發器啓用。 – Woland

相關問題