【问题标题】:How can I centralize (DRY) a string in GitHub Actions config yaml?如何在 GitHub Actions 配置 yaml 中集中(干燥)字符串?
【发布时间】:2020-03-17 18:29:22
【问题描述】:

我正在为我的 CI 创建一个 GitHub Actions 工作流,我意识到我在重复一些信息。例如,作业的runs-on 定义为ubuntu-18.04mac-10.14,或strategy/matrix 中的特定编译器/工具链版本。

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

很遗憾,我在这样做时遇到了麻烦。我可以使用的方法是在 YAML 顶部使用全局 env 环境变量并在其他地方引用它。例如,我想替换如下内容:

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
[...]

与:

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 }}
[...]

即在表达式中使用env 上下文(参见Contexts and expression syntax for GitHub Actions - Contexts)。

这失败了:

### 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

我只能在 env 上下文中找到 this questionthis pageenv 现在在工作流级别上工作。

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

谢谢!

【问题讨论】:

  • 听起来你想要的是一个 YAML 锚。不幸的是,它们在 GitHub Actions 中不受支持。仔细检查一下,我刚刚尝试并收到了 Anchors are not currently supported. 错误。
  • GitHub Actions 论坛上有一个关于 YAML 锚支持的帖子:github.community/t5/GitHub-Actions/Support-for-YAML-anchors/m-p/… 似乎他们正在努力添加它们,但我不知道发布的时间框架可能是什么。我会关注该线程以了解有关它的任何消息。

标签: github-actions


【解决方案1】:

您可以使用env 在工作流级别执行此操作,只是不能在runs-on 中使用这些值 - 这就是为什么您只有UBUNTU_VERSION 而不是TOOLCHAIN_VERSION 的错误。

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

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

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

【讨论】:

    猜你喜欢
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多