提及來使用gitlab也有大半年了,天天都在跑pipeline,可是卻沒有好好研究過這個叫gitlab-ci.yml
的文件。此次藉着發佈流程升級的機會,好好入門了一下。
主要分如下內容:node
stages是用來定義一個pipeline的,一個pipeline就像一個流水線,由一系列job來構成。好比在發佈(publish)以前要作lint,test,build,那麼這四個job就構成一個pipeline,寫成下面的樣子:webpack
stages - lint - test - build - publish
而後你在gitlab的pipeline下面就能看到下面的圖:
git
上面咱們雖然定義了一個pipeline,和4個job名稱,可是具體每一個job作什麼仍是不清楚的,接下來咱們學習怎麼定義一個job。web
以上面的lint爲例,咱們須要執行npm run lint
命令來查看有沒有lint錯誤,那麼這個job能夠寫成:docker
job-lint: stage: lint script: npm run lint
這裏job-lint
是任務名稱,script
是要在終端執行的命令,stage
表示這個job屬於哪一個stage(pipeline的某個節點)。job名稱這裏要注意一點是,不能使用保留字,好比:不能把一個job的名字稱爲stages或者image,就像變量名不能用if同樣。相關文檔能夠看這裏。npm
有時候,咱們但願一些任務是在某些場景下執行的,好比:打tag的時候再build,這時候能夠使用only/except。gitlab
以上面的場景爲例,咱們能夠這樣寫job-build:學習
job-build: stage: build script: npm run build only: - tags
這樣,上面的job就只有在咱們push tags時纔會觸發。若是咱們但願一個job只在某一類分支有提交的時候觸發,能夠這樣:ui
job-bugfix-build: stage: build script: npm run build only: - /^bugfix-.+$/
上面這個例子只有在bugfix爲前綴的分支產生提交的時候,纔會觸發job-bugfix-build。code
然而,這樣並不足以讓這個任務跑起來,由於CI是跑在docker裏面的,在執行run lint以前,咱們須要把node環境搭起來,這就須要image保留字了:
image: node:12.18
添加了image以後,在任務開始以前,還要安裝依賴,咱們使用before_script來完成這件事:
# 使用node鏡像 image: node:12.18 # 安裝依賴 before_script: - npm install
有時候咱們但願在某些場景下不執行某項任務,這時能夠使用expect,好比不對hotfix進行lint:
job-lint-except-hotfix: script: - npm run lint except: /^hotfix-.+$/
說了only,再說說when,when
是用來決定當前置任務失敗時,當前job是否執行,以及如何執行的問題。好比咱們但願lint成功了再執行build:
build_job: when: on_success stage: build needs: lint_job
再好比咱們在執行發佈的時候,但願手動點擊發布按鈕來執行發佈:
publish_job: when: manual stage: publish script: npm run deploy
在前面提到的build job中,咱們會使用webpack生成壓縮,混淆後的代碼,此時咱們須要把它保存或者下載下來,這時就要用到artifacts了。用法以下:
build_job: script: npm run build artifacts: name: "$CI_COMMIT_REF_NAME" paths: dist/
artifacts最終會被打包成一個壓縮文件,這裏的path表示要添加到壓縮文件的文件或文件夾,name表示生成的壓縮文件的名字。而後在對應的任務詳情特面就能夠下載:
正如經過程序經過模塊來實現代碼複用同樣,CI的yml配置能夠經過include實現配置複用:
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
來引用。