我使用策略矩阵创建了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:”标记)
答案 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”解析为字符串类型。