從我所看到的,人們正朝着更小,獨立的代碼交付方式發展,而不是整體部署。但顯然,不同組件之間仍存在依賴關係。例如,如果您至少有一個腳本配置了您的基礎架構,而另一個腳本配置了您的應用程序並構建並部署了該腳本,則需要確保在應用程序部署之前運行了基礎架構更新腳本。另一方面,您的基礎架構不依賴於部署應用程序代碼 - 只要理想地通過一些測試,它就可以按照自己的步調進行更新。
正如在另一篇文章中提到,你真的有兩個選項來完成這種依賴性:
- 有一個單一的管道(工作流腳本)來自兩個回購簽出的代碼,同時使他們通過相同的管道。任何改變都需要完整的船隻管道。
- 有兩個管道,這將允許每個人以自己的步調獨立於其他人的行程。這對於基礎結構代碼來說不是問題,但它可能適用於應用程序代碼。如果您未將基礎架構更新先發生,而是將您的應用程序代碼投入生產,則結果可能不盡如人意。
我已經開始處理Jenkins工作流了,它建立了我的流之間的依賴關係。基本上,我聲明一個流程依賴於特定的版本(在這種情況下,只是BUILD_NUM),所以在我進行生產部署之前,我確認其他管道的最後一個成功構建已經完成。我能做到這一點使用詹金斯API爲我流腳本的一部分等待該編譯或更大的成功,像這樣
import hudson.EnvVars
import hudson.model.*
int indepdentBuildNum = 16
waitUntil{
verifyDependentPipelineCompletion("FLDR_CM/WorkflowDepedencyTester2", indepdentBuildNum)
}
boolean verifyDependentPipelineCompletion(String jobName, int buildNum){
def hi = jenkins.model.Jenkins.instance
Item dep2 = hi.getItemByFullName(jobName)
hi = null
def jobs = dep2.getAllJobs().toArray()
def onlyJob = jobs[0] //always 1 job...I think?
def targetedBuild = onlyJob.getLastSuccessfulBuild()
EnvVars me = targetedBuild.getCharacteristicEnvVars()
def es = me.entrySet()
int targetBuildNum = 0;
def vars = es.iterator()
while(vars.hasNext()){
def envVar = vars.next()
if(envVar.getKey().equals("BUILD_ID")){
targetBuildNum = Integer.parseInt(envVar.getValue())
}
}
if (buildNum > targetBuildNum) {
return false
}
return true
}
聲明,我剛開始這個過程,所以我沒有太多真實世界的經驗呢,但是如果我有更多的相關信息會更新這個線程。任何反饋歡迎。
根據[Go CD的頁面圖](http://www.go.cd/),他們繼續假設不同的源代碼庫。你使用哪種SCM?你使用哪種構建工具? –
構建工具和SCM對於這個問題並不重要,因爲我們可以使用Jenkins WorkFlow插件控制和執行正確的命令。但是對於您的信息,它將是用於構建Java應用程序(gradle),docker容器和Linux VM的不同工具的混合。 –
對於這個問題可能並不重要,但對於答案可能很重要。 –