如何在GitHub Actions表达式语法中引用上下文值?

12

我想在GitHub Action的env:部分设置一个环境变量,并利用GitHub Actions的上下文和表达式语法。我尝试了以下方法:

jobs:
  build:
    runs-on: ubuntu-latest

    env:
      MYVAR: ${{ format('{0}:{1}', ${{ env.PATH }}, ${{ env.HOME }} ) }}

    steps:
    - name: Check environment
      run: echo $MYVAR

这将导致错误消息:

### ERRORED 10:45:52Z

- Your workflow file was invalid: The pipeline is not valid. .github/workflows/main.yml (Line: 10, Col: 14): Unexpected symbol: '${{'. Located at position 19 within expression: format('{0}:{1}', ${{ env.PATH

这个语法:

    env:
      MYVAR: ${{ format('{0}:{1}', {{ env.PATH }}, {{ env.HOME }} ) }}

导致错误的结果:

### ERRORED 13:14:18Z

- Your workflow file was invalid: The pipeline is not valid. .github/workflows/main.yml (Line: 10, Col: 14): Unexpected symbol: '{{'. Located at position 19 within expression: format('{0}:{1}', {{ env.PATH

并且:

    env:
      MYVAR: ${{ format('{0}:{1}', env.PATH, env.HOME ) }}

导致错误结果:

### ERRORED 13:16:12Z

- Your workflow file was invalid: The pipeline is not valid. .github/workflows/main.yml (Line: 10, Col: 14): Unrecognized named-value: 'env'. Located at position 19 within expression: format('{0}:{1}', env.PATH, env.HOME )

我知道如何在GitHub Actions中设置环境变量的解决方案:如何使用Bash表达式设置环境变量?如何在Github Actions中共享计算值以在作业步骤之间传递参数?,但我想了解这些表达式的语法。


1
为什么你在${{内部放置了${{?同时请注意,format采用从0开始的索引。 - jonrsharpe
因为它在 https://help.github.com/en/actions/automating-your-workflow-with-github-actions/contexts-and-expression-syntax-for-github-actions#contexts 中说明:“上下文是一种访问有关工作流程运行、运行程序环境、作业和步骤的信息的方式。上下文使用表达式语法。{{ <context> }}” - stm
2
该页面上的所有示例,包括使用上下文的示例,都没有超过一个${{}。我猜你想要${{ format('{0}:{1}', env.PATH env.HOME) }} - jonrsharpe
感谢关于0-based索引的信息,我之前没注意到。但这并没有帮助。使用您提出的语法,我得到了以下结果:“- 您的工作流文件无效:管道无效。.github/workflows/main.yml(第10行,第14列):未识别的命名值:“env”。位于表达式中的位置19:format('{0}:{1}', env.PATH, env.HOME)” - stm
你对那个新的错误信息进行过研究吗? - jonrsharpe
显示剩余3条评论
2个回答

4
在工作流开始时,env上下文还不存在,这就是为什么你会收到错误信息的原因。此外,每个工作步骤的第一步都会看到一个空的env上下文,因此即使env存在,打印MYVAR的结果也只能是:。我从运行一些实验中得出了以上结论。
env:
  MYVAR: ${{ format('{0}:{1}', env.PATH, env.HOME) }}

您最后使用的语法是正确的形式,但是由于env上下文尚不存在,工作流程无法运行。
为了证明您自己在第一步时env上下文确实为空,请尝试以下工作:
jobs
  env-dump-context:
    runs-on: ubuntu-latest
    steps:
      - run: echo env is: ${{ toJSON(env) }}

话虽如此,但你仍然可以得到你所需的:

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - run: printf "MYVAR=${PATH}:${HOME}" | tee --append "$GITHUB_ENV"
      - name: Check environment
        run: echo ${{env.MYVAR}}

3

看起来它正在内部跟踪,以便有朝一日实现。https://github.community/t/use-env-variable-for-jobs-id-runs-on-and-jobs-id-services-image/17281/3。 - goetz

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