【问题标题】:GitHub actions conditional configGitHub 操作条件配置
【发布时间】:2021-04-09 02:43:22
【问题描述】:

(GH newb 试图通过一些配置来cargo cult 我的方式...)

我正在使用 GitHub 操作 YAML 文件 here 来测试 R 包。默认情况下,此工作流程在四个不同的平台上进行测试,但这对于我的日常需求来说太过分了。 (This action 进行了更有限的测试,但我认为?它也错过了我想要从更完整的工作流程中得到的一些东西......)

我希望在所有四个平台上完成测试只有在提交消息包含字符串“full check”时,否则只测试一个平台。我知道如果我包含条件,我原则上可以实现这样的目标:

if: "contains(github.event.head_commit.message, '[full ci]')"

但我不确定将其包含在工作流程中的确切语法(而且我害怕花费大量时间进行反复试验)

定义当前平台集的工作流程块如下所示,其中三个平台已被注释掉:

    strategy:
      fail-fast: false
      matrix:
        config:
          - {os: ubuntu-20.04, r: 'release', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"}
##          - {os: ubuntu-20.04, r: 'devel', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"}
##          - {os: windows-latest, r: 'release'}
##          - {os: macOS-latest, r: 'release'}

我假设仅将if: 子句粘贴在第一行下方是行不通的(因为它会破坏列表)。我想这样的事情可能有用吗?

    matrix:
      config:
        if: "! contains(github.event.head_commit.message, '[full ci]')"]
        config:
           - {os: ubuntu-20.04, r: 'release', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"}
        if: "contains(...)"
        config: 
            [list with all four configs]

(这个语法有if/else 构造吗?)

我正在寻找帮助我实现狭窄目标的答案,并希望更好地理解 YAML 语法(我已尝试阅读 FM ...)

【问题讨论】:

标签: r github-actions


【解决方案1】:

我相信不可能向矩阵结构本身添加条件。您可以在另一个作业中预先生成矩阵数据,然后在您的作业中使用它。

有一个更简单的解决方案:使用两个作业,因为if 可以在作业级别使用。复制您拥有的当前作业,然后将 if 条件添加到每个作业。为完整的 CI 保留一项工作,在另一项工作中为普通提交硬编码您的环境。

类似这样的:

jobs:
  R-CMD-check-ordinary:
    if: ${{ ! contains(github.event.head_commit.message, '[full ci]') }}
    # Hardcode os
    runs-on: ubuntu-20.04
    # Hardcode name
    name: Test only on Ubuntu

    env:
      R_REMOTES_NO_ERRORS_FROM_WARNINGS: true
      RSPM: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"
      GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}

    steps:
      # replace any occurences of matrix.config. with hardcoded values
      ...
      
  # And the original job
  R-CMD-check-full:
    if: ${{ contains(github.event.head_commit.message, '[full ci]') }}
    runs-on: ${{ matrix.config.os }}

    name: ${{ matrix.config.os }} (${{ matrix.config.r }})

    strategy:
      fail-fast: false
      matrix:
        config:
          - {os: ubuntu-20.04, r: 'release', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"}
          - {os: ubuntu-20.04, r: 'devel', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"}
          - {os: windows-latest, r: 'release'}
          - {os: macOS-latest, r: 'release'}

    env:
      R_REMOTES_NO_ERRORS_FROM_WARNINGS: true
      RSPM: ${{ matrix.config.rspm }}
      GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}

    steps:
      ...

关于 YAML 语法:

YAML 是一种数据格式。不要将 YAML 视为脚本或程序。 YAML 文件类似于程序的命令行参数列表。它只定义另一个程序的输入数据。

所以 YAML 中没有 if。对于 YAML,if: condition 就像任何其他 key: value 对一样,没有附加逻辑。

【讨论】:

  • 这是一个不错的简单答案。它违反了DRY,但在这种情况下可能是值得的。
  • 我认为 YAML 是一种数据格式。我对语法的理解感到沮丧,因为我对语法和空格的重要性、带和不带破折号的元素的含义等一无所知。
  • 它认为这有助于始终记住,尽管有多种编写方法,但只有两种数据类型,列表(又名数组)和键值对(又名字典/散列)地图)
猜你喜欢
  • 2020-03-03
  • 1970-01-01
  • 2020-09-01
  • 2022-12-20
  • 2021-10-29
  • 1970-01-01
  • 2022-10-26
  • 1970-01-01
  • 2020-04-22
相关资源
最近更新 更多