[英]How to deploy to different environment depending on the branch in Azure DevOps?
我想在 Azure DevOps 中實現以下管道:
Build
階段Dev
Preprod
和Prod
的 3 個部署階段,將前一階段構建的工件部署到各自的環境中我可以使用 Azure DevOps 多級管道和分支名稱上的conditions
來做到這一點。 但是,當我首先推送到dev
分支並且它構建成功,然后我推送說preprod
分支作為Fast-forward時,我希望管道能夠重用在dev
分支中運行的Build
階段已經構建的工件,因為這些是相同的提交。
我在 DevOps 中觀察到的是,即使對於相同的提交,當我推送到每個不同的分支時, Build
階段也會重新運行。 是否可以使用基於 YAML 的管道來實現我想要做的事情?
編輯
這個工作流程的重點不是分支,而是分階段部署,從持續部署最新和最偉大的開發提交到為我們的 500 多個內部用戶推出生產就緒軟件。 我想要實現的是一種稱為構建提升的東西,其中一個相同的構建工件被提升到越來越大的用戶圈子。 我很樂意在不擺弄 git 分支的情況下實現這一目標。
這應該是一個評論(因為它更多的是想法,而不是一個真正的工作解決方案)而不是答案,但我擔心我會擴大限制。
在我看來這是不可能的,但讓我詳細解釋一下。 因為您實際需要的是提交流的管道 controller。 您需要的是基於某個分支中提交的外觀的門/批准。 這種認可是可能的。
想象一下,您向Dev
分支提交了一個提交。 您的管道開始,部署到Dev
環境完成,而不是Preprod
的時間,但在此之前,通過調用 Azure Function 進行批准。 您將傳遞此標頭
{
"Content-Type":"application/json",
"PlanUrl": "$(system.CollectionUri)",
"ProjectId": "$(system.TeamProjectId)",
"HubName": "$(system.HostType)",
"PlanId": "$(system.PlanId)",
"JobId": "$(system.JobId)",
"TimelineId": "$(system.TimelineId)",
"TaskInstanceId": "$(system.TaskInstanceId)",
"AuthToken": "$(system.AccessToken)",
"BuildId":"$(Build.BuildId)",
"StageName":"$(System.StageName)"
}
在 Azure Function 中,您將獲得構建 ID 和階段名稱。 使用 build id,您可以調用 REST API 來獲取更改並檢查它們是否已經在stageName
分支中(在這種情況下它是Preprod
。由於它們不存在,因此階段將失敗。
將此提交移至PreProd
分支后,您應該觸發先前失敗的構建以再次檢查條件並獲取已創建的工件。 您可能需要使用某種 web 鈎子,更糟糕的是,目前這是不可能的。 您無法觸發特定階段(請查看文檔)。 您可以嘗試使用失敗的階段進行構建並再次將它們排隊,但在這種情況下,您將再次部署到Dev
。
所以你看到這是非常難以實現的。 但也許有人會有更好的主意。
是否可以使用基於 YAML 的管道來實現我想要做的事情?
同意 Krzysztof Madej 的觀點,我認為使用基於 YAML 的管道實現您的要求並非不可能。
為了實現它,我們必須確保Preprod
分支上的每個提交都與dev
分支上的每個提交相同,然后我們才能使用分支名稱上的條件來跳過構建階段
stages:
-stage: Build
displayName: Build
and(succeeded(), eq(variables['CommitBranchName'], 'refs/heads/dev'))
然后我們可以通過 git 命令git branch --contains 獲取 CommitBranchName CommitBranchName
但是,我們不能保證每個分支都與 dev 提交相同,azure devops 無法確定這兩個提交是否相同。 觸發構建的事件是提交,而不是提交的內容。
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.