如何在 GitHub Actions config yaml 中集中(DRY)字符串?

big*_*gie 7 github-actions

我正在为我的 CI 创建一个 GitHub Actions 工作流程,我意识到我在重复一些信息。例如,runs-on作业的 定义为ubuntu-18.04and mac-10.14,或strategy/matrix.

我想将这些版本信息集中在 YAML 文件中的某个位置,并且能够引用这些信息而不是多次复制该值。这样我就不会重复自己 (DRY) 并且我可以轻松地在一个位置更改版本值并防止不一致。

不幸的是,我这样做有困难。我虽然可以用于此的方式是env在 YAML 顶部使用全局环境变量并在其他地方引用它。例如,我想替换如下内容:

on: [push, pull_request]
name: CI
jobs:
  build:
    name: Build
    runs-on: ubuntu-18.04
    strategy:
      matrix:
        toolchain:
          - 1.2.3
    steps:
      - run: ./build.sh 1.2.3
  package:
    name: Package
    runs-on: ubuntu-18.04
    steps:
      - run: ./package.sh 1.2.3
[...]
Run Code Online (Sandbox Code Playgroud)

和:

on: [push, pull_request]
name: CI
env:
  UBUNTU_VERSION: 18.04
  TOOLCHAIN_VERSION: 1.2.3
jobs:
  build:
    name: Build
    runs-on: ubuntu-${{ env.UBUNTU_VERSION }}
    strategy:
      matrix:
        toolchain:
          - ${{ env.TOOLCHAIN_VERSION }}
    steps:
      - run: ./build.sh ${{ matrix.toolchain }}
  package:
    name: Package
    runs-on: ubuntu-${{ env.UBUNTU_VERSION }}
    steps:
      - run: ./package.sh ${{ env.TOOLCHAIN_VERSION }}
[...]
Run Code Online (Sandbox Code Playgroud)

即在表达式中使用env 上下文(请参阅GitHub 操作 - 上下文的上下文和表达式语法)。

这失败了:

### ERRORED 18:08:15Z

- Your workflow file was invalid: The pipeline is not valid. .github/workflows/ci.yml (Line: 20, Col: 14): Unrecognized named-value: 'env'. Located at position 1 within expression: env.UBUNTU_VERSION,.github/workflows/ci.yml (Line: 125, Col: 14): Unrecognized named-value: 'env'. Located at position 1 within expression: env.UBUNTU_VERSION
Run Code Online (Sandbox Code Playgroud)

我只能在上下文和这个页面上找到这个问题,说现在在工作流级别上工作。envenv

如何集中重复字符串/版本/等。至于 DRY 到一个位置?

谢谢!

Mic*_*ker 3

您可以使用 来在工作流程级别执行此操作env,只是不能在 中使用这些值runs-on- 这就是为什么您只收到错误UBUNTU_VERSION和 错误的原因TOOLCHAIN_VERSION

为什么?因为env是在机器上设置的环境变量,但它需要先配置机器,然后才能在机器上设置环境变量,但它不知道要配置哪台机器,因为机器类型中有一个环境变量。 .:)

我确信 GitHub 可以解决这个问题,但现在不起作用。

旁注:作业被设计为独立、并行和在不同的机器上运行。如果您有顺序工作流程,最好有一个作业和多个步骤。这也将消除您的重复ubuntu-18.04定义并缩小您的工作流程文件。