Gitlab 中 YAML 相關關鍵字與概念解析
概念
-
Job
YAML 檔案使用一系列約束敘述定義了 Job 啟動時所要做的事情。Job 被定義為具名的頂級元素,並且至少包括一條指令碼語句。Job 被 Runner 拿到並在 Runner 的環境下執行。重要的是,每個 Job 都會與其他 Job 分離開來,獨立進行。如:
job1: script: "execute-script-for-job1" job2: script: "execute-script-for-job2"
上面的例子是兩個在ci中能起作用的最簡單的,分離的任務,每一個任務執行一條不同的命令。每條命令都會被Runners拿到並在Runner的環境下被執行。重要的是,每個任務將會獨立進行,與其他任務分離開來。
關鍵字
-
不可以被用於 Job名 的保留字
關鍵字 是否必須 描述 image no 使用的docker映象。詳見 services no 使用的docker服務。詳見 stages no 定義構建場景 types no stages的別名(不贊成使用 before_script no 定義每個任務的指令碼啟動前所需執行的命令 after_script no 定義每個任務的指令碼執行結束後所需執行的命令 variables no 定義構建變數 cache no 定義哪些檔案需要快取,讓後續執行可用 -
Job 的保留字
關鍵字 是否必須 描述 script yes Runner執行的命令或指令碼。可以包含多條命令 image no 使用的docker映象。詳見 services no 使用的docker服務。詳見 stage no 定義job stage(預設:test) type no stage的別名(已棄用) variables no 定義job級別的變數 only no 定義一列git分支,併為其建立job except no 定義一列git分支,不建立job tags no 定義一列tags,用來指定選擇哪個Runner(同時Runner也要設定tags) allow_failure no 允許job失敗。失敗的job不影響commit狀態 when no 定義何時開始job。可以是on_success,on_failure,always或者manual dependencies no 定義job依賴關係,這樣他們就可以互相傳遞artifacts cache no 定義應在後續執行之間快取的檔案列表 before_script no 重寫一組在作業前執行的命令 after_script no 重寫一組在作業後執行的命令 environment no 定義此作業完成部署的環境名稱 coverage no 定義給定作業的程式碼覆蓋率設定 -
only and except 保留字
關鍵字 描述 branches 當一個分支被push上來 tags 當一個打了tag的分支被push上來 api 當一個pipline被piplines api所觸發調起,詳見piplines api external 當使用了GitLab以外的CI服務 pipelines 針對多專案觸發器而言,當使用CI_JOB_TOKEN並使用gitlab所提供的api建立多個pipelines的時候 pushes 當pipeline被使用者的git push操作所觸發的時候 schedules 針對預定好的pipline而言(每日構建一類) triggers 用token建立piplines的時候 web 在GitLab頁面上Pipelines標籤頁下,你按了run pipline的時候
重要的關鍵字解析
-
after_script
before_script
和script
在一個上下文中是序列執行的,after_script
是獨立執行的。所以根據執行器(在runner註冊的時候,可以選擇執行器,docker,shell 等)的不同,工作樹之外的變化可能不可見,例如,在before_script中執行軟體的安裝。你可以在任務中定義
before_script
,after_script
,也可以將其定義為頂級元素,定義為頂級元素將為每一個任務都執行相應階段的指令碼或命令。 -
stages
stages的允許定義多個,靈活的場景階段的pipline。定義的元素的順序決定了任務執行的順序。例如:
stages: - build - test - deploy
- build場景的任務將被並行執行。test、deploy 同理
- build 任務成功後,test 執行。test 成功後,deploy 執行
- 所有的都成功了,提交將會標記為成功
- 任何一步任務失敗了,提交標記為失敗並之後的場景,任務都不回執行。
-
variables
GitLab CI允許你為.gitlab-ci.yml增加變數,該變數將會被設定入任務環境。這些變數是你儲存在git倉庫裡,並且非敏感的專案配置,例如:
variables: DATABASE_URL: "postgres://[email protected]/my_database" # 注意:整數和字串一樣,對於設定變數名和變數值來說都是合法的。但浮點數是非法的。
-
script
script是一段由Runner執行的shell指令碼,例如:job: script: "bundle exec rspec"
這個引數也可以使用陣列包涵好幾條命令:
job: script: - uname -a - bundle exec rspec
注意:有些時候,script命令需要被單引號或者雙引號所包裹。例如:當命令中包涵冒號的時候,該命令需要被引號所包裹。這樣YAML解析器才知道該命令語句不是“key: value”語法的一部分。當命令中包涵以下字元時需要注意打引號:`: { } [ ] , & * # ? | - < > = ! % @ ``
-
only and except
only和except兩個引數說明了job什麼時候將會被建立:
- only定義了job需要執行的所在分支或者標籤
- except定義了job不會執行的所在分支或者標籤
以下是這兩個引數的幾條用法規則:
- only和except如果都存在在一個job宣告中,則所需引用將會被only和except所定義的分支過濾.
- only和except允許使用正則
- only和except允許使用指定倉庫地址,但是不forks倉庫
例子解析:
-
job將會只在issue-開頭的refs下執行,反之則其他所有分支被跳過:
job: # use regexp only: - /^issue-.*$/ # use special keyword except: - branches
-
job只會在打了tag的分支,或者被api所觸發,或者每日構建任務上執行,
job: # use special keywords only: - tags # tag 分支 commit 之後觸發 - triggers # API 觸發 - schedules # 每日構建觸發
-
job將會在父倉庫gitlab-org/gitlab-ce的非master分支有提交時執行。
job: only: - [email protected]/gitlab-ce except: - [email protected]/gitlab-ce
-
在計劃被觸發時或者master分支被push時觸發,並且先決條件是kubernetes服務是活躍的(你啟用了kubernetes服務作為執行器,相關請看gitlab ci runner的文件,ce使用者一般用求不到)
job: only: refs: - master - schedules kubernetes: active
-
artifacts
artifacts 被用於在 job 作業成功後將制定列表裡的檔案或資料夾附加到 job 上,傳遞給下一個 job ,如果要在兩個 job 之間傳遞 artifacts,你必須設定dependencies,下面有幾個例子
-
傳遞所有binaries和.config:
artifacts: paths: - binaries/ - .config
-
傳遞所有git沒有追蹤的檔案
artifacts: untracked: true
-
傳遞binaries資料夾裡所有內容和git沒有追蹤的檔案
artifacts: untracked: true paths: - binaries/
-
禁止傳遞來的artifact:
job: stage: build script: make build dependencies: []
-
只為打tags的行為建立artifacts。artifacts將會在job執行完畢後送到GitLab ui前臺來,你可以直接下載它(tag、details、pipeline 的下載按鈕上都會出現)。
default-job: script: - mvn test -U except: - tags release-job: script: - mvn package -U artifacts: paths: - target/*.war only: - tags
artifacts:name
name指令允許你對artifacts壓縮包重新命名,你可以為每個artifect壓縮包都指定一個特別的名字,這樣對你在gitlab上下載artifect的壓縮包有用
job: artifacts: name: "$CI_JOB_NAME"
artifacts:when
用於job失敗或者未失敗時使用。artifacts:when能設定以下值:- on_success 這個值是預設的,當job成功時上傳artifacts
- on_failure 當job執行失敗時,上床artifacts
- always 不管失敗與否,都上傳
job: artifacts: when: on_failure #當失敗時上傳artifacts
artifacts:expire_in
artifacts:expire_in 用於設定 artifacts 上傳包的失效時間. 如果不設定,artifacts 的打包是永遠存在於 gitlab上 的。當指定 artifacts 過期時間的時候, 在該期間內,artifacts 包將儲存在 gitLab 上。並且你可以在 job 頁面找到一個 keep 按鈕,按了以後可以覆蓋過期時間,讓 artifacts 永遠存在。過期之後,使用者將無法訪問到 artifacts 包。時間的例子如下:- '3 mins 4 sec'
- '2 hrs 20 min'
- '2h20min'
- '6 mos 1 day'
- '47 yrs 6 mos and 4d'
- '3 weeks and 2 days'
job: artifacts: expire_in: 1 week # 一週後過期
-
-
Triggers
Triggers被用於重建特定分支,tag或者commit,他是api觸發的。詳見
其他關鍵字我沒有用到因此也就沒有繼續研究了。
根據自己的需求進行 build 的設定
首先,設定 triggers。
編寫 YAML,這是為 triggers 觸發:
使用以下程式碼觸發 build 。
curl -X POST -F token=你的token -F ref=你的Branch名稱 https://your.gitlab.address/api/v4/