首页/新闻资讯/正文详情

Woodpecker 插件开发实战指南:用 `PLUGIN_` 环境变量约定构建你的第一个 CI/CD 插件

发布时间:2026/9/27 23:40:15 来源:云帆数科 栏目:资讯中心
Woodpecker 插件开发实战指南:用 `PLUGIN_` 环境变量约定构建你的第一个 CI/CD 插件
CI/CDDevOps【免费下载链接】woodpeckerWoodpecker is a simple, yet powerful CI/CD engine with great extensibility.项目地址https://gitcode.com/gh_mirrors/wo/woodpecker点击查看免费下载插件Plugin是 Woodpecker 生态中最具扩展性的部分任何能被打包进容器并以ENTRYPOINT执行的逻辑都可以成为复用性极强的流水线插件。本篇指南以 Woodpecker 官方文档《Creating plugins》为核心骨架结合仓库内编译器的真实源码实现完整讲解插件的构建约定、settings参数到环境变量的映射规则、密钥注入、元数据声明、命令输出折叠并手把手完成一个可运行的 webhook 插件。读完本文你将能够独立开发、测试、发布一个符合 Woodpecker 规范、可被插件索引收录的插件。什么是插件流水线中的预制步骤在 Woodpecker 中插件本质上就是一个以插件逻辑作为 ENTRYPOINT 的容器镜像在流水线里它被声明为一个普通 step。与普通 step 通过commands执行任意脚本不同插件是开箱即用的黑盒用户只需通过settings提供参数插件镜像负责完成部署、发布制品、发送通知等预定义任务。插件镜像由 Agent 配置的默认容器仓库自动拉取因此创建插件的门槛极低——先构建一个 Docker 镜像再在.woodpecker.yaml中引用它即可。一个典型的最小插件镜像与流水线配置如下见 插件总览FROM cloud/kubectl COPY deploy /usr/local/deploy ENTRYPOINT [/usr/local/deploy]kubectl apply -f $PLUGIN_TEMPLATEsteps: - name: deploy-to-k8s image: cloud/my-k8s-plugin settings: template: config/k8s/service.yaml核心约定settings如何变成PLUGIN_环境变量要让用户能配置插件的运行行为插件作者应在流水线 YAML 中使用settings:。Woodpecker 编译器会将settings中的每一项转换后以大写环境变量形式注入容器变量名前缀为PLUGIN_。例如设置项url会被注入为环境变量PLUGIN_URL。命名转换规则字符-会被转换为下划线_例如some-String变成PLUGIN_SOME_STRINGCamelCase 不被保留anInt会变成PLUGIN_ANINT从源码看转换逻辑还会把.一并替换为_。该规则在 pipeline/frontend/yaml/compiler/settings/params.go 的sanitizeParamKey中实现先执行strings.ReplaceAll(k, ., _)与strings.ReplaceAll(k, -, _)再整体strings.ToUpper最后拼接前缀。其单元测试 params_test.go 验证了dry-run、dry_Run、dry.run三种写法最终都会归一化为PLUGIN_DRY_RUN。基础类型设置任何基础 YAML 标量scalar都会按字符串形式注入。官方文档给出的对照表如下Setting注入的环境变量some-bool: falsePLUGIN_SOME_BOOLfalsesome_String: helloPLUGIN_SOME_STRINGhelloanInt: 3PLUGIN_ANINT3也就是说布尔值、整数、浮点数等类型在进入容器时统一字符串化。对应源码sanitizeParamValueparams.go对Bool使用strconv.FormatBool、对Int/Float使用fmt.Sprintf生成字符串。复杂设置自动序列化为 JSON插件同样支持 map、list 这类复杂 YAML 结构例如steps: - name: plugin image: foo/plugin settings: complex: abc: 2 list: - 2 - 3这类值会被转换为JSON后注入插件。上例中环境变量PLUGIN_COMPLEX的内容将是{abc: 2, list: [ 2, 3 ]}从源码看该流程由handleComplex完成params.go先用yaml.Marshal序列化再通过go-yaml2json转为 JSON 字符串。还有一个值得注意的细节纯标量数组如[2, 3]不会被 JSON 化而是以逗号连接成字符串如PLUGIN_SLICE1,2,3仅当数组内包含复杂元素时才走 JSON 序列化路径——这一点在 params_test.go 中有明确断言。用from_secret向插件注入密钥密钥secret也应通过settings传入插件这是 Woodpecker 官方推荐的唯一方式。用户无需在流水线里硬编码敏感值只需使用from_secret语法引用密钥库中的变量steps: - name: plugin image: foo/plugin settings: TOKEN: from_secret: secret_token上述配置把名为secret_token的密钥赋给设置项TOKEN插件内以PLUGIN_TOKEN读取用法详见 密钥文档。注意该语法同时适用于settings与environmentfrom_secret的值必须是字符串。从源码看injectSecretparams.go会探测 map 中是否包含from_secret键命中时调用getSecretValue取回真实值并直接作为环境变量值注入对于嵌套在复杂结构内部的from_secretinjectSecretRecursive会递归展开params.go。而 convert.go 中的getSecretValue实现还会额外校验该密钥是否允许在当前流水线事件event下对当前容器可用未找到或无权使用时编译会直接报错从而保证密钥不会被误传给非授权步骤。Go 插件开发库如果你使用 Go 编写插件Woodpecker 社区提供了一个官方插件库用于便捷地读取内部环境变量与settings。该库位于 Codeberg 上的woodpecker-plugins/go-plugin仓库由 Woodpecker 社区维护文档中引用的官方位置。它封装了PLUGIN_环境变量的解析、常见类型的反序列化等工作让你可以专注于插件业务逻辑而不必手写环境变量解析代码。为插件声明元数据docs.md 头部为了让插件能被 [Woodpecker 插件索引] 收录并在文档中展示你可以在插件的 Markdown 文档中使用专门的头部header声明元数据。索引页面即插件列表页官方插件均通过此机制收录。支持的元数据字段如下字段说明name插件全名唯一必填字段icon插件图标的 URLdescription插件功能的简短描述author作者名称tags关键词列表例如 clone 插件可写[git, clone]containerImage容器镜像名称containerImageUrl容器镜像的链接url插件主页或仓库地址想被索引收录应尽可能填满这些字段但只有name是硬性要求。命令输出折叠▶前缀约定Woodpecker 的 UI 支持对单条命令的输出进行折叠。插件通常与普通流水线 step 结构类似——执行一组固定命令此时可以用相同方式为输出分节打印▶黑色三角后接两个空格加被执行的命令UI 便可将后续输出归入该命令的折叠块中。示例echo ▶ make test make test这样用户在 UI 中能清晰地看到每条命令的输出归属日志可读性大幅提升。下文的 webhook 示例也会采用这一约定。实战从零构建一个 webhook 插件下面通过一个完整的 webhook 插件教程把上述所有约定串起来用简单 shell 脚本在构建流水线中发起 HTTP 请求。第 1 步了解用户侧的配置形态插件发布后最终用户在.woodpecker.yaml中的使用方式如下steps: - name: webhook image: foo/webhook settings: url: https://example.com method: post body: | hello world三个设置项url、method、body会分别注入为PLUGIN_URL、PLUGIN_METHOD、PLUGIN_BODY。第 2 步编写插件逻辑创建一个简单的 shell 脚本用 curl 发送请求参数全部取自大写PLUGIN_前缀的环境变量#!/bin/sh echo ▶ curl -X ${PLUGIN_METHOD} -d ${PLUGIN_BODY} ${PLUGIN_URL} curl \ -X ${PLUGIN_METHOD} \ -d ${PLUGIN_BODY} \ ${PLUGIN_URL}第 3 步打包为镜像编写 Dockerfile把脚本加入镜像并配置为 ENTRYPOINT官方建议固定基础镜像版本如alpine:3.19# please pin the version, e.g. alpine:3.19 FROM alpine ADD script.sh /bin/ RUN chmod x /bin/script.sh RUN apk -Uuv add curl ca-certificates ENTRYPOINT /bin/script.sh构建并推送到容器仓库即可与整个 Woodpecker 社区共享docker build -t foo/webhook . docker push foo/webhook第 4 步本地验证发布前先在本地用docker run直接注入环境变量来验证插件行为效果等同于流水线内的执行docker run --rm \ -e PLUGIN_METHODpost \ -e PLUGIN_URLhttps://example.com \ -e PLUGIN_BODYhello world \ foo/webhook源码视角插件隔离与容器行为差异阅读源码可以发现插件容器与普通 step 在编译期有若干关键差异插件作者应理解这些行为以保证插件正确运行插件判定IsPlugin()的定义是没有commands、没有entrypoint、没有environment见 pipeline/frontend/yaml/types/container.go。一旦你在插件 step 上声明了commands或entrypoint它就不再被当作插件处理编译会失败使用environment虽可行但该容器将不再被视为插件——密钥的插件过滤将失效且不会自动获得特权。工作区固定为/woodpecker插件容器的工作区基础路径被固定为/woodpeckerconvert.go以保护 ENTRYPOINT 可执行文件不被篡改用户无需关心这一点。特权提升仅当插件镜像命中管理员配置的可提权镜像列表时才会被授予特权convert.go因此绝大多数插件默认运行在非特权模式。环境变量注入点settings通过ParamsToEnv(container.Settings, environment, PLUGIN_, true, ...)注入convert.go而普通environment则不带前缀注入二者共用同一套from_secret解析机制。插件开发最佳实践官方文档为插件作者总结了以下实践建议多架构构建为不同架构构建镜像让更多用户可用至少支持amd64和arm64。为local后端提供二进制使用 Woodpeckerlocal后端本地执行的用户无法运行容器镜像插件应额外发布针对不同 OS/架构的二进制文件。优先使用内置环境变量尽可能利用 Woodpecker 提供的内置环境变量如仓库、流水线、提交相关信息详见 内置环境变量文档而不是要求用户手动传入这类信息。只依赖settings与内部环境变量不要要求用户配置environment也不要强制依赖特定名称的密钥——把灵活性留给用户。附带docs.md为插件编写docs.md在其中列出全部settings与插件元数据官方插件如 plugin-git 即以docs.md作为文档与索引数据的来源。提交到插件索引将你的docs.md提交至 Woodpecker 插件索引使插件可以被社区发现和引用。小结Woodpecker 的插件机制建立在一条极简约定之上settings → 大写PLUGIN_环境变量 → ENTRYPOINT 脚本。掌握命名转换规则、复杂类型的 JSON 序列化、from_secret密钥注入再配合docs.md元数据与▶输出折叠约定你就能在十几分钟内交付一个规范、可复用、可被索引收录的 CI/CD 插件。对于更复杂的场景可以进一步参考 插件总览 中关于插件隔离与密钥过滤的说明或直接阅读仓库中的编译器源码 params.go 与 convert.go 理解底层行为。赞分享CI/CDDevOps【免费下载链接】woodpeckerWoodpecker is a simple, yet powerful CI/CD engine with great extensibility.项目地址https://gitcode.com/gh_mirrors/wo/woodpecker点击查看免费下载相关推荐Jasminum插件开发环境搭建从零开始构建你的第一个Zotero插件想要为Zotero开发中文元数据抓取插件Jasminum插件为你提供了完美的起点这个终极指南将带你从零开始快速搭建专业的Zotero插件开发环境让你轻松科研Woodpecker插件开发终极指南创建自定义CI/CD工具Woodpecker插件开发终极指南创建自定义CI/CD工具 Woodpecker是一个简单但功能强大的CI引擎具有出色的可扩展性。通过插件系统您可以轻松CI/CDDevOpsres-downloader免费的跨平台资源下载器3 分钟抓到第一条视频res downloader免费的跨平台资源下载器3 分钟抓到第一条视频 你肯定有过这种瞬间打开视频号看到想存的视频翻遍设置找不到下载入口。res d桌面应用网络音视频上一篇开源项目解析Papirus Folders脚本原理与自定义扩展指南下一篇国家中小学智慧教育平台电子课本解析工具让教育资源获取触手可及创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

从 OpenSearch 迁移到 ClickHouse:highlight.io Session/Error Feed 架构迁移方案解析
从 OpenSearch 迁移到 ClickHouse:highlight.io Session/Error Feed 架构迁移方案解析

可观测性后端 【免费下载链接】highlight highlight.io: The open source, full-stack monitoring platform. Error monitoring, session replay, logging, distributed tracing, and more. 项目地址: https://gitcode.com/gh_mirrors/hi/highlight 点击查看 免费下… · 2026/9/27 23:40:15

Model-Optimizer 检查点镜像配方:以 `models/<org>/<model_id>` 目录精确复现已发布量化检查点
Model-Optimizer 检查点镜像配方:以 `models/<org>/<model_id>` 目录精确复现已发布量化检查点

人工智能大模型模型优化模型量化模型压缩 【免费下载链接】Model-Optimizer A unified library of SOTA model optimization techniques like quantization, distillation, pruning, neural architecture search, speculative decoding, etc. It compresses deep learning mode… · 2026/9/27 23:40:15

Postgres.app 旧版(Legacy)下载指南:为老旧 macOS 挑选与安装合适的 PostgreSQL 版本
Postgres.app 旧版(Legacy)下载指南:为老旧 macOS 挑选与安装合适的 PostgreSQL 版本

数据库桌面应用 【免费下载链接】PostgresApp The easiest way to get started with PostgreSQL on the Mac 项目地址: https://gitcode.com/gh_mirrors/po/PostgresApp 点击查看 免费下载 本篇技术指南以 Postgres.app 官方文档中的"旧 Mac 下载(… · 2026/9/27 23:40:09

做网站动图的软件怎么选?避开高价坑,新手看这篇就够
做网站动图的软件怎么选?避开高价坑,新手看这篇就够

做网站动图的软件怎么选?避开高价坑,新手看这篇就够 找建站公司最让人头疼的,就是报价单上一堆看不懂的名词,动不动就几万块,生怕被坑高价。很多河北转行做网站的新手,刚入行就被客户问倒:做个动图到底用什么软件?这钱该花多少?别急,咱们把【做网站… · 2026/9/28 0:16:57

3个坑搞定wordpress文章对齐完整流程
3个坑搞定wordpress文章对齐完整流程

3个坑搞定wordpress文章对齐完整流程 刚接了个单子,客户指着屏幕上歪歪扭扭的正文骂街:“这模板网站太丑不够用,看着就像地摊货!”我一看后台,确实是典型的 WordPress 默认样式没调好,加上主题作者偷懒,CSS 写得乱七八糟。… · 2026/9/28 0:16:51

佛山网络公司排名前十避坑指南:3个实战案例拆解
佛山网络公司排名前十避坑指南:3个实战案例拆解

佛山网络公司排名前十避坑指南:3个实战案例拆解 别再被那些花里胡哨的模板网站骗了。 你花几万块做的站,上线后客户只说了一句“好丑”,然后转头去找了隔壁那家看起来更土但更实在的公司。 这就是佛山网站建设圈子里最残酷的真相:… · 2026/9/28 0:16:45

搞懂网站外链有什么用及完整流程
搞懂网站外链有什么用及完整流程

搞懂网站外链有什么用及完整流程 网站被黑挂马不知道怎么办?别慌,这往往和外链管理失控有关。很多站长盯着SEO排名,却忽略了外链的“毒性”,导致网站权重暴跌。其实,解决这个问题的 完整流程… · 2026/9/28 0:16:33

告别模板丑站!5个实战案例揭秘html网页制作动态效果安全防线
告别模板丑站!5个实战案例揭秘html网页制作动态效果安全防线

告别模板丑站!5个实战案例揭秘html网页制作动态效果安全防线 别再被那些千篇一律的模板网站恶心了。看着满屏的廉价感,客户嫌丑,自己看着也心累。 想做出有灵魂的站点,html网页制作动态效果是关键。但光好看没用,安全才是底线。… · 2026/9/28 0:15:26

网站建设是属于软件开发费吗进阶技巧
网站建设是属于软件开发费吗进阶技巧

网站建设属于软件开发费吗 3个实操细节教你选对服务商 很多老板一上来就问:我想做个官网,这钱算软件费还是服务?其实你不用纠结财务科目,真正该关心的是: 自己不会代码想做网站,到底找谁做才不踩坑?… · 2026/9/28 0:15:07

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

制作网页比较方便的软件怎么选?一文搞懂避坑指南
制作网页比较方便的软件怎么选?一文搞懂避坑指南

制作网页比较方便的软件怎么选?一文搞懂避坑指南 很多老板一上来就问:做个网站多少钱?但我反问他:你的域名买了吗?服务器租了吗?他一脸懵。这就是典型的“域名服务器搞不懂”。别急,今天咱们不聊虚的,直接 一文搞懂 那些让你头秃的技术名词。… · 2026/9/28 0:00:06

婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量
婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量

婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量 找婚恋网站建站公司,最怕的就是被坑高价。很多同行跟我吐槽,报价单上写得模棱两可,功能栏里全是“高级定制”、“专属UI”,结果落地全是套壳。今天不聊虚的,直接甩几个我经手的 实战案例… · 2026/9/28 0:00:19

济南做网站多少钱:3个案例拆解,防黑源码下载全攻略
济南做网站多少钱:3个案例拆解,防黑源码下载全攻略

济南做网站多少钱:3个案例拆解,防黑源码下载全攻略 上周济南一个做建材的老板找我,脸都绿了。他的官网首页弹出了赌博广告,后台被植入了挖矿脚本。他慌得问我:“网站被黑挂马不知道怎么办?能不能直接找之前的外包公司要源码下载,看看哪里被动了手脚?… · 2026/9/28 0:00:25

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码