【问题标题】:How to set workflow env variables depending on branch如何根据分支设置工作流环境变量
【发布时间】:2020-11-16 21:50:23
【问题描述】:

我目前有两个几乎相同的 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 ]

工作流文件的其余部分是相同的,所以这显然不是很干。

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

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

【问题讨论】:

    标签: github environment-variables github-actions


    【解决方案1】:

    现在有一种更好的方法可以使用可重用的工作流程来实现这一点:

    https://docs.github.com/en/actions/learn-github-actions/reusing-workflows

    【讨论】:

      【解决方案2】:

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

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

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

      更多信息在docs

      【讨论】:

        【解决方案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
        

        【讨论】:

        • 不错!我完全忽略了工作流命令部分。棒棒哒?
        • 不幸的是,set-env 仅适用于工作级别。您无法从其他作业访问这些变量。因此,这种方法不是工作流级别环境变量的有效替代方法。似乎 set-output 可以(ab)用于此目的。
        • @ThijsKoerselman 嗯,太糟糕了:/随意接受你自己的答案,不要难过;)
        【解决方案4】:

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

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

        这是一个例子:

        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}}"
               
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-01-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-23
          • 1970-01-01
          相关资源
          最近更新 更多