执行引擎是 act 系统中的核心组件,负责协调 GitHub Actions 工作流的执行。它为运行作业和步骤、管理容器以及根据条件和依赖项控制执行流程提供了底层框架。
有关特定实现(如步骤或操作)的信息,请参阅 步骤系统 和 操作。有关更高级别的协调,请参阅 运行器系统。
在 act 中,执行引擎基于函数组合模式构建,使用一个简单而强大的执行器接口,可以实现复杂的执行流程。
来源:pkg/common/executor.go29-84 pkg/common/executor.go93-132 pkg/common/executor.go140-241
执行引擎的基本构建块是 Executor 类型,它是一个接受上下文并返回错误的函数
这个简单的接口允许通过 Then、OnError 和 Finally 等组合子进行强大的组合,从而能够清晰简洁地表达复杂的执行流程。
来源:pkg/common/executor.go29-31
执行引擎为不同的执行模式提供了几种执行器工厂
来源:pkg/common/executor.go53-69 pkg/common/executor.go72-85 pkg/common/executor.go87-92 pkg/common/executor.go95-132 pkg/common/executor.go134-138
执行引擎通过 RunContext 结构体来维护状态,该结构体包含执行作业所需的所有信息。
来源:pkg/runner/run_context.go31-56 pkg/runner/run_context.go246-591 pkg/runner/run_context.go850-973
RunContext 负责:
来源:pkg/runner/run_context.go78-90 pkg/runner/run_context.go246-591 pkg/runner/run_context.go850-973
执行引擎可以在 Docker 容器中或直接在主机上运行作业
来源:pkg/runner/run_context.go655-670 pkg/runner/run_context.go178-245 pkg/runner/run_context.go246-429
作业执行器协调作业中所有步骤的执行,负责预步骤、主步骤和后步骤。
来源:pkg/runner/job_executor.go22-155 pkg/runner/job_executor.go157-198
newJobExecutor 函数创建一个执行器,该执行器:
步骤按以下顺序执行
来源:pkg/runner/job_executor.go22-155 pkg/runner/job_executor.go157-198
作业中的每个步骤最多经历三个执行阶段
来源:pkg/runner/job_executor.go80-102 pkg/runner/job_executor.go138-154
执行引擎提供了错误处理和控制执行流程的机制。
作业和步骤可以使用 if 字段进行条件执行。执行引擎使用表达式评估器评估这些条件,并在条件评估为 false 时跳过步骤/作业。
来源:pkg/runner/run_context.go784-816
执行引擎在多个级别处理错误
continue-on-error 以防止作业失败OnError 和 Finally 等组合子提供了错误处理钩子Finally 组合子确保即使执行失败也能执行清理操作,而 OnError 则允许进行特定的错误处理逻辑。
来源: pkg/common/executor.go159-195 pkg/common/executor.go225-234 pkg/runner/job_executor.go56-64
执行引擎支持与作业容器一起运行服务容器,这对于作业所需的数据库、缓存或其他依赖项非常有用。
服务容器是
来源: pkg/runner/run_context.go103-106 pkg/runner/run_context.go285-304 pkg/runner/run_context.go553-618
执行引擎支持矩阵执行,即作业根据参数矩阵以不同的配置运行多次。
对于每个矩阵值的组合
来源: pkg/runner/runner_test.go765-790 pkg/runner/job_executor.go29-34 pkg/runner/run_context.go685-687
act 中的执行引擎提供了一个灵活强大的框架来运行 GitHub Actions 工作流。它使用函数组合模式来清晰地表达复杂的执行流程,并处理容器、步骤和作业的生命周期。
此设计的关键优势包括
来源: pkg/common/executor.go29-31 pkg/runner/job_executor.go22-155 pkg/runner/run_context.go31-56