在Github Actions中映射环境变量

17
我使用了一个策略矩阵创建了一个GitHub Actions Job,其中包含一组环境变量。其中之一是machine_architecture,它可以是32或64。
在大多数步骤中,我可以直接使用它,例如通过${{ machine_architecture }}。但有些步骤需要字符串,如'i386' vs 'x86_64'。在github actions中是否有一种简单的方法来创建可用于表达式的映射对象?
map_object = { 32: "i386", 64: 'x86_64' }
...
${{ map_object[machine_architecture] }}

如果不行,github actions中解决该问题的惯用方法是什么?
PS:我知道可以在步骤中设置环境变量,但问题是这些变量仅适用于接下来的步骤(即不能在“run-on:”标签中使用)。
4个回答

26

同时,我找到了一个解决方案:

尽管GitHub Actions没有直接创建Mappings/Objects的语法,但可以通过fromJson()间接实现:

${{ fromJson('{ 32: "i386", 64: "x86_64" }')[machine_architecture] }}

这个 fromJson() 方法将创建一个从整数到字符串的映射。下面的 [] 操作符将把 int 类型的 "machine_architecture" 解析为字符串类型。


2

我不需要矩阵,但我需要一张地图进行查找。

不能使用@PeterEvans的答案在GitHub上工作,所以我稍微改编了一下:

jobs:
  yourJobName:
    name: Cool Job
    runs-on: ubuntu-latest
    steps:
      - name: Get Machine Arc 
        run: |
          MACHINE_ARC_MAP=$(cat <<END
          {
            32: "i386", 
            64: "x86_64",
            999: ${{ secrets.SECRET_ARC }}
          }
          END
          )
          TARGET_ARC=$(echo $MACHINE_ARC_MAP | jq -r 'to_entries[] | select(.key=="${{ github.event.inputs.machine_architecture }}") | .value')
          echo "TARGET_ARC=$TARGET_ARC" >> $GITHUB_ENV
      
      - name: Echo Selected value
        run: |
          echo ${env.TARGET_VAR}

1
这里有一种使用JSON和jq的方法。它创建了步骤输出${{ steps.vars.outputs.arch }},您可以在后续步骤中使用它。
jobs:
  varMap:
    strategy:
      matrix:
        machine_architecture: [32, 64]
    runs-on: ubuntu-latest
    steps:
      - name: Set arch var
        id: vars
        run: |
          echo ::set-output name=arch::\
          $(echo '{ "32": "i386", "64": "x86_64" }' | jq -r 'to_entries[] | select(.key=="${{ matrix.machine_architecture }}") | .value')

      - name: Test arch var
        run: echo "Testing ${{ steps.vars.outputs.arch }}"

这个解决方案正是我在问题的“PS:”部分中链接的内容。但正如我在那里所描述的,我只能在以下步骤中使用vars,而不能在“steps:”部分之外(即在“runs-on:”部分)。 - mrh1997
在这种情况下,我认为您正在尝试做的事情目前不可能实现。我的理解是runs-on只能访问matrix上下文。此外,据我所知,在步骤之外计算值的方法是不存在的。 - peterevans
谢谢您。使用JSON文件和jq比尝试混合Shell测试和GitHub表达式迷你语言将矩阵轴值转换为setup-*操作所需的参数更好。唯一的细节是我发现to_entries使数据结构不必要地复杂;jq -r '.["${{ matrix.tox-env }}"]' < .github/workflows/mapping.json足以从键获取值 :) - merwok

0
你的“map_object”实际上是一个文件映射machine_architecture值到你需要的值,如下:
32=i386
64=x86_64

或者您想要保留的任何其他格式。

然后,您的工作可以将其定义为一个次要变量:

jobs:
  FirstJob:
    name: job 1
    runs-on: .....
    steps:
      - uses: ....
      - name: Define variables
        run: |
          cat $(cat MAP_OBJECT_FILE_NAME) | grep $(cat machine_architecture)= | > MACHINE_ARCHITECTURE_STRING

从那里开始,您将可以在需要的作业中使用MACHINE_ARCHITECTURE_STRING变量。当然,您可以更简单地进行连接或其他操作,但是在这里,您可以通过映射文件在代码中维护映射并且具有可扩展性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接