如何在本地测试和模拟 GitHub Actions 开发的场景

How to locally test and simulate scenarios for GitHub Actions development

上下文

我正在开发一个 GitHub 操作,允许根据我公司的政策管理存储库问题(比如问候用户、根据交互更改标签以及向 Ryver 的聊天室发送消息当需要时)。

为了简单起见,我们将使用的存储库称为:

操作数

到目前为止,要测试 Repo Act 中所做的更改,我必须:

  1. Repo Act。实现逻辑并推送它
  2. Repo Act。发布动作(例如:v1.1.3)
  3. Repo Use。更改 Action 版本,以使用 Repo Act 的新版本(例如:v1.1.3)
  4. Repo Use。创建问题并触发操作

这个过程很长。我正在寻找一种在本地测试它的方法。

到目前为止,我已经能够缩短其中的一些步骤,例如:

我。在本地测试动作的 NodeJS 逻辑(手动给变量赋值)

二。使用标签将代码推送到 Repo Act,以便自动发布

三。使用nektos/act模拟第4点“创建问题并触发动作”。

我的成绩

但是,这仍然需要手动删除模拟值,推送 Repo Act 的新版本,更改 Repo Use 上的版本并通过创建问题重新测试。

有什么方法可以加快这个过程?

我对 GitHub 存储库开发太陌生了,也许我正在走很长的路。

正在测试动作新版本

使用action并不一定要生成release版本,可以直接使用branch name

例如:actions/checkout@main 而不是 actions/checkout@v2.3.4

因此,以 main 分支为目标而不是每次都生成一个新版本将使您的测试速度更快。

使用另一个存储库测试操作

您不需要创建新的存储库来测试操作,您可以在自己的操作中添加工作流来进行测试。

因此,不需要使用两个 repos 来进行测试,只需在操作中使用一个工作流,该工作流将始终针对 main 分支并在满足条件事件时触发。

集成测试

面对类似的问题,我最终编写了一个名为 github-action-ts-run-api 的用于动作集成测试的 JS 包。此包提供 JavaScript/TypeScript API 用于 运行 在本地或在任何 CI(包括 GitHub 操作本身)的单个操作。它同时支持节点和 Docker 操作。

使用该包,您可以直接在 Repo Act 和 运行 本地编写集成测试,模拟 Repo Use 的整个上下文及其在操作级别的任何事件甚至在单个 JS 函数的级别上(例如,如果您需要模拟 GitHub API 调用)。

实际代码示例:

import {RunTarget, RunOptions} from "github-action-ts-run-api";
import dotenv from 'dotenv';

// For GITHUB_TOKEN and GITHUB_REPOSITORY for local tests
dotenv.config({path: 'tests.env'});

describe('git-get-release-action', () => {
    const target = RunTarget.jsFile('lib/index.js', 'action.yml');

    it('should get by id', () => {
        const res = target.run(RunOptions.create()
            .setEnv({
                GITHUB_TOKEN: process.env.GITHUB_TOKEN,
                GITHUB_REPOSITORY: process.env.GITHUB_REPOSITORY
            })
            .setInputs({  releaseId: '56669824' })
        );
        expect(res.isSuccess).toEqual(true);
        expect(res.commands.outputs.tag_name).toEqual('testTag');
    });
});

特殊测试工作流程

您还可以在 Repo Act 中有一个特殊的测试工作流程,它将通过覆盖 GITHUB_REPOSITORY 和其他服务环境变量的本地路径 (uses: ./) 调用操作来模拟 Repo Use上下文。

如您所述,您可以使用 nektos/act.

执行测试工作流

文章

如果您有兴趣了解不同级别的 Actions 测试,我可以推荐您阅读名为 "Testing of GitHub Actions" 的 post 系列。