我想在我的 Github 操作工作流中的作业之间定义和设置环境变量。下面的工作流程是我尝试过的,但不幸的是环境变量GIT_PR_SHA_SHORT和E2E_GIT_PR_SHA不起作用。
是否可以?
name: Git Pull Request Workflow
on:
workflow_dispatch:
pull_request:
branches:
- master
env:
GIT_PR_SHA: ${{github.event.pull_request.head.sha}}
GIT_PR_SHA_SHORT: "${{ env.GIT_PR_SHA:0:10 }}"
ENV_NAME: test
E2E_GIT_PR_SHA: "${{ env.ENV_NAME }}-${{ env.GIT_PR_SHA_SHORT }}"
jobs:
first-job:
name: Build Docker Image
runs-on: ubuntu-latest
steps:
- name: First Echo Step
run: |
echo "GIT_PR_SHA_SHORT = ${GIT_PR_SHA_SHORT}"
echo "E2E_GIT_PR_SHA = ${E2E_GIT_PR_SHA}"
second-job:
name: Build Docker Image
runs-on: ubuntu-latest
steps:
- name: Second Echo Step
run: |
echo "GIT_PR_SHA_SHORT = ${GIT_PR_SHA_SHORT}"
echo "E2E_GIT_PR_SHA = ${E2E_GIT_PR_SHA}"
Run Code Online (Sandbox Code Playgroud)
Edw*_*son 13
您使用not引用工作流的环境变量。后者是 bash 语法,但这些不是 shell 环境变量,它们是工作流环境变量。它们是工作流执行的一部分,而不是 shell 上下文的一部分。${{ env.VARIABLE_NAME }}
${VARIABLE_NAME}
要引用工作流环境变量:
name: Git Pull Request Workflow
on:
workflow_dispatch:
pull_request:
branches:
- master
env:
one: 1
two: zwei
three: tres
jobs:
first-job:
runs-on: ubuntu-latest
steps:
- run: |
echo "${{ env.one }}"
echo "${{ env.two }}"
echo "${{ env.three }}"
Run Code Online (Sandbox Code Playgroud)
(我喜欢lower-case
用于我的工作流环境变量和UPPER_CASE
我的 shell 环境变量,以便我更清楚哪个是哪个。)
同样,这不起作用:
env:
GIT_PR_SHA_SHORT: "${{ env.GIT_PR_SHA:0:10 }}"
Run Code Online (Sandbox Code Playgroud)
这是将 bash 语法:0:10
与工作流语法混合在一起,但工作流变量不通过任何 shell 运行。解析工作流文件时没有启动虚拟机,因此没有外壳来运行。
如果您想使用 bash 表达式来操作环境,您需要创建一个运行 bash 的步骤来执行此操作,并且您需要使用::set-env
or::set-output
语法。
然后您可以step
使用${{ steps... }}
上下文引用 a的输出。
不幸的是,在不同的作业之间传递东西比较棘手,因为它们运行在不同的虚拟机上。您需要在整个工作流程本身上设置变量。您首先需要使其::set-output
对作业可见,然后您可以将可见性从作业提高到工作流。
name: Demonstration
on:
push:
branches: [master]
jobs:
first-job:
runs-on: ubuntu-latest
steps:
- id: identify
run: |
# use bash variable expression to get the substring
export GIT_PR_SHA="${{ github.sha }}"
export GIT_PR_SHA_SHORT="${GIT_PR_SHA:0:10}"
echo "::set-output name=git_pr_sha::${GIT_PR_SHA}"
echo "::set-output name=git_pr_sha_short::${GIT_PR_SHA_SHORT}"
outputs:
git_pr_sha: ${{ steps.identify.outputs.git_pr_sha }}
git_pr_sha_short: ${{ steps.identify.outputs.git_pr_sha_short }}
second-job:
needs: first-job
runs-on: ubuntu-latest
steps:
- run: |
echo "${{ needs.first-job.outputs.git_pr_sha }}"
echo "${{ needs.first-job.outputs.git_pr_sha_short }}"
Run Code Online (Sandbox Code Playgroud)
dra*_*ipz 10
我想为此添加一个扩展,因为我在寻找如何计算和设置多步骤使用的环境变量方面也遇到了类似的困难。
下面是一个基本示例,说明如果需要处理来计算环境变量以供以后使用,如何从一个步骤内推回到 github 环境。您还可以以同样的方式更新现有变量,而不仅仅是创建新变量。
name: minimal variable example
on:
push:
env:
MAJOR: "1"
MINOR: "0"
PATCH: "1"
jobs:
vars-example:
runs-on: ubuntu-latest
steps:
- name: only available local variable
run: LOCAL_VERSION=${MAJOR}.${MINOR}.${PATCH}
- name: available across multiple steps
run: echo "GLOBAL_VERSION=${MAJOR}.${MINOR}.${PATCH}" >> $GITHUB_ENV
- name: Vars
run: |
echo LOCAL_VERSION = $LOCAL_VERSION
echo GLOBAL_VERSION = $GLOBAL_VERSION
Run Code Online (Sandbox Code Playgroud)
这导致 Vars 输出为
echo LOCAL_VERSION = $LOCAL_VERSION
echo GLOBAL_VERSION = $GLOBAL_VERSION
shell: /usr/bin/bash -e {0}
env:
MAJOR: 1
MINOR: 0
PATCH: 1
GLOBAL_VERSION: 1.0.1
LOCAL_VERSION =
GLOBAL_VERSION = 1.0.1
Run Code Online (Sandbox Code Playgroud)
value
还介绍了本身是变量并且需要在运行时计算的情况。master
当推送分支时,将调用以下内容name: Sharing envs across jobs
on:
push:
branches: ['master']
env:
one: onevalue
two: twovalue
three: threevalue
jobs:
job0:
runs-on: ubuntu-latest
steps:
- run: |
echo "${{ env.one }}"
echo "${{ env.two }}"
echo "${{ env.three }}"
job1:
runs-on: ubuntu-latest
# Map a step output to a job output
outputs:
output1: ${{ steps.step1.outputs.test }}
output2: ${{ steps.step2.outputs.test }}
steps:
- id: step1
run: echo "test=$(date +"%d-%m-%Y")-asdfads223" >> $GITHUB_OUTPUT
- id: step2
run: echo "test=world" >> $GITHUB_OUTPUT
job2:
runs-on: ubuntu-latest
needs: job1
steps:
- run: echo ${{needs.job1.outputs.output1}} ${{needs.job1.outputs.output2}}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4607 次 |
最近记录: |