【日常】.gitlab-ci.yml 解读
# .job: 定义暗藏的工作 Job,该工作不会被 Gitlab cicd 执行
# &template 定义锚点
# 暗藏工作联合锚点,能够提供模板给工作 Job 复用 —— 不可跨文件应用,跨文件思考 `!reference`API
# .job: &template 定义可复用的内容
.script_package_install-deploy: &script_package_install-deploy |
yarn global add @custom/deploy-tool
# docker 镜像
image: node:latest
# 钩子函数,脚本执行之前须要执行的命令
before_script:
- npm config set registry https://registry.npm.taobao.org/
- npm config set cache-folder .cache
- *script_package_install-deploy
# 定义不同的周期阶段,属于同一周期的工作 Job 并行执行
stages:
- build
- deploy_staging
- deploy_preview
- deploy_production
# .job: &template 定义可复用的内容
.script_set_env: &script_set_env |
if ["$CI_COMMIT_REF_NAME" == "production"]; then
if ["$CI_JOB_STAGE" == "deploy_production"]; then
export DEPLOY_ENVIRONMENT=prod
else
export DEPLOY_ENVIRONMENT=preview
fi
else ["$CI_COMMIT_REF_NAME" == "staging"]
export DEPLOY_ENVIRONMENT=staging
fi
# .job: &template 定义可复用的内容
# 通过 *template 应用锚点定义的内容
.deploy: &deploy_common
script:
- *script_set_env
- deploy-tool deploy
# 定义工作 build
build:
stage: build # 所属周期阶段,同周期的并行执行
cache: # 须要缓存文件
key: $CI_PROJECT_NAME
paths:
- .cache/**/*
- node_modules/**/*
script: # 该工作要执行的脚本
- npm i
- *script_set_env # 通过 *template 应用锚点定义的内容
- deploy-tool build
only: # 执行机会:staging、production 分支 push 后主动执行
- staging
- production
# 定义工作 deploy_staging
deploy_staging:
stage: deploy_staging # 所属周期阶段,同周期的并行执行
<<: *deploy_common # 通过 <<: *template 合并锚点定义的内容
environment: # 定义要部署的环境
name: staging
only: # 执行机会:staging 分支 push 后主动执行
- staging
# 定义工作 deploy_preview
deploy_preview:
stage: deploy_preview # 所属周期阶段,同周期的并行执行
<<: *deploy_common # 通过 <<: *template 合并锚点定义的内容
environment: # 定义要部署的环境
name: preview
only: # 执行机会:production 分支 push 后主动执行
- production
# 定义工作 deploy_preview
deploy_production:
stage: deploy_production # 所属周期阶段,同周期的并行执行
<<: *deploy_common # 通过 <<: *template 合并锚点定义的内容
environment: # 定义要部署的环境
name: production
when: manual # 手动执行
only: # 因为 when 的存在,不主动执行了,when 默认值 on_success
- production
*template
vs. <<: *template
*template
:复用的只是工作脚本的其中一个指令 <<: *template
:复用的是整个工作脚本
【篇外】如何配置.gitlab-ci.yml
-
如何定义 Job?
-
只有有 script 的就是 Job?
- 定义在顶层(无缩进),且有 script 关键字
- 束缚 Job 何时执行、如何执行
- Job 能够创立 Job,嵌套
- Job 都是独立的执行
-
-
stages 是做什么的
- 定义 Jobs 执行的阶段
- 不同的 Job 能够归属于同一 stage
- 同一 stage 的 Jobs 并行执行
stages:
- build
- deploy_staging
- deploy_preview
- deploy_production
build:
stage: build // 约定所属 stage
cache:
key: $CI_PROJECT_NAME
paths:
- .cache/**/*
- node_modules/**/*
script:
- npm i
- *script_set_env
only:
- tags // 打了 tag 时触发该工作
- staging // 提交 staging 分支时触发该工作
- production // 提交 production 分支时触发该工作
Job 执行机会
- only/except 关键字
- only 关键字的默认策略是 [‘branches’, ‘tags’],即提交了一个分支或者打了标签,就会触发
-
工作执行程序的策略 when
- on_success:默认值,只有后面 stages 的所有工作胜利时才执行
- on_failure:当后面 stages 中任意一个 jobs 失败后执行
- always:无论后面 stages 中 jobs 状态如何都执行
- manual:手动执行
- delayed:提早执行
-
缓存 cache
- 指定须要缓存的文件夹或者文件
- cache 不能缓存工作门路以外的文件
-
自定义变量 variables
variables: TEST: "HELLO WORLD" job1: script: - echo "$TEST"
复用脚本(锚点)
- https://docs.gitlab.com/ee/ci…