你参考一下一个工作流程的环境变量与${{ env.VARIABLE_NAME }}
not ${VARIABLE_NAME}
。后者是 bash 语法,但这些不是 shell 环境变量,它们是workflow环境变量。它们是工作流程执行的一部分,而不是 shell 上下文的一部分。
要引用工作流环境变量:
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 }}"
(我喜欢用lower-case
对于我的工作流程环境变量,以及UPPER_CASE
对于我的 shell 环境变量,这样我就更清楚哪个是哪个。)
同样,这也行不通:
env:
GIT_PR_SHA_SHORT: "${{ env.GIT_PR_SHA:0:10 }}"
这是混合 bash 语法:0:10
使用工作流语法,但工作流变量不通过任何 shell 运行。解析工作流文件时尚未启动虚拟机,因此没有 shell 来运行。
如果您想使用 bash 表达式来操作环境,则需要创建一个运行 bash 的步骤来执行此操作,并且需要使用::set-env
or ::set-output
syntax.
那么你可以参考一个step
的输出使用${{ steps... }}
语境。
不幸的是,在之间传递东西不同的工作比较棘手,因为它们运行在不同的虚拟机上。您需要在整个工作流程本身上设置变量。你需要首先::set-output
以便它可见job,然后您可以提高从作业到工作流程的可见性。
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 }}"