GitLab子流水线向父流水线传值咨询,monorepo多包构建后用helmfile部署
实现方案
GitLab CI 支持通过 dotenv 制品报告 实现父子流水线之间的变量传递,这是目前最简便的实现方式,具体修改步骤如下:
1. 修改子流水线配置 .gitlab/ci/packages/package-gitlab-ci.yml
需要将你需要传递的参数(docker tag、chart版本等)按照dotenv格式输出,并且声明为dotenv类型的制品:
stages: - bootstrap - validate cache: key: "${PACKAGE}_${CI_COMMIT_REF_SLUG}" paths: - packages/${PACKAGE}/node_modules/ policy: pull install-package: stage: bootstrap script: # 修正原配置多余的右大括号 - echo ${PACKAGE} # 生成带包名前缀的变量,避免多个包变量冲突 - PACKAGE_UPPER=$(echo ${PACKAGE} | tr 'a-z' 'A-Z') # 按你的实际需求替换变量值,示例为生成docker tag和chart版本 - echo "${PACKAGE_UPPER}_DOCKER_TAG=registry.example.com/${PACKAGE}:${CI_COMMIT_SHORT_SHA}" >> ${PACKAGE}.env - echo "${PACKAGE_UPPER}_CHART_VERSION=1.0.0-${CI_COMMIT_SHORT_SHA}" >> ${PACKAGE}.env - cd packages/${PACKAGE}/ - yarn install --frozen-lockfile artifacts: # 声明dotenv类型制品,变量会自动向上游传递 reports: dotenv: ${PACKAGE}.env cache: key: "${PACKAGE}_${CI_COMMIT_REF_SLUG}" paths: - packages/${PACKAGE}/node_modules/ policy: pull-push lint-package: script: - yarn lint stage: validate needs: [install-package] before_script: - cd packages/${PACKAGE}/
2. 修改父流水线配置 .gitlab-ci.yml
部署阶段的作业需要关联所有trigger子流水线的作业,拉取子流水线生成的dotenv制品:
--- trigger-package-a: stage: build trigger: include: .gitlab/ci/packages/package-gitlab-ci.yml strategy: depend rules: - changes: - "packages/package-a/**/*" variables: PACKAGE: package-a trigger-package-b: stage: build trigger: include: .gitlab/ci/packages/package-gitlab-ci.yml strategy: depend rules: - changes: - "packages/package-b/**/*" variables: PACKAGE: package-b done_job: stage: deploy needs: # 关联所有trigger作业,拉取制品,optional保证对应包未变更时作业仍能正常执行 - job: trigger-package-a artifacts: true optional: true - job: trigger-package-b artifacts: true optional: true script: - echo "DONE" # 可直接使用子流水线传递的变量 - echo "package-a的docker镜像地址为 $PACKAGE_A_DOCKER_TAG" - echo "package-a的chart版本为 $PACKAGE_A_CHART_VERSION" - echo "package-b的docker镜像地址为 $PACKAGE_B_DOCKER_TAG" - echo "package-b的chart版本为 $PACKAGE_B_CHART_VERSION" # 后续执行helmfile部署逻辑即可 stages: - build - deploy
注意事项
- 该方案要求GitLab版本 >= 13.10,低版本GitLab可以通过
CI_JOB_TOKEN调用GitLab Open API手动将子流水线变量写入父流水线的流水线变量实现传递 - 子流水线输出变量时加上包名前缀可以避免多个包的变量名冲突,如果你需要传递更复杂的结构,可以将json内容写入带包名区分的文件,作为普通制品上传,父流水线拉取后自行解析即可
内容的提问来源于stack exchange,提问作者MoShe
相关产品推荐
相关产品推荐

