第25章 外部插件机制
外部插件任务¶ 外部插件任务通过运行外部二进制文件来执行。 插件接口¶ Stash 使用接口与外部插件任务通信。目前 Stash 支持 RPC 和 raw 两种接口类型。 RPC 接口¶ RPC 接口使用 JSON-RPC 与插件进程进行通信。一个基于 golang 的、使用 RPC 接口的插件示例可在 Stash 源码的 pkg/plugin/examples/gorpc 目录下找到。使用 RPC 接口的插件需要提供一个符合 pkg/plugin/common 中 RPCRunner 接口的实现。 RPC 插件需异步处理请求。 当停止 RPC 插件任务时,Stash 服务器会向插件发送停止请求,并依赖插件自行终止。 Raw 接口¶ Raw 接口的插件无需遵循任何特定接口。Stash 服务器会通过标准输入流(stdin)将插件输入以 JSON 编码形式发送给插件进程。Raw 接口的插件无需读取该输入。 Stash 服务器会读取插件的标准输出(stdout)作为插件输出。如果输出可以被解码为插件输出数据结构的 JSON 表示,则会执行解码;否则,整个 stdout 字符串将被视为插件的输出。 当停止 raw 插件任务时,Stash 服务器会直接终止派生的进程,不发出警告或信号。 日志记录¶ 外部插件可以通过向 stderr 写入数据来记录日志到 Stash 服务器。默认情况下,写入 stderr 的数据会被 Stash 记录为 error 级别。可以通过在插件配置文件中设置 errLog 字段来改变此默认行为。 插件可以通过在输出字符串前添加特殊控制字符来记录特定级别的日志或输出进度。参考 go 语言中 pkg/plugin/common/log 的实现。 插件配置文件格式¶ exec¶ 对于外部插件任务,exec 字段是一个列表,第一个元素是要执行的二进制文件,后续元素是传递的参数。执行过程会先在 path 中搜索该二进制文件,然后尝试在插件配置文件所在的目录下查找程序。在 Windows 系统上,exe 扩展名不是必需的。
注意:插件执行过程会将当前工作目录设置为 Stash 进程的目录。
参数可以使用特殊字符串 {pluginDir} 来包含插件的目录。 例如,如果可执行文件 my_plugin 放置在 plugins 子目录中,并且需要参数 foo 和 bar,那么配置中的 exec 部分如下所示: exec: - my_plugin - foo - bar
另一个示例可能使用 Python 脚本来执行插件。假设 Python 脚本 foo.py 位于与插件配置文件相同的目录中,exec 片段如下所示: exec: - python - {pluginDir}/foo.py
interface¶
对于外部插件任务,interface 字段必须设置为以下值之一:
* rpc
* raw
关于这些接口类型的详细信息,请参见上文“插件接口”部分。
如果未提供,interface 字段默认为 raw。
errLog¶
errLog 字段告诉 Stash 当插件输出到 stderr 但未编码日志级别时,默认的日志级别应为何值。如果未提供,则默认为 error 级别。如果插件以适当的编码输出日志,则不需要此字段。详细信息请参见上文“日志记录”部分。
任务配置¶
除了标准任务配置外,外部任务还可以配置一个可选的 execArgs 字段,为任务的执行参数添加额外参数。
示例:
tasks:
- name: