GitHub 操作 - 定义作业之间的工作流级别环境变量

Jam*_*mes 12 github-actions

我想在我的 Github 操作工作流中的作业之间定义和设置环境变量。下面的工作流程是我尝试过的,但不幸的是环境变量GIT_PR_SHA_SHORTE2E_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-envor::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)

  • 这第一部分并不完全正确。只要对那些顶级工作流环境变量使用 $WORKFLOW_VAR 语法,只要它在 bash/脚本执行中,我就没有问题。但是,我必须使用 ${{ env.VAR }} 样式来为导入的步骤参数或不在 bash 脚本中的其他情况提供值。 (2认同)

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)

  • 因为我刚刚又遇到了它。这是 github 解释的链接。https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-environment-variable (2认同)

cod*_*diz 6

以下是废弃后在作业之间共享变量的新方法

  • 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)