要使用 Gitlab
提供的 CI/CD
功能,需要在仓库根目录创建一个文件 .gitlab-ci.yml
,这样 Gitlab
每次提交都会运行这个配置文件。在 Gitlab
中基础的 CI/CD
单元是作业(job)。一个作业代表运行在一个特殊提交上下文里的 bash
脚本。你可能有一个作业用来运行测试,另一个运行构建或者部署。在这个配置文件中,作业应该放在顶层映射,当然要排除 Gitlab CI/CD
保留的顶层映射。
下面是一部分保留的顶层映射:
image
(作业运行的 docker 映像)
services
(其他需要在作业运行期间启动的docker映像)
before_script
(在script之前运行)
after_script
(在script之后运行)
stages
(定义阶段名称和顺序)
variables
(所有job共享的变量)
cache
(控制在CICD运行时的数据缓存)
每一个作业必须从属于一个阶段(stages
)(如果没有,默认是 test
)。阶段运行在队列里,默认的阶段队列是: build
、test
、deploy
。每一个作业都有before_script
、after_script
、variables
、cache
。在作业级别定义这些内容将会覆盖顶层配置,最终要的是变量,变量定义是一系列键值对。使用变量的语法和 bash
雷同。
下面是一些使用变量的限制:
- 变量不支持
bash
变量的扩展、置换、预设等。
- 变量不能递归或者具有赋值顺序。顶层的变量可以用于作业级别。
不能再同一个级别引用变量:
1 2 3 4
| # 不能这样做 variables: PROD_STAGE_NAME: prod PROD_URL: https://thisismywebsite.com/${PROD\_STAGE\_NAME}
|
不能递归使用:
1 2 3 4 5 6 7 8
| # 不能这样做 variables: CURRENT\_STAGE: PROD PROD\_STAGE\_NAME: prod
my\_job: variables: STAGE\_NAME: ${${CURRENT\_STAGE}\_STAGE\_NAME}
|
可以在作业中引用顶层变量:
1 2 3 4 5 6 7
| # 可以这样做 variables: PROD\_STAGE\_NAME: prod
my\_job: variables: STAGE\_NAME: ${PROD_STAGE_NAME}
|
之前提到过,作业就是在上下文中运行一个 bash
脚本。所以每个作业必须有一个 script
。默认情况下,作业会在每次提交之后运行。使用 only
、except
、when
可以控制运行的时机。
only
和 except
支持以下选项:
- 分支名称列表 例如:
master
或者 develop
- 标签名称列表
js
类型的正则表达式匹配分支和标签名称
- 特殊关键字:
api
、branches
、external
、tags
、pushes
、schedules
、triggers
、web
- 特殊的:使用
only
时,使用 branches
和 tags
设置分支或者标签,因为如果没有配置作业会在每一个分支和标签运行
- 仓库路径过滤器处理仓库forks
重要的事情:由点开始的作业会直接禁止运行。
下面是一个配置实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| variables: PROD_ACCOUNT: "1234567890" PROD_STAGE_NAME: prod PROD1_REGION: us-east-1 PROD2_REGION: us-west-2 STAGING_ACCOUNT: "0987654321" STAGING_STAGE_NAME: staging STAGING_REGION: us-east-1
.deployment_script: &deployment_script stage: deploy script: | # assume ${DEPLOYMENT\_ROLE} in AWS # install dependencies # run serverless deployment with ${STAGE_NAME}, ${REGION}, and ${ACCOUNT}
.production_variables DEPLOYMENT_ROLE: "arn:aws:iam::${PROD\_ACCOUNT}:role/gitlab-ci-deployment" STAGE\_NAME: ${PROD_STAGE_NAME} ACCOUNT: ${PROD\_ACCOUNT} PRODUCTION: "true"
deploy:production\_1: &deploy\_production <<: *deployment\_script variables: <<: *production\_variables REGION: ${PROD1_REGION} only: - tags
deploy:production_2: <<: *deploy_production variables: <<: *production_variables REGION: ${PROD2\_REGION}
deploy:staging: <<: *deployment\_script variables: DEPLOYMENT\_ROLE: "arn:aws:iam::${STAGING_ACCOUNT}:role/gitlab-ci-deployment" STAGE_NAME: ${STAGING\_STAGE\_NAME} REGION: ${STAGING_REGION} ACCOUNT: ${STAGING\_ACCOUNT} only: - master
|
引用