r - 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 ...)
解决方案
我相信不可能向矩阵构造本身添加条件。您可以在另一个作业中预先生成矩阵数据,然后在您的作业中使用它。
有一个更简单的解决方案:使用两个作业,因为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 文件类似于程序的命令行参数列表。它只定义另一个程序的输入数据。
所以if
YAML 中没有。因为 YAMLif: condition
就像任何其他key: value
对一样,没有附加逻辑。
推荐阅读
- php - XAMPP 与 Macbook M1 中的 SQL Server(Laravel 项目)
- buildroot - 使用更大的 initramfs 对 populate_rootfs 感到恐慌
- reactjs - 如何将 CardHeader 的操作放在标题旁边?
- android - 配置项目 ':app' 时出现问题。当我设置多风味维度时
- azure - 在 NestJS 中配置 TypeORM 以使用 Azure SQL
- python - 如何在 django 模型实例创建时自动增加类变量?
- sql - 如何在oracle sql中生成2个值之间的字母?
- javascript - 查找和更新嵌套对象javascript的属性
- ios - iOS 手动组合去抖动
- spring-boot - 使用碧玉报告导出 PDF