GitLab CI/CD脚本入门
工作中第一次用到gitlab自带的cicd, 记录一下备忘
GitLab CI/CD 配置文件 (.gitlab-ci.yml
) 中有许多关键字,用于定义不同的行为和阶段。以下是一些常见且重要的关键字:
全局和 job 特定关键字
-
image
指定运行 CI job 时的 Docker 镜像。image: node:16
-
services
为 job 提供的额外的服务容器,如数据库或缓存服务。services: - postgres:latest
-
stages
定义 job 的阶段,例如build
、test
、deploy
等。stages: - build - test - deploy
-
script
定义 job 中实际执行的命令。script: - npm install - npm run test
-
after_script
在 job 结束后执行的命令(无论成功与否)。after_script: - echo "This runs after the job finishes"
-
only
/except
用于控制 job 在特定的分支或提交时执行。only: - master - tags except: - develop
-
variables
定义环境变量,支持全局和 job 级别。variables: NODE_ENV: "production"
-
cache
缓存依赖文件或其他生成的文件,以加速后续的 pipeline 执行。cache: paths: - node_modules/
-
artifacts
定义 job 生成的工件,能够在 pipeline 的后续 job 中使用。artifacts: paths: - build/
-
dependencies
明确指出某个 job 依赖于哪个前面的 job 的artifacts
。dependencies: - build_job
其他常用关键字
-
before_script
在script
执行之前运行的命令。 -
stage
定义 job 属于哪个阶段,必须与stages
中的值对应。stage: build
-
retry
当 job 失败时自动重试的次数。retry: 2
-
timeout
指定 job 最大运行时间,超时后自动失败。timeout: 20m
-
tags
用于指定在哪些 GitLab Runner 上运行 job,通常用于选择特定的 runner。tags: - docker
-
allow_failure
允许某个 job 失败,不会导致整个 pipeline 失败。allow_failure: true
-
when
控制 job 在何时执行,默认是on_success
,可以设置为manual
、always
等。when: manual
-
extends
允许从预定义的 job 模板或设置中继承配置。.base_job: script: - echo "Base job" my_job: extends: .base_job
文件示例
下面是一个包含尽可能多关键字和功能的标准 GitLab CI/CD 配置文件示例,展示了如何使用多个关键字来管理和优化 CI/CD 流程。这个例子展示了从代码构建、测试、缓存、工件管理到自动部署等多方面的功能。
# 全局配置
stages: # 定义各个阶段
- setup
- build
- test
- deploy
variables: # 全局变量设置
NODE_ENV: "development"
PACKAGE_VERSION: "1.0.0"
GIT_SUBMODULE_STRATEGY: "recursive" # 设置git子模块策略
before_script: # 全局的before_script,适用于所有job
- echo "Setting up the environment"
- apt-get update -y
- apt-get install -y python3-pip
# Cache设置,适用于所有的job
cache:
paths:
- node_modules/
- .cache/pip
setup_job: # setup 阶段的 job
stage: setup
image: node:16
script:
- npm install
artifacts:
paths:
- node_modules/
build_job: # build 阶段的 job
stage: build
image: node:16
script:
- npm run build
artifacts:
paths:
- dist/
expire_in: 1 week # 设置 artifacts 的过期时间
test_job: # test 阶段的 job
stage: test
image: node:16
dependencies: # 声明依赖于 build_job 的 artifacts
- build_job
script:
- npm run test
cache: # 局部 cache 配置,覆盖全局配置
paths:
- .cache/
test_python: # 另一个 test 阶段的 job,用 Python 执行测试
stage: test
image: python:3.9
script:
- pip install -r requirements.txt
- pytest
artifacts:
paths:
- test-reports/
reports:
junit: test-reports/report.xml # 生成 JUnit 格式的测试报告
manual_deploy: # deploy 阶段的 job,手动执行
stage: deploy
script:
- echo "Deploying to production server..."
when: manual # 手动触发
only:
- master
auto_deploy: # 自动部署,允许失败
stage: deploy
script:
- echo "Deploying to staging server..."
environment: # 设置环境变量
name: staging
url: https://staging.example.com
allow_failure: true # 部署失败不影响 pipeline 成功状态
pages: # 使用 GitLab Pages 部署静态站点
stage: deploy
script:
- echo "Building static pages"
- mkdir .public
- echo "<html><body><h1>My Project</h1></body></html>" > .public/index.html
artifacts:
paths:
- .public
only:
- master
retry_example: # 设置失败后自动重试
stage: test
script:
- echo "This will retry on failure"
- exit 1
retry: 2 # 失败时重试2次
timeout_example: # 设置超时
stage: test
script:
- echo "This job has a timeout"
- sleep 120
timeout: 1m # 超时时间1分钟
# 使用extends继承配置
.base_job_template: # 定义一个基础job模板
image: alpine:latest
before_script:
- echo "This is before script from base template"
script:
- echo "Running from base template"
my_extended_job:
extends: .base_job_template # 继承模板
script:
- echo "This is an extended job"
# Docker in Docker 服务示例
docker_build:
stage: build
image: docker:latest
services:
- docker:dind # 使用 Docker in Docker
script:
- docker build -t myapp .
only_master_branch: # 只在 master 分支上运行的 job
stage: test
script:
- echo "This runs only on the master branch"
only:
- master
except_develop_branch: # 除了 develop 分支外,所有分支都运行的 job
stage: test
script:
- echo "This runs on all branches except develop"
except:
- develop
文件说明:
-
全局设置:
stages
:定义 CI/CD 流水线的不同阶段。variables
:定义全局变量。before_script
:全局的前置脚本,适用于所有 job。cache
:全局的缓存配置,指定缓存的目录。
-
job 示例:
setup_job
:安装依赖并缓存node_modules/
。build_job
:构建项目,并将构建产物存储为 artifacts。test_job
和test_python
:分别测试 JavaScript 和 Python 项目,生成 JUnit 格式报告。
-
部署:
manual_deploy
:手动触发部署,仅在master
分支上执行。auto_deploy
:自动部署至staging
环境,允许失败。pages
:通过 GitLab Pages 部署静态站点。
-
特殊功能:
retry_example
:在 job 失败时自动重试两次。timeout_example
:设置了超时时间为1分钟的 job。my_extended_job
:演示了如何使用extends
关键字继承另一个 job 模板。docker_build
:使用docker:dind
服务运行 Docker in Docker。
-
条件执行:
only_master_branch
:仅在master
分支上运行。except_develop_branch
:除develop
分支外在所有分支上运行。
这个 .gitlab-ci.yml
文件展示了 GitLab CI/CD 的广泛功能,几乎涵盖了实际使用中常见的场景。你可以根据项目需求定制每个 job 和关键字的使用。