【问题标题】:Map an environment variable in Github Actions在 Github Actions 中映射环境变量
【发布时间】:2020-02-14 11:54:07
【问题描述】:

我创建了一个 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:”标签)

【问题讨论】:

    标签: github-actions


    【解决方案1】:

    同时我找到了解决办法:

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

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

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

    【讨论】:

      【解决方案2】:

      这是一种使用 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:”部分中链接的。但正如我在那里描述的那样,我只能在以下步骤中使用变量,而不是在“步骤:”部分之外(即在“运行:”部分)
      • 在那种情况下,我认为你正在尝试做的是,不幸的是,目前不可能。我的理解是runs-on 只能访问matrix context。此外,据我所知,没有办法在步骤之外计算值。
      • 感谢您,事实证明,使用 JSON 文件和 jq 比尝试混合 shell 测试和 github 表达式迷你语言来将矩阵轴值转换为 setup-* 操作所需的参数更好。唯一的细节是我发现to_entries 不必要地使数据结构复杂化; jq -r '.["${{ matrix.tox-env }}"]' < .github/workflows/mapping.json 足以从键中获取值:)
      【解决方案3】:

      您的“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 变量。当然,您可以进行更简单的连接或其他操作,但在这里您可以使用映射文件维护代码中的映射并且是可扩展的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-20
        • 2022-10-23
        • 2020-04-20
        • 2020-10-03
        • 2021-03-30
        • 2022-11-11
        • 2020-03-03
        • 2021-09-16
        相关资源
        最近更新 更多