您使用 ${{ env.VARIABLE_NAME }}
而不是 ${VARIABLE_NAME}
来引用工作流的环境变量。后者是bash语法,但这些不是shell环境变量,它们是工作流环境变量。它们是工作流执行的一部分,而不是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 }}"
(我喜欢在我的工作流环境变量中使用小写,而在我的shell环境变量中使用大写,这样我就可以更清楚地区分它们。)
同样,这是行不通的:
env:
GIT_PR_SHA_SHORT: "${{ env.GIT_PR_SHA:0:10 }}"
这里将bash语法:0:10
与工作流语法混合使用,但工作流变量没有通过任何shell运行。在解析工作流文件时没有启动虚拟机,因此没有Shell可以运行。
如果您想使用bash表达式来操作环境,您需要创建一个步骤来运行bash,并且需要使用::set-env
或::set-output
语法。
然后,您可以使用${{ steps... }}
上下文引用step
的输出。
不幸的是,在不同的作业之间传递东西更加棘手,因为它们在不同的虚拟机上运行。您需要在整个工作流程本身上设置变量。您需要首先使用::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 }}"
set-output
作为变量共享的一种方式,那么如果第一个作业是支持矩阵的作业,我们该怎么办? - Memphis Mengset-output
和set-state
将被移除。替代方案是echo "key=value" >> $GITHUB_OUTPUT
。更多信息请参见 https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/。 - Tuan Chau