如何在 GitHub Actions 中声明环境变量时执行字符串操作

Rak*_*kib 5 pipeline github environment-variables github-actions building-github-actions

我有一个如下所示的 github 存储库

约翰多/你好世界

我正在尝试在 github 操作中设置以下环境变量

env:
  DOCKER_HUB_USERID: ${{ github.actor }}
  REPOSITORY_NAME: ${GITHUB_REPOSITORY#*\/}
  IMAGE_NAME_CLIENT: "$REPOSITORY_NAME-client"
  IMAGE_NAME_SERVER: "$REPOSITORY_NAME-server"
Run Code Online (Sandbox Code Playgroud)

我对这些变量的预期结果是:

johndoe
hello-world
hello-world-client
hello-world-server
Run Code Online (Sandbox Code Playgroud)

但我得到

johndoe
${REPOSITORY_NAME#*\/}
$REPOSITORY_NAME-client
$REPOSITORY_NAME-server
Run Code Online (Sandbox Code Playgroud)

看起来在声明envvars 时没有评估表达式。

我怎样才能达到预期的行为?

pet*_*ans 8

Shell 参数扩展在run步骤之外是不可能的。

env:
  REPOSITORY_NAME: ${GITHUB_REPOSITORY#*\/}
Run Code Online (Sandbox Code Playgroud)

创建一个额外的步骤来计算一个新变量的值。

      - name: Set env
        run: echo ::set-env name=REPOSITORY_NAME::${GITHUB_REPOSITORY#*\/}
      - name: Test
        run: echo $REPOSITORY_NAME
Run Code Online (Sandbox Code Playgroud)

或者创建一个步骤输出。

      - name: Set outputs
        id: vars
        run: echo ::set-output name=repo_name::${GITHUB_REPOSITORY#*\/}
      - name: Test set output
        run: echo ${{ steps.vars.outputs.repo_name }}
Run Code Online (Sandbox Code Playgroud)

一旦计算出的环境变量REPOSITORY_NAME或步骤输出steps.vars.outputs.repo_name存在,它们就可以用于设置其他这样的变量。

env:
  IMAGE_NAME_CLIENT: ${{ env.REPOSITORY_NAME }}-server
  IMAGE_NAME_SERVER: ${{ steps.vars.outputs.repo_name }}-server
Run Code Online (Sandbox Code Playgroud)

  • `set-env` 自 2020 年 10 月起已弃用。建议的替换使用 `$GITHUB_ENV` 文件。 (3认同)

Fab*_*eón 8

出于安全原因,Github 改变了你设置环境变量的方式,现在你必须使用这种方式。

steps:
  - name: Set the environment variable
    run: echo REPOSITORY_NAME=${GITHUB_REPOSITORY#*\/} >> $GITHUB_ENV
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它

  - name: Use the value
    run: echo $REPOSITORY_NAME # This will output repository name
Run Code Online (Sandbox Code Playgroud)

在 env 上使用的示例

  - name: Install dependencies And Build Yarn and npm
    uses: fabiel-leon/npm-build@master
    env:
      REPO: ${{ env.REPOSITORY_NAME }}
Run Code Online (Sandbox Code Playgroud)
  - name: Build and push Docker images
    uses: docker/build-push-action@v1
    with:
      tags: ${{ env.REPOSITORY_NAME }}
Run Code Online (Sandbox Code Playgroud)

https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-environment-variable