如何用GitHub Actions实现单构建多环境分阶段部署?
问题与解决方案
已有配置
我有一个包含Build和Deploy两个job的简单workflow:
name: build on: push: branches: [ master, ci ] pull_request: branches: [ master ] jobs: build: runs-on: ubuntu-latest steps: - .... deploy: runs-on: ubuntu-latest needs: [build] steps: - ...
需求
我想复用deploy job,分两次运行,分别传入不同参数、设置不同触发规则:
- 传参
path: beta:构建完成后自动触发 - 传参
path: production:仅手动触发,且需要审核
求最简实现方式。
已尝试操作
我把deploy job提取到可复用workflow文件里,加上environment配置后报错:
The workflow is not valid. .github/workflows/cd.yml (Line: 68, Col: 5): Unexpected value 'environment'
尝试的配置代码:
name: build on: push: branches: [ master, ci ] pull_request: branches: [ master ] jobs: build: runs-on: ubuntu-latest steps: - ... deploy-beta: uses: './.github/workflows/deploy_reusable.yml' with: path: 'beta/' needs: [build] deploy-production: uses: './.github/workflows/deploy_reusable.yml' with: path: 'production/' needs: [build] environment: name: production
解决方案
你出错的原因是在调用可复用workflow的job里直接写environment字段不被GitHub Actions允许,这个字段不能直接加在uses引用的job层级,以下是两种可行的最简实现方式:
方式一:用Job模板(最简洁,无需额外文件)
直接在当前workflow里定义deploy的模板,实例化时分别配置参数、触发条件和environment:
name: build on: push: branches: [ master, ci ] pull_request: branches: [ master ] workflow_dispatch: # 开启手动触发,用于生产部署 jobs: build: runs-on: ubuntu-latest steps: - name: 执行构建 run: echo "这里写你的构建逻辑" # 定义deploy模板,用YAML锚点实现复用 .deploy-template: &deploy-template runs-on: ubuntu-latest needs: [build] steps: - name: 执行部署 run: echo "部署到路径 ${{ inputs.path }}" # 部署beta环境:自动触发 deploy-beta: <<: *deploy-template inputs: path: 'beta/' # 只在push事件触发时运行 if: github.event_name == 'push' # 部署生产环境:手动触发+审核 deploy-production: <<: *deploy-template inputs: path: 'production/' # 只在手动触发时运行 if: github.event_name == 'workflow_dispatch' environment: name: production required_approvers: [你的GitHub用户名] # 可选,设置需要审核的人
方式二:修正可复用Workflow配置
如果一定要用可复用workflow,得在可复用文件里声明允许传入environment,或者内部根据参数自动匹配:
- 可复用workflow文件
.github/workflows/deploy_reusable.yml:
name: 可复用部署流程 on: workflow_call: inputs: path: required: true type: string # 声明允许调用方指定environment environments: production: required: false jobs: deploy: runs-on: ubuntu-latest # 根据传入的path自动设置environment environment: ${{ inputs.path == 'production/' && 'production' || '' }} steps: - name: 部署到指定路径 run: echo "部署到 ${{ inputs.path }}"
- 主workflow调用代码:
name: build on: push: branches: [ master, ci ] pull_request: branches: [ master ] workflow_dispatch: jobs: build: runs-on: ubuntu-latest steps: - ... deploy-beta: uses: './.github/workflows/deploy_reusable.yml' with: path: 'beta/' needs: [build] if: github.event_name == 'push' deploy-production: uses: './.github/workflows/deploy_reusable.yml' with: path: 'production/' needs: [build] if: github.event_name == 'workflow_dispatch' environment: production
关键提示
- 手动触发靠
workflow_dispatch事件实现,在GitHub仓库的Actions页面就能手动运行 - 生产环境的审核需要先在仓库设置的「Environments」里创建production环境,配置好审核规则
- 简单场景优先用Job模板,不用额外文件,维护更省事;如果多个workflow都要用到部署逻辑,再用可复用workflow
内容的提问来源于stack exchange,提问作者Liero
相关产品推荐
相关产品推荐

