本文介紹流水線相關概念,包括流水線和流水線模板、任務和任務模板以及執行上下文。
背景介紹
應用中心提出了流水線和流水線模板的概念。流水線通過引用流水線模板,提供執行上下文,描述了一次流水線執行以及執行結果。而流水線模板通過描述任務,以及任務之間的依賴關系,描述了一個確定的流程。
應用中心提出了任務(Task)以及任務模板(TaskTemplate)的概念,用于描述流水線中某個具體任務以及它的執行。任務通過引用任務模板,提供執行上下文,描述了一次任務的執行以及執行結果。任務模板通過描述任務的執行方式以及預設上下文(可選),來描述一個任務會怎樣執行。
任務以及任務模板的引入將任務執行的描述移出了流水線。應用中心期望通過引入任務以及任務模板的概念,簡化流水線的描述負擔,讓用戶像搭建積木一樣搭建流水線。
流水線
流水線是一個流水線模板的一次具體的執行。例如,為一個代碼倉庫設置了觸發規則,每一次Push事件需要運行一次構建發布行為,那么每次用戶向代碼倉庫推送代碼,應用中心就會創建一個流水線對象,用于記錄這次執行以及執行結果與細節。如下圖所示。
流水線模板
任務
任務是流水線的主要組成,它描述了流水線中每一個獨立任務的執行以及執行結果。一般情況下,用戶不會單獨運行一個任務,所有的任務都由流水線運行產生。例如,構建部署流水線執行完成后,會依次產生構建、審批和部署三個獨立的任務,其中構建是一個獨立的執行,負責根據代碼倉庫中的代碼來構建目標產物。
任務支持文本化或結構化輸出執行的結果,但如果產生了文件制品或鏡像制品,需要在任務執行的過程中進行保存。
任務根據模板限制以及執行上下文輸入,可以運行在阿里云沙箱環境中,也可以運行在用戶當前賬戶下。
任務模板
任務模板通過描述任務的執行方式以及預設上下文(可選),來描述一個任務會怎樣執行。為了降低用戶使用門檻,應用中心預置了若干常用的任務模板,包括審批、部署、自定義執行等。用戶也可以通過創建新的模板,來實現自定義的邏輯。任務模板可以大大簡化流水線的描述復雜度。
執行上下文
執行上下文(Context)可以影響流水線與任務的具體行為,它是流水線與任務的輸入。當滿足條件的Git事件產生或主動觸發流水線時,一個流水線對象將被創建,觸發者將觸發的上下文信息參數化,并傳入執行上下文中。
在流水線執行時,會產生任務并執行。此時,執行引擎會將流水線的執行上下文(記作ctx_pipeline)向流水線模板中預設的執行上下文(記作ctx_pipelinetemplate)合并,產生新的執行上下文作為任務的執行上下文(記作ctx_task)。任務在執行時,執行引擎又會將任務執行上下文與任務模板的執行上下文(記作ctx_tasktemplate)合并,作為任務運行時的執行上下文(記作ctx)。
如果使用運算符+
描述合并這一行為,那么,執行上下文ctx_1向執行上下文ctx_2合并可以記作ctx_1+ctx_2
。上述合并邏輯可以描述為ctx_task=ctx_pipeline+ctx_pipelinetemplate
與ctx=ctx_task+ctx_tasktemplate
,也可以描述為ctx=ctx_pipeline+ctx_pipelinetemplate+ctx_tasktemplate
。如下圖所示。
應用中心對合并這一行為有明確的定義,合并的對象為JSON對象,合并的實現標準為JSON Merge Patch。例如,ctx_1+ctx_2表示ctx_1的數據擁有更高的優先級,會覆蓋ctx_2中的數據,并產生新的JSON對象。
另外,合并行為不滿足交換律的特性,例如,ctx_1+ctx_2
不等于ctx_2+ctx_1
,ctx_1+ctx_2
表示ctx_1向ctx_2合并,而ctx_2+ctx_1
表示ctx_2向ctx_1合并。兩者代表的行為和結果如下圖所示。
任務執行時,會將任務的執行上下文向模板預設的執行上下文合并,并作為最終的執行上下文。任務所在的節點會收到一個包含執行上下文的請求,并按照上下文執行相應的邏輯。