菜单

操作

相关源文件

本文档解释了 Act 如何处理 GitHub Actions,包括不同的 Actions 类型(JavaScript、Docker 和复合型),它们的执行流程,以及 Act 如何与 GitHub Actions 生态系统保持兼容性。有关 Step 执行的通用信息,请参阅 Steps System

Actions 类型和实现

Act 支持 GitHub Actions 定义的三种 Actions 类型:

  1. JavaScript Actions - 使用 Node.js 运行代码(Node12、Node16、Node20)
  2. Docker Actions - 在 Docker 容器中运行
  3. Composite Actions - 运行一系列步骤

每种 Actions 类型都有不同的处理方式,但都遵循代码库中定义的通用模型。

来源:pkg/model/action.go68-80 pkg/model/action.go51-66 pkg/model/action.go38-49 pkg/model/action.go95-99 pkg/model/action.go102-105

Actions 发现和加载

Act 在执行 Actions 之前需要定位并加载 Actions 元数据。该系统支持多种 Actions 定义格式。

来源:pkg/runner/action.go43-117 pkg/model/action.go107-124

Act 从以下来源读取 Actions 元数据:

  1. action.yml - 主要元数据文件
  2. action.yaml - 备用元数据文件
  3. Dockerfile - 适用于没有元数据的 Docker Actions
  4. 仅提供 args 时创建合成 Actions

远程 Actions 与本地 Actions

Act 同时支持来自 GitHub 仓库的远程 Actions 和来自工作区的本地 Actions。

来源:pkg/runner/step_action_remote.go22-251 pkg/runner/step_action_local.go18-134 pkg/runner/step_action_remote.go40-145

操作执行过程

Actions 执行系统有一个主要执行器,负责处理不同的 Actions 类型。

来源:pkg/runner/action.go153-210 pkg/runner/action.go246-354 pkg/runner/action_composite.go84-124

Actions 生命周期:预处理、主执行和后处理步骤

Actions 可以有在 Actions 生命周期不同阶段执行的预处理、主执行和后处理步骤。

来源:pkg/runner/action.go486-497 pkg/runner/action.go499-510 pkg/runner/action.go512-580 pkg/runner/action.go582-605 pkg/runner/action.go607-618 pkg/runner/action.go620-685

JavaScript Actions

对于基于 Node.js 的 Actions,Act 会:

  1. 将 Actions 文件复制到作业容器中。
  2. 设置输入的环境变量。
  3. 使用指定的 Node.js 版本执行脚本。

来源:pkg/runner/action.go178-188 pkg/runner/action.go444-453

Docker Actions

对于基于 Docker 的 Actions,Act 会:

  1. 构建或拉取指定的镜像。
  2. 创建具有适当网络和挂载的容器。
  3. 设置环境变量并传递输入。
  4. 使用适当的入口点和参数执行容器。

来源:pkg/runner/action.go246-354 pkg/runner/action.go385-432

Composite Actions

对于复合型 Actions,Act 会:

  1. 创建一个专门的复合运行上下文。
  2. 按顺序处理并执行每个步骤。
  3. 将复合型 Actions 的输出映射回主运行上下文。

来源: pkg/runner/action_composite.go13-45 pkg/runner/action_composite.go47-82 pkg/runner/action_composite.go84-124 pkg/runner/action_composite.go126-236

Action 环境设置

Act 会仔细设置 Action 的运行环境,以确保其行为与 GitHub 的 Runner 兼容。

来源: pkg/runner/action.go212-224 pkg/runner/action.go434-453 pkg/runner/action_composite.go13-45

环境包括

  • Action 输入 (以 INPUT_ 为前缀)
  • GitHub 上下文 (仓库、引用、工作流信息等)
  • 来自先前步骤的已保存状态
  • Runner 的特殊环境变量 (例如:RUNNER_TOOL_CACHE)

远程 Action 处理

远程 Action 需要额外的处理来获取和准备 Action

来源: pkg/runner/step_action_remote.go40-145 pkg/runner/step_action_remote.go253-290 pkg/runner/step_action_remote.go292-304

Act 支持 GitHub Enterprise,允许通过配置选项将 Actions 替换为 github.com 版本。

  • ReplaceGheActionWithGithubCom - 要替换的 Action 列表
  • ReplaceGheActionTokenWithGithubCom - 用于身份验证的 Token

按类型划分的 Action 执行详情

Node.js 执行

来源: pkg/runner/action.go178-188

Docker 执行

来源: pkg/runner/action.go246-354

复合执行

来源: pkg/runner/action_composite.go84-124 pkg/runner/action_composite.go126-194

结论

Act 的 Action 执行系统是一个复杂的组件,与 GitHub 对 Actions 的实现平行。通过支持相同的 Action 类型(JavaScript、Docker 和复合)并提供兼容的执行环境,Act 使得本地工作流测试能够非常接近 GitHub 托管 Runner 的行为。

通过精心设计的 Action 发现、准备和执行架构,以及预/主/后生命周期处理,Act 确保 Actions 在本地或 GitHub 上运行的行为一致。

来源: pkg/runner/action.go pkg/model/action.go pkg/runner/action_composite.go pkg/runner/step_action_remote.go pkg/runner/step_action_local.go