使用Gitlab Template加強GitLab CICD的擴展性和兼容性

前期導讀:git

Include指令

Func: 用於引入.yml.yaml結尾的YAML文件,其餘類型的文件不能引入。咱們能夠利用include.gitlab-ci.yml文件的結構更清晰,同時也能夠把一些須要集中管理維護的job寫在一個YAML文件中,放在一個公共倉庫,讓其餘項目的CI來引入該文件。web

舉個例子,假如每一個團隊都須要執行一個report的job,用於報告版本發佈的相關信息,那麼咱們能夠把這個job寫在report.yml文件,放在一個公共的倉庫,而後每一個團隊的.gitlab-ci.yml文件引入report.yml。假如之後須要在report中添加一些須要上報的內容,只須要修改公共項目的report.yml便可。固然,因爲report.yml會被多個項目引用,因此必須通用且擁有較好的擴展性與兼容性,若是改一點東西都須要每一個團隊去配合你改,那就比較糟糕了。微信

include注意要點假設模板文件 example.yml 內容以下:dom

variables:
  POSTGRES_USER: user
  POSTGRES_PASSWORD: testing_password
  POSTGRES_DB: $CI_ENVIRONMENT_SLUG

production:
  stage: production
  script:
    - install_dependencies
    - deploy
  environment:
    name: production
    url: https://$CI_PROJECT_PATH_SLUG.$KUBE_INGRESS_BASE_DOMAIN
  only:
    - master

.gitlab-ci.yml 內容以下:編輯器

include: 'example.yml'

image: alpine:latest

variables:
  POSTGRES_USER: root
  POSTGRES_PASSWORD: secure_password

stages:
  - build
  - test
  - production

production:
  environment:
    url: https://domain.com
  • include的文件和 .gitlab-ci.ymlvariable中定義了同一個 變量,則該變量被 .gitlab-ci.yml中定義的變量覆蓋。如上例,最終 example.yml中變量的取值爲:
POSTGRES_USER:root
POSTGRES_PASSWORD:secure_password
POSTGRES_DB: $CI_ENVIRONMENT_SLUG
  • include的文件和 .gitlab-ci.yml都定義了同一個 job,則會將兩個job進行合併。上例中 example.yml中production job的 enviroment url取值爲 https://domain.com

此外,include還能夠使用關鍵字template去引入.gitlab-ci.yml模板,更爲詳細的信息能夠閱讀官方文檔。gitlab

Extends指令

Func:extends替代了?YAML Anchors,可讀性好,並且更加靈活。它定義一個可讓job去繼承的模板,這樣可讓咱們把一些共同的key進行抽象,方便之後的維護與擴展。ui

Example:url

.tests:
  script: rake test
  stage: test
  only:
    refs:
      - branches

rspec:
  extends: .tests
  script: rake rspec
  only:
    variables:
      - $RSPEC

Result:spa

rspec:
  script: rake rspec
  stage: test
  only:
    refs:
      - branches
    variables:
      - $RSPEC

以上是官方給的例子:tests做爲模板,rspec去繼承它,若是兩者都有相同的key,則使用子類的value覆蓋父類。.net

extend相關詳細的信息請閱讀:?gitlab-ci extends

include and extends結合使用

includeextends支持一塊兒使用。若是隻有include,僅能讓某個項目引用某個YAML文件,而後根據調解觸發對應的job,而加入extend後,咱們能夠把一些公共屬性或者方法(主要是Script)也進行統一管理。這讓咱們能夠更好地去抽象與統一維護。

Example:

  • B.yml
variables:
  TEST_VAR: B
  
.template:
  stage: test
  only: 
    - master
  script:
    - echo_hello
    - echo "VAR1 = ${VAR1}"
    - echo "VAR2 = ${VAR2}"
    - echo "TEST_VAR =  ${TEST_VAR}"
  • .gitlab-ci.yml
variables:
  TEST_VAR: A
  
include:
  - B.yml

job_a:
  before_script:
    - |
      function echo_hello(){
          echo "hello world!"
      }
    - VAR1="hello"
    - VAR2="world"
  extends: .template
  only:
    variables:
     - $A

master分支更新或定義了A變量時,觸發CI,執行結果:

hello world!
VAR1 = hello
VAR2 = world
TEST_VAR = A

以上結果代表:

  1. .gitlab-ci.yml中執行的job,使用的環境變量是 .gitlab-ci.yml文件定義的變量,故輸出 TEST_VAR = A
  2. extends的動做早於 before_script

Summary

咱們在作持續集成的時候應該仔細思考哪些東西能夠用到includeextends,這樣能夠提升CI/CD的擴展性與可維護性。

原文地址: https://www.jianshu.com/u/bab0045ed734


你可能還喜歡


本文分享自微信公衆號 - 雲原生生態圈(CloudNativeEcoSystem)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索