在 GitLab CI/CD 中定义一个 Job(任务)是通过编写 .gitlab-ci.yml
配置文件实现的。以下是 定义 Job 的完整指南,包含基础语法、关键参数和实际示例:
一、Job 的基本结构
每个 Job 需要包含:
- 唯一名称(不能重复)
script
指令(必需,定义要执行的命令)
job_name: # Job名称(自定义,如 build、test)
script: # 必需:执行的命令
- echo "Hello World"
二、Job 的核心配置项
1. 关联阶段(stage
)
- 指定 Job 属于哪个阶段(需先定义
stages
)
stages:
- build
- test
build_job: # 属于 build 阶段
stage: build
script: make build
2. 执行条件(rules
或 only/except
)
- 推荐用
rules
(更灵活):
deploy_job:
script: ./deploy.sh
rules:
- if: $CI_COMMIT_BRANCH == "main" # 仅 main 分支执行
when: manual # 手动触发
- when: never # 其他情况跳过
3. 依赖其他 Job(needs
)
- 跳过阶段顺序限制,直接依赖指定 Job:
test_job:
needs: ["build_job"] # 依赖 build_job 完成
script: npm test
4. 运行环境(image
和 services
)
- 指定 Docker 镜像和依赖服务:
test_job:
image: python:3.9 # 使用 Python 镜像
services:
- postgres:14 # 启动 PostgreSQL 服务
script: pytest
三、Job 的高级配置
1. 并行执行(parallel
)
test_job:
parallel: 5 # 启动 5 个并行实例
script: ./test.sh
2. 重试机制(retry
)
flakey_job:
script: ./flakey-script.sh
retry:
max: 2 # 最多重试 2 次
when: runner_system_failure # 仅在系统错误时重试
3. 超时控制(timeout
)
long_job:
script: ./long-task.sh
timeout: 1 hour # 设置超时时间
4. 缓存与制品(cache
/artifacts
)
build_job:
script: npm install && npm run build
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- node_modules/ # 缓存依赖
artifacts:
paths:
- dist/ # 传递给后续 Job
expire_in: 1 week # 制品保留时间
5. 环境变量(variables
)
deploy_job:
variables:
ENV: "production" # 定义 Job 级变量
script: echo "Deploying to $ENV"
四、Job 生命周期控制
1. 前置/后置脚本(before_script
/after_script
)
job:
before_script:
- echo "Job 开始时间: $(date)"
script:
- echo "主任务执行"
after_script:
- echo "Job 结束时间: $(date)"
2. 人工干预(when: manual
)
deploy_prod:
script: ./deploy.sh
when: manual # 需手动点击执行
3. 允许失败(allow_failure
)
notify_job:
script: ./notify.sh
allow_failure: true # 失败不影响 Pipeline 状态
五、完整 Job 示例
stages:
- build
- test
- deploy
build_android:
stage: build
image: android-sdk:latest
script:
- ./gradlew assembleDebug
artifacts:
paths:
- app/build/outputs/apk/
rules:
- if: $CI_COMMIT_BRANCH == "main"
run_tests:
stage: test
needs: ["build_android"] # 依赖 build_android
image: ubuntu:22.04
script:
- apt-get update && apt-get install -y python3
- python3 -m pytest
parallel: 3 # 并行运行 3 个实例
deploy_staging:
stage: deploy
variables:
TARGET: "staging"
script: ./deploy.sh $TARGET
when: manual # 手动触发
六、最佳实践
- 命名规范:使用
小写_蛇形命名
(如build_android
) - 单一职责:每个 Job 只完成一个明确任务
- 资源控制:为计算密集型 Job 指定特定 Runner 标签:
job: tags: - docker-heavy # 使用标记为 docker-heavy 的 Runner
- 调试技巧:在脚本中添加
set -x
显示详细执行日志:script: - set -x # 开启调试模式 - ./your_script.sh
通过合理组合这些配置,可以构建出高效、稳定的 CI/CD Job!