我目前有两个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 ]
其余工作流程文件相同,因此显然不是很干。
我希望有一个单一的工作流程文件,并根据分支名称以某种方式在两组变量之间切换。有没有办法做到这一点,或者我可能是从错误的角度来解决这个问题?
如果可以在一个共享的基本定义上扩展两个工作流文件,我想也可以解决这个问题。
答案 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 中的更多信息