如何从主 github 操作 yaml 文件引用另一个 yml 文件?

Lee*_*Lee 2 continuous-integration yaml github-actions

我正在定义一个引用另一个 yaml 文件的 github 操作脚本,希望能够以更有条理的方式进行配置。

\n

这是我的作业文件,命名为deploy.yml的路径./.github/workflows/,其中第一个.是我的项目的根文件夹。

\n
....\njobs:\n  UnitTest:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v3\n      - uses: ./.github/workflows/unittest.yml\n
Run Code Online (Sandbox Code Playgroud)\n

在同一./.github/workflows/文件夹中,我创建了另一个文件,名称unittest.yml如下:

\n
name: "UnitTest"\ndescription: "Perform Unit Test"\nruns:\n  # using: "composite"\n  - name: Dependency\n    run: |\n      echo "Dependency setup commands go here"\n\n  - name: UnitTest\n    run: make test.unit\n
Run Code Online (Sandbox Code Playgroud)\n

但是,当我尝试使用act with command在本地测试脚本时act --secret-file .secrets --container-architecture linux/amd64,收到以下错误:

\n
[Deploy/UnitTest]   \xe2\x9c\x85  Success - Main actions/checkout@v3\n[Deploy/UnitTest] \xe2\xad\x90 Run Main ./.github/workflows/unittest.yml\n[Deploy/UnitTest]   \xe2\x9d\x8c  Failure - Main ./.github/workflows/unittest.yml\n[Deploy/UnitTest] file does not exist\n[Deploy/UnitTest]   Job failed\n
Run Code Online (Sandbox Code Playgroud)\n

我尝试仅将文件名放入unittest.yml./unittest.yml文件myrepo_name/.github/workflows/unittest.yml夹中,如本文档的步骤 2所示,但没有成功。

\n

根据组合动作的运行示例,我想这应该可行。

\n

有人请建议吗?

\n

using: "composite"PS 你可能已经注意到了中的注释行unittest.yml。如果我取消注释该行,我将收到错误:

\n
Error: yaml: line 3: did not find expected key\n
Run Code Online (Sandbox Code Playgroud)\n

ret*_*hab 5

复合操作不是由 YAML 文件引用,而是由文件夹引用。在该文件夹中,您应该有一个描述该操作的 action.yml。

这就是为什么您收到 错误using: composite,您正在定义工作流程(因为它位于 中./github/workflows),但您正在使用操作语法。

我建议这个文件夹结构:

.github/
 |-- workflows/
    | -- deploy.yml
unittest-action/
 |-- action.yml

Run Code Online (Sandbox Code Playgroud)

通过这种结构,您应该能够引用该操作

.github/
 |-- workflows/
    | -- deploy.yml
unittest-action/
 |-- action.yml

Run Code Online (Sandbox Code Playgroud)

请参阅文档以获取更多信息。


根据您的用例和设置,您可能还需要考虑可重用的工作流程

您可以在目录中定义可重用的工作流程,.github/workflows如下所示:

- uses: actions/checkout@v3
- uses: ./unittest-action
Run Code Online (Sandbox Code Playgroud)

然后这样称呼它:

# unittest.yml
on: workflow_call

jobs:
  deploy:
    # ...

Run Code Online (Sandbox Code Playgroud)

请注意可重用工作流程如何成为一个完整的作业。这意味着,您无法从外部进行结帐,然后仅在可重用作业中运行单元测试。可重用作业(unittest.yml)需要首先进行签出。


该选哪一个呢?

这是一篇博客文章,总结了复合操作和可重用工作流程之间的一些差异,例如:

  • 可重用的工作流程可以包含多个作业,复合操作仅包含步骤
  • 可重用的工作流程可以更好地支持使用机密
  • 复合操作可以嵌套,但从 22 年 7 月开始,可重用工作流程无法调用其他可重用工作流程