GitHub Actions:如何在工作流级别实现变量插值?
问题
作为GitHub Actions新手,我尝试在工作流级别的环境变量中把APPNAME插值到APPURL里,但执行后$APPNAME没有被正确替换,输出结果不符合预期。
我的工作流配置:
name: Example on: [push, workflow_dispatch] env: APPNAME: 'myapp1' APPURL: "https://mybank/$APPNAME/widgets/hello.json" jobs: test: runs-on: windows-latest steps: - name: Print variables run: | echo "APPURL is: ${{ env.APPURL }}"
执行输出:
Run echo "APPURL is: https://mybank/$APPNAME/widgets/hello.json" APPURL is: https://mybank//widgets/hello.json
请问能否在工作流级别将APPNAME变量插值到APPURL变量中?
解决方案
工作流级别的环境变量不支持直接互相插值,但可以通过以下两种方式实现需求:
1. 在Job级别定义APPURL
将APPURL移到Job的env字段中,使用GitHub Actions表达式${{ env.APPNAME }}引用工作流级别的APPNAME变量,就能完成正确插值:
name: Example on: [push, workflow_dispatch] env: APPNAME: 'myapp1' jobs: test: runs-on: windows-latest env: APPURL: "https://mybank/${{ env.APPNAME }}/widgets/hello.json" steps: - name: Print variables run: | echo "APPURL is: ${{ env.APPURL }}"
执行后会输出正确结果:
APPURL is: https://mybank/myapp1/widgets/hello.json
2. 在步骤中直接构造APPURL
如果APPURL仅在单个步骤中使用,可直接在run命令里用表达式拼接:
name: Example on: [push, workflow_dispatch] env: APPNAME: 'myapp1' jobs: test: runs-on: windows-latest steps: - name: Print variables run: | echo "APPURL is: https://mybank/${{ env.APPNAME }}/widgets/hello.json"
原因说明
工作流级别的env变量在GitHub Actions解析时,会将变量值作为原始字符串保存,不会处理其中的变量引用(比如$APPNAME)。当该字符串传递到Windows Shell中时,Shell会尝试解析$APPNAME,但此时该变量在Shell环境中未被定义,因此会被替换为空值,最终出现//的结果。而Job级别的env支持使用GitHub Actions表达式引用其他环境变量,会在Job初始化阶段完成插值。
内容的提问来源于stack exchange,提问作者Ashar
相关产品推荐
相关产品推荐

