菜单

操作执行

相关源文件

本页解释了 act 如何处理和执行不同类型的 GitHub Actions。它涵盖了操作解析过程、Docker、Node.js 和复合操作的执行流程,以及提高性能的缓存机制。

有关操作执行所涉及的整体步骤执行过程的信息,请参阅步骤执行

操作类型和解析

Act 支持三种标准 GitHub Action 类型(Docker、Node.js 和复合操作),并根据它们的位置以不同方式解析它们

来源

操作执行过程

所有操作都遵循三阶段执行过程:预执行、主执行和后执行。每个阶段都根据操作中定义的表达式进行条件判断。

来源

操作类型实现

Docker 操作执行

Docker 操作在从 Dockerfile 构建或从注册表拉取的容器中运行。

Docker 执行过程

  1. 确定镜像源(Dockerfile 或预构建镜像)
  2. 使用表达式插值评估环境变量和参数
  3. 创建具有适当配置的容器
  4. 通过处理构建/拉取、运行和清理的管道执行容器

来源

Node.js 操作执行

Node.js 操作使用指定的 Node.js 运行时(12、16 或 20)执行 JavaScript 代码。

Node.js 执行过程

  1. 如果操作是远程操作,则将其复制到作业容器
  2. 设置环境变量,包括输入和 GitHub 上下文
  3. 使用适当的 Node.js 版本运行 JavaScript 文件
  4. 捕获输出和状态变化

来源

复合操作执行

复合操作按操作中定义的步骤序列运行。

复合操作执行过程

  1. 为复合操作创建新的 RunContext
  2. 使用输入和共享上下文设置环境
  3. 为复合操作中的所有步骤创建执行计划
  4. 按顺序执行每个步骤
  5. 将输出映射回父上下文

来源

操作缓存系统

Act 为远程操作实现了复杂的缓存系统,以提高性能并支持离线执行。

缓存系统

  • ActionCache 接口定义了操作缓存的契约
  • GoGitActionCache 为远程操作实现了基于 Git 的缓存
  • GoGitActionCacheOfflineMode 扩展了缓存以支持离线使用
  • LocalRepositoryCache 允许使用本地操作覆盖远程操作

来源

远程操作处理

远程操作从 GitHub 获取(或从缓存中获取),然后根据其类型执行。

远程操作处理器

  1. 解析操作引用(例如,actions/checkout@v3
  2. 从缓存中获取操作或从 GitHub 克隆它
  3. 读取操作定义以确定其类型
  4. 在使用本地工作空间时,特殊处理 actions/checkout 操作
  5. 根据其类型执行操作

来源

输入和环境处理

操作通过遵循 GitHub 约定的环境变量接收输入。

进程描述
输入变量在环境中转换为 INPUT_NAME 格式
默认值当步骤定义中未提供输入时使用
表达式插值${{ github.token }} 等表达式的值进行处理
步骤输出捕获并提供给后续步骤
状态持久性在预执行/主执行/后执行阶段之间保存的状态变量

环境设置过程

  1. 将输入名称转换为大写,并添加 INPUT_ 前缀
  2. 如果未提供输入,则应用操作定义中的默认值
  3. 插值输入值中的表达式
  4. 通过环境变量提供 GitHub 上下文
  5. 在预执行、主执行和后执行步骤之间保留状态

来源

常见操作执行模式

以下模式在所有操作类型中普遍使用

预执行和后执行步骤

操作可以定义在主执行之前和之后运行的预执行和后执行步骤

# Node.js action
runs:
  using: node16
  pre: setup.js   # Runs before main
  main: index.js  # Main execution
  post: cleanup.js # Runs after main, even if main fails
  pre-if: always() # Condition for pre step
  post-if: always() # Condition for post step
  
# Docker action
runs:
  using: docker
  image: Dockerfile
  pre-entrypoint: /setup.sh
  entrypoint: /entrypoint.sh
  post-entrypoint: /cleanup.sh

系统根据条件(pre-if/post-if)和步骤结果决定是否运行这些步骤。

来源

特殊情况

系统处理多种特殊情况

  1. actions/checkout:当使用本地仓库时,可以跳过 checkout 操作
  2. 合成操作:仅提供 Dockerfile 或 args 参数时创建
  3. 可重用工作流:与复合操作类似处理,但作用域为作业级别

来源

至此,我们完成了 Act 操作执行系统的概述。