Gitlab CI如何获取所有可用环境并实现多国家批量部署
解决方案
Gitlab CI 没有内置的全局变量直接返回项目全部可用环境列表,你可以通过调用 Gitlab 项目环境 API 结合动态子流水线(Child Pipeline)实现符合规则的多环境批量部署,完整实现步骤如下:
1. 前置权限配置
在项目「设置-访问令牌」中创建一个项目访问令牌,勾选 read_environment 权限,将生成的令牌值保存为项目 CI/CD 变量,命名为 PROJECT_ACCESS_TOKEN,记得勾选「掩码变量」选项避免令牌泄露。
2. 调整CI流水线结构
新增预生成部署任务的阶段,通过API拉取全量环境后过滤符合国家编码/$CI_COMMIT_BRANCH规则的可用环境,自动生成对应多环境的部署子流水线配置:
stages: - generate-deploy-config - deploy # 生成多环境部署配置的任务 generate-deploy-jobs: stage: generate-deploy-config image: alpine:latest before_script: - apk add --no-cache curl jq script: # 调用Gitlab API拉取项目所有可用环境,过滤符合命名规则的条目 | curl --silent --header "PRIVATE-TOKEN: $PROJECT_ACCESS_TOKEN" \ "$CI_API_V4_URL/projects/$CI_PROJECT_ID/environments?per_page=100&states=available" \ | jq -r --arg branch "$CI_COMMIT_BRANCH" '.[] | select(.name | endswith("/"+$branch)) | .name' > valid_envs.txt # 动态生成子流水线部署配置 | echo "stages: [deploy]" > deploy-jobs.yml while read env_name; do country_code=$(echo $env_name | cut -d'/' -f1) cat >> deploy-jobs.yml << EOF deploy-${country_code}: stage: deploy script: - ls \$PROJECT_URL environment: name: ${env_name} url: https://\$PROJECT_URL EOF done < valid_envs.txt artifacts: paths: - deploy-jobs.yml # 触发多环境批量部署的子流水线 trigger-multi-deploy: stage: deploy needs: - generate-deploy-jobs trigger: include: - artifact: deploy-jobs.yml job: generate-deploy-jobs strategy: depend
3. 注意事项
- 若项目环境总数超过100个,需要额外处理API分页逻辑,拉取全量环境数据
- 可根据需要在API请求参数中调整
states值,过滤掉已停止、已归档的无效环境 - 可在过滤规则中补充国家编码校验逻辑,避免匹配到不符合命名规则的其他环境
内容的提问来源于stack exchange,提问作者ValdisAglonietis
相关产品推荐
相关产品推荐

