前期導讀:git
-
👉 從GitLabCE CI/CD方法論中探索實踐 -
持續構建與部署之Gitlab-Runner -
👉 Gitlab-runner的CI與CD -
👉 Gitlab CICD 與Kubernetes實踐·部署GitLab -
👉 GitlabCI與Kubernetes實踐·部署GitLab-Runner -
👉 GitLab CICD與Kubernetes實踐·部署Flask Web服務
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.yml
在variable
中定義了同一個 變量,則該變量被.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結合使用
include
和extends
支持一塊兒使用。若是隻有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
以上結果代表:
-
在 .gitlab-ci.yml
中執行的job,使用的環境變量是.gitlab-ci.yml
文件定義的變量,故輸出TEST_VAR = A
-
extends
的動做早於before_script
Summary
咱們在作持續集成的時候應該仔細思考哪些東西能夠用到include
或extends
,這樣能夠提升CI/CD的擴展性與可維護性。
原文地址: https://www.jianshu.com/u/bab0045ed734
你可能還喜歡
-
👉 從GitLabCE CI/CD方法論中探索實踐 -
👉 持續構建與部署值GITLAB-RUNNER -
👉 Gitlab Runner的CI與CD -
👉 Gitlab CICD 與Kubernetes實踐·部署GitLab -
👉 GitlabCI與Kubernetes實踐·部署GitLab-Runner -
👉 GitLab CICD與Kubernetes實踐·部署Flask Web服務
本文分享自微信公衆號 - 雲原生生態圈(CloudNativeEcoSystem)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。