github-actions - GitHub Action - 定义作业之间的工作流级别环境变量
问题描述
我想在我的 Github Actions Workflow 中定义和设置作业之间的环境变量。下面的工作流程是我尝试过的,但不幸的是环境变量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}"
解决方案
您使用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 }}"
(我喜欢使用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
语法。
然后您可以使用上下文引用 astep
的输出。${{ steps... }}
不幸的是,在不同的作业之间传递东西比较棘手,因为它们在不同的虚拟机上运行。您需要在整个工作流程本身上设置变量。您需要首先::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 }}"
推荐阅读
- python - Qt 设计器和无框窗口
- java - 带有 syso.printf 的 Java 输出字符串变量
- php - 将 PHP 与 Wordpress 一起使用
- reactjs - 如何在 React Native 中使用条件常量
- android - 防止重建上一页以在单独的页面中使用相同的底部导航在颤动中
- oracle - 如何查询同一列日期之间的日期差异?
- node.js - Handlebars 未显示数组内对象的元素
- skype - 如何在 linux 中下载 Skype 录制的会话?
- google-cloud-platform - 在哪里可以找到 Google Cloud Platform API 日志
- javascript - 如何在另一个文件中使用类的实例?