前端gitlab-ci.yml 入門
阿新 • • 發佈:2020-10-05
說起來使用gitlab也有大半年了,每天都在跑pipeline,但是卻沒有好好研究過這個叫`gitlab-ci.yml`的檔案。這次藉著釋出流程升級的機會,好好入門了一下。
主要分以下內容:
- stages
- cache
- only
- when
- before_script,script, after_script
- artifacts
- hidden_job && extends
- reserved keywords - include
## stages:
stages是用來定義一個pipeline的,一個pipeline就像一個流水線,由一系列job來構成。比如在釋出(publish)之前要做lint,test,build,那麼這四個job就構成一個pipeline,寫成下面的樣子:
```yml
stages
- lint
- test
- build
- publish
```
然後你在gitlab的pipeline下面就能看到下面的圖:
上面我們雖然定義了一個pipeline,和4個job名稱,但是具體每個job做什麼還是不清楚的,接下來我們學習怎麼定義一個job。
## job
以上面的lint為例,我們需要執行`npm run lint`命令來檢視有沒有lint錯誤,那麼這個job可以寫成:
```
job-lint:
stage: lint
script: npm run lint
```
這裡`job-lint`是任務名稱,`script`是要在終端執行的命令,`stage`表示這個job屬於哪個stage(pipeline的某個節點)。job名稱這裡要注意一點是,不能使用保留字,比如:不能把一個job的名字稱為stages或者image,就像變數名不能用if一樣。相關文件可以看[這裡](https://gitlab.com/help/ci/yaml/README#unavailable-names-for-jobs)。
有時候,我們希望一些任務是在某些場景下執行的,比如:打tag的時候再build,這時候可以使用only/except。
### only/except
以上面的場景為例,我們可以這樣寫job-build:
```yml
job-build:
stage: build
script: npm run build
only:
- tags
```
這樣,上面的job就只有在我們push tags時才會觸發。如果我們希望一個job只在某一類分支有提交的時候觸發,可以這樣:
```yml
job-bugfix-build:
stage: build
script: npm run build
only:
- /^bugfix-.+$/
```
上面這個例子只有在bugfix為字首的分支產生提交的時候,才會觸發job-bugfix-build。
然而,這樣並不足以讓這個任務跑起來,因為CI是跑在docker裡面的,在執行run lint之前,我們需要把node環境搭起來,這就需要image保留字了:
```yml
image: node:12.18
```
添加了image之後,在任務開始之前,還要安裝依賴,我們使用before_script來完成這件事:
```yml
# 使用node映象
image: node:12.18
# 安裝依賴
before_script:
- npm install
```
有時候我們希望在某些場景下不執行某項任務,這時可以使用expect,比如不對hotfix進行lint:
```yml
job-lint-except-hotfix:
script:
- npm run lint
except: /^hotfix-.+$/
```
### when
說了only,再說說when,`when` 是用來決定當前置任務失敗時,當前job是否執行,以及如何執行的問題。比如我們希望lint成功了再執行build:
```yml
build_job:
when: on_success
stage: build
needs: lint_job
```
再比如我們在執行釋出的時候,希望手動點擊發布按鈕來執行釋出:
```yml
publish_job:
when: manual
stage: publish
script: npm run deploy
```
### artifacts
在前面提到的build job中,我們會使用webpack生成壓縮,混淆後的程式碼,此時我們需要把它儲存或者下載下來,這時就要用到artifacts了。用法如下:
```yml
build_job:
script: npm run build
artifacts:
name: "$CI_COMMIT_REF_NAME"
paths: dist/
```
artifacts最終會被打包成一個壓縮檔案,這裡的path表示要新增到壓縮檔案的檔案或資料夾,name表示生成的壓縮檔案的名字。然後在對應的任務詳情特面就可以下載:
### include和extends
正如通過程式通過模組來實現程式碼複用一樣,CI的yml配置可以通過include實現配置複用:
```yml
include:
- remote: 'https://gitlab.com/awesome-project/raw/master/.before-script-template.yml'
- local: '/templates/.after-script-template.yml'
- template: Auto-DevOps.gitlab-ci.yml
```
這樣,我們可以把一些公用的環境變數或者job放到一個公共repo中,然後在其他專案中通過`remote`來引用。
參考:
https://gitlab.com/help/ci/yam