You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自托管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: []

核心修改点说明

  1. build-ear 任务配置

    • 新增when: manual:让这个任务仅在合并请求的流水线中显示为可手动触发的选项,不会自动运行。
    • 保留allow_failure: false:确保QA手动触发后,必须等这个任务成功完成,后续的镜像构建和部署才会启动。
  2. 后续任务的自动触发逻辑

    • 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,让它从手动任务变回自动任务。
  3. 流水线运行验证

    • 特性分支提交:只有compile自动运行,符合你的初始需求。
    • 合并请求创建:compile自动跑完后,build-ear会出现在流水线的待执行任务中;QA点击触发后,后续的镜像构建和部署会自动依次完成,生成可用的Review App供测试。

内容的提问来源于stack exchange,提问作者sprockets

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 20:39:55