环境变量并不总是在 GitHub Actions 工作流文件中展开

Posted

技术标签:

【中文标题】环境变量并不总是在 GitHub Actions 工作流文件中展开【英文标题】:Environment variables not always being expanded in GitHub Actions workflow file 【发布时间】:2021-10-18 20:39:23 【问题描述】:

我有一个 GitHub Actions 工作流文件,其中并不总是扩展环境变量。

根据 cmets,环境变量的使用可以正常工作,直到它在 name: deploy 部分中的最后一次使用,它不会扩展并从字面上变成字符串 rg-blue-$***GITHUB_REF#refs/heads/***,而不是它所在的正确扩展的字符串前几节:rg-blue-my-branch-name.

这会导致 Azure ARM 错误:Error: Resource Group rg-blue-$***GITHUB_REF#refs/heads/*** could not be found.

为什么除了最后一步之外,变量扩展在任何地方都能正常工作?我该如何解决?

on: [push]
name: Azure ARM
jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    env:
      resourceGroupName: rg-blue-$GITHUB_REF#refs/heads/
      resourceGroupLocation: 'uksouth'

    - name: Use the custom ENV variable
      run: |
        echo "$ env.resourceGroupName"
        echo $ env.resourceGroupName
      // these two work perfectly fine and prints "rg-blue-my-branch-name" etc

    - uses: actions/checkout@master

    - uses: azure/login@v1
      with:
        creds: $ secrets.AZURE_CREDENTIALS 

    - uses: azure/CLI@v1
      with:
        inlineScript: |
          #!/bin/bash
          
    // works perfectly fine here too
          if $(az group exists --name $ env.resourceGroupName ) ; then
            echo "Azure resource group $ env.resourceGroupName  already exists, skipping creation..."
          else
            az group create --name $ env.resourceGroupName  --location $ env.resourceGroupLocation 
            echo "Azure resource group $ env.resourceGroupName  created"
          fi

      # Deploy Bicep file
    - name: deploy
      uses: azure/arm-deploy@v1
      with:
        subscriptionId: $ secrets.AZURE_SUBSCRIPTION      <- this one works fine!
        resourceGroupName: "$ env.resourceGroupName "     <- Error: Resource Group rg-blue-$***GITHUB_REF#refs/heads/*** could not be found.
        template: infrastructure/blue.bicep
        parameters: storagePrefix=mystore
        failOnStdErr: false

【问题讨论】:

【参考方案1】:

在 YAML 中分配值时不会发生 Shell 参数扩展。也就是说,在这之后

    env:
      resourceGroupName: rg-blue-$GITHUB_REF#refs/heads/

resourceGroupName 的值是字符串rg-blue-$GITHUB_REF#refs/heads/。它似乎可以工作,因为当您使用时

echo "$ env.resourceGroupName"

替换为

echo "rg-blue-$GITHUB_REF#refs/heads/"

然后 shell 进行扩展。您可以使用

进行测试
echo '$ env.resourceGroupName'

而不是抑制shell参数扩展。

要修复,您可以使用单独的步骤来正确设置环境变量:

    - name: Set env variable
      run: |
        echo "resourceGroupName=$GITHUB_REF#refs/heads/" >> "$GITHUB_ENV"

而不是事先在env 中设置。

【讨论】:

以上是关于环境变量并不总是在 GitHub Actions 工作流文件中展开的主要内容,如果未能解决你的问题,请参考以下文章

在 Github Actions 中注入 .env.local 文件或自定义环境变量集到 yarn build

使用 GitHub Actions 在 .net 应用程序中填充特定于环境的变量

使用加密的 SECRET_KEY 作为环境变量的 GitHub Actions 不起作用

使用 jest-puppeteer 在 GitHub Actions 中构建和启动 2 个应用程序会导致读取环境变量时出现问题

GitHub Actions 使用从 shell 设置的变量

如何在 GitHub Actions 中使用 env 文件?