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

Environment variables not always being expanded in GitHub Actions workflow file

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

根据评论,环境变量的使用可以正常工作,直到最后一次在 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

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

    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 中设置它。