自托管GitLab CE多Job流水线手动触发配置咨询
解决方案:GitLab CI 实现手动触发assemble后自动执行后续流水线阶段
针对你提出的需求——合并请求中仅手动触发assemble(对应build-ear),之后自动运行package和deploy阶段,以下是修改后的完整配置及关键点说明:
修改后的gitlab-ci.yml
image: gradle:7.5.1-jdk17-alpine default: cache: &global_cache key: "$CI_COMMIT_REF_NAME" policy: pull-push paths: # 保留gradle缓存 - .gradle/ # 保留artifact缓存 - .m2/ # 保留所有子项目构建产物以优化重复构建 - "**/build/" stages: - compile - build - package - deploy # 特性分支和MR都会自动执行编译 compile: stage: compile script: - echo "Compiling classes for ${CI_COMMIT_REF_NAME} at ${CI_COMMIT_SHORT_SHA} ..." - gradle --build-cache -Prevision=${CI_COMMIT_SHORT_SHA} -Pdist=true --init-script init.gradle buildSubprojects # 合并请求时手动触发构建EAR包(assemble阶段) build-ear: stage: build script: - echo "Building parent EAR for ${CI_COMMIT_REF_NAME} at ${CI_COMMIT_SHORT_SHA} ..." - gradle --build-cache -Prevision=${CI_COMMIT_SHORT_SHA} -Pdist=true --init-script init.gradle buildParentEar variables: GIT_STRATEGY: fetch artifacts: # 归档EAR包,支持在K8S外进行特定测试 expire_in: 3 day expose_as: 'Download EAR' paths: ['parent/build/libs/my.ear'] rules: - if: $CI_PIPELINE_SOURCE == "merge_request_event" when: manual # 设为手动触发,仅在MR流水线中显示 allow_failure: false # 手动触发后必须成功,才能执行后续任务 # MR中build-ear成功后,自动构建并推送镜像(package阶段) build-docker-image: stage: package image: docker services: - docker:dind needs: - build-ear # 依赖build-ear,上游任务完成后自动启动 variables: GIT_STRATEGY: fetch script: # 构建镜像、推送后删除本地副本 - docker build -t "${IMAGE_NAME}" -f kubernetes/image/Dockerfile . - docker push "${IMAGE_NAME}" - docker image rm -f "${IMAGE_NAME}" rules: - if: $CI_PIPELINE_SOURCE == "merge_request_event" cache: # 继承全局缓存配置,仅拉取缓存 <<: *global_cache policy: pull # MR中镜像构建完成后,自动部署Review App(deploy阶段) deploy as review app: image: dtzar/helm-kubectl:latest stage: deploy variables: GIT_STRATEGY: fetch needs: - build-docker-image # 依赖镜像构建任务,自动运行 script: - echo "Deploying changes from branch ${CI_COMMIT_REF_NAME} to ${HELM_APP_NAME}" - DISTDIR="${distDir:-dist}" && helm --kube-context $CTX upgrade ${HELM_APP_NAME} ./kubernetes/helm --install --values=./kubernetes/helm/values.yaml --set-string "image.name=${IMAGE_NAME},hostname=${K8S_APP_URL},distDir=$DISTDIR" -n helm-charts environment: name: $REVIEW_APP_NAME url: $REVIEW_APP_URL on_stop: stop_review_environment auto_stop_in: 3 days rules: - if: $CI_PIPELINE_SOURCE == "merge_request_event" cache: [] stop_review_environment: image: dtzar/helm-kubectl:latest stage: deploy when: manual variables: GIT_STRATEGY: fetch script: - helm --kube-context $CTX uninstall $HELM_APP_NAME -n staging-helm-charts || true environment: name: $REVIEW_APP_NAME url: $REVIEW_APP_URL action: stop rules: - if: $CI_PIPELINE_SOURCE == "merge_request_event" cache: []
核心修改点说明
build-ear 任务配置
- 新增
when: manual:让这个任务仅在合并请求的流水线中显示为可手动触发的选项,不会自动运行。 - 保留
allow_failure: false:确保QA手动触发后,必须等这个任务成功完成,后续的镜像构建和部署才会启动。
- 新增
后续任务的自动触发逻辑
build-docker-image和deploy as review app都通过needs字段绑定上游任务,GitLab CI会自动监听上游任务的状态:当build-ear成功完成后,build-docker-image自动启动;镜像构建完成后,deploy as review app自动执行,全程无需QA手动干预。- 移除了
deploy as review app原有的when: manual,让它从手动任务变回自动任务。
流水线运行验证
- 特性分支提交:只有
compile自动运行,符合你的初始需求。 - 合并请求创建:
compile自动跑完后,build-ear会出现在流水线的待执行任务中;QA点击触发后,后续的镜像构建和部署会自动依次完成,生成可用的Review App供测试。
- 特性分支提交:只有
内容的提问来源于stack exchange,提问作者sprockets
相关产品推荐
相关产品推荐

