在Github Actions中映射环境变量

时间:2020-02-14 11:54:07

标签: github-actions

我使用策略矩阵创建了GitHub Actions作业,该矩阵创建了一组环境变量。 其中之一是machine_architecture,可以是32或64。

在大多数步骤中,我都可以直接使用它,即通过${{ machine_architecture }}。 但是某些步骤需要使用诸如“ i386”和“ x86_64”之类的字符串。 github动作中是否有一种简单的方法来创建可在表达式中使用的地图对象:

map_object = { 32: "i386", 64: 'x86_64' }
...
${{ map_object[machine_architecture] }}

如果没有,github动作中解决该问题的惯用方式是什么?

PS:我知道我可以set environment variables in steps,但是问题是,这些变量仅可用于以下步骤(即,不适用于“ run-on:”标记)

3 个答案:

答案 0 :(得分:0)

“ map_object”实际上是一个将rails routes值映射到所需值的文件,例如:

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 变量可用于所需的作业。当然,您可以执行更简单的串联操作或其他任何操作,但是在这里,您可以使用映射文件在代码中维护映射并且可以升级。

答案 1 :(得分:0)

这是使用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 }}"

答案 2 :(得分:0)

与此同时,我找到了解决方案:

尽管GitHub Actions没有直接创建映射/对象的语法,但可以使用fromJson()间接完成:

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

此fromJson()将创建从int到字符串的映射。以下[]运算符将int类型“ machine_architecture”解析为字符串类型。