首页 > 解决方案 > GitHub 操作条件配置

问题描述

(GH newb 试图通过一些配置来向我输送邪教......)

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

只有当提交消息包含字符串“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 ...)

标签: rgithub-actions

解决方案


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

有一个更简单的解决方案:使用两个作业,因为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 文件类似于程序的命令行参数列表。它只定义另一个程序的输入数据。

所以ifYAML 中没有。因为 YAMLif: condition就像任何其他key: value对一样,没有附加逻辑。


推荐阅读