如何根据分支机构设置工作流环境变量

时间:2020-07-27 14:26:54

标签: github environment-variables github-actions

我目前有两个GitHub动作工作流文件,它们几乎相同,只有一个配置为对分支master上的push / pull_requests做出反应,另一个在production上做出反应。

登台工作流程如下所示:

env:
  GCLOUD_PROJECT: my-project-stg
  VERCEL_TARGET: staging

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

生产工作流程如下所示:

env:
  GCLOUD_PROJECT: my-project-prd
  VERCEL_TARGET: production

on:
  push:
    branches: [ production ]
  pull_request:
    branches: [ production ]

其余工作流程文件相同,因此显然不是很干。

我希望有一个单一的工作流程文件,并根据分支名称以某种方式在两组变量之间切换。有没有办法做到这一点,或者我可能是从错误的角度来解决这个问题?

如果可以在一个共享的基本定义上扩展两个工作流文件,我想也可以解决这个问题。

3 个答案:

答案 0 :(得分:4)

无法从作业设置工作流级别的环境变量。每个作业都在自己的计算机上运行,​​并在其中设置env变量只会影响该作业的所有后续步骤。

当前有两种在作业之间共享数据的方式;您可以创建一个工件并使用它,或者声明并设置作业输出。后者适用于字符串值。

这是一个例子:

name: "Main"

on:
  push:
    branches:
      - master
      - production
  pull_request:
    branches:
      - master
      - production

jobs:
  init:
    runs-on: ubuntu-latest
    outputs:
      gcloud_project: ${{ steps.setvars.outputs.gcloud_project }}
      phase: ${{ steps.setvars.outputs.phase }}

    steps:
      - name: Cancel previous workflow
        uses: styfle/cancel-workflow-action@0.4.0
        with:
          access_token: ${{ github.token }}

      - name: Set variables
        id: setvars
        run: |
          if [[ "${{github.base_ref}}" == "master" || "${{github.ref}}" == "refs/heads/master" ]]; then
            echo "::set-output name=gcloud_project::my-project-dev"
            echo "::set-output name=phase::staging"
          fi

          if [[ "${{github.base_ref}}" == "production" || "${{github.ref}}" == "refs/heads/production" ]]; then
            echo "::set-output name=gcloud_project::my-project-prd"
            echo "::set-output name=phase::production"
          fi

  print:
    runs-on: ubuntu-latest
    needs: init
    steps:
      - name: Print
        run: echo "gcloud_project=${{needs.init.outputs.gcloud_project}}"
       

答案 1 :(得分:3)

您可以删除全局env语句,将事件触发器组合到

on:
  push:
    branches:
      - master
      - production
  pull_request:
    branches:
      - master
      - production

,然后添加第一步,检查工作流在哪个分支上运行并在那里设置环境:

      - name: Set environment for branch
        run: |
          if [[ $GITHUB_REF == 'refs/heads/master' ]]; then
              echo "GLCOUD_PROJECT=my-project-stg" >> "$GITHUB_ENV"
              echo "VERCEL_TARGET=staging" >> "$GITHUB_ENV"
          else
              echo "GLCOUD_PROJECT=my-project-prd" >> "$GITHUB_ENV"
              echo "VERCEL_TARGET=production" >> "$GITHUB_ENV"
          fi

答案 2 :(得分:0)

事情可能已经改变,但对于仍在寻找答案的任何人来说,有一种方法可以设置一个对整个工作流程可见的变量。

 jobs:
  weekday_job:
    runs-on: ubuntu-latest
    env:
      DAY_OF_WEEK: Mon

然后通过jobs.<job_id>.steps[*].env

访问

docs 中的更多信息