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

如何用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,或者内部根据参数自动匹配:

  1. 可复用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 }}"
  1. 主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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 13:36:30