Gitlab CI规则:如何基于Environment状态设置作业执行方式?
需求实现方案
这个需求是可以实现的,核心思路是通过GitLab API查询目标环境的运行状态,将状态结果作为变量传递给部署作业,再通过规则判断是否自动执行。以下是具体配置方案:
步骤1:添加前置作业查询环境状态
新增一个.pre阶段的作业,用于查询目标环境的状态,并将结果保存为环境变量供后续作业使用:
check_environment_status: stage: .pre script: - | # 定义目标环境名称 ENVIRONMENT_NAME="branch/$CI_COMMIT_REF_SLUG" # 编码环境名称以适配URL格式 ENCODED_ENV_NAME=$(echo "$ENVIRONMENT_NAME" | sed 's/%/%25/g; s/\//%2F/g') # 调用GitLab API获取环境信息 ENV_RESPONSE=$(curl --silent --header "JOB-TOKEN: $CI_JOB_TOKEN" "$CI_API_V4_URL/projects/$CI_PROJECT_ID/environments?name=$ENCODED_ENV_NAME") # 解析环境状态(默认设为stopped) ENV_STATUS=$(echo "$ENV_RESPONSE" | jq -r '.[0].state // "stopped"') # 将状态写入环境变量文件 if [ "$ENV_STATUS" = "available" ]; then echo "ENVIRONMENT_RUNNING=true" > environment_status.env else echo "ENVIRONMENT_RUNNING=false" > environment_status.env fi artifacts: reports: dotenv: environment_status.env # 为runner安装依赖工具(适用于Debian/Ubuntu系) before_script: - apt-get update && apt-get install -y curl jq
步骤2:修改deploy_branch作业规则
更新deploy_branch的规则,基于前置作业传递的ENVIRONMENT_RUNNING变量判断执行方式:
deploy_branch: stage: branch script: - echo "Deploy branch ${CI_COMMIT_REF_SLUG}" rules: - if: $ENVIRONMENT_RUNNING == "true" when: always - when: manual environment: name: branch/$CI_COMMIT_REF_SLUG url: https://$CI_COMMIT_REF_SLUG.dev.example.com/ deployment_tier: development on_stop: stop_branch auto_stop_in: 2 days needs: [check_environment_status] # 依赖前置作业的环境变量结果
注意事项
- 权限配置:确保
CI_JOB_TOKEN具备读取项目环境的权限,可在项目设置的「CI/CD」→「权限」中开启「允许作业访问项目令牌」。 - 工具适配:若使用Alpine系统的runner,需将依赖安装命令改为
apk add curl jq。 - 状态判断:GitLab环境的状态包括
available(运行中)、stopped(已停止)、preparing等,这里仅以available作为运行状态的判断依据,可根据需求调整。
内容的提问来源于stack exchange,提问作者Rainer Jung
相关产品推荐
相关产品推荐

