Woodpecker CI 实战:搭建轻量级 CI/CD 流水线

引言

在现代软件交付中,CI/CD 流水线已经成为研发团队的基础设施。Woodpecker CI 是一个基于容器的轻量级开源 CI/CD 引擎,脱胎于社区对早期 Drone 的分叉,主打”无中心数据库、以容器为执行单元、配置即代码”的极简哲学。相比动辄需要 Java 运行时和海量插件的 Jenkins,Woodpecker 只由两个核心组件——server 与 agent——构成,整个服务可以用一份 docker-compose 在十分钟内跑起来。本文将手把手带你部署 Woodpecker CI、编写第一条 .woodpecker.yaml 流水线,并给出与 Drone、GitHub Actions 的选型对比,帮助你判断它是否适合你的团队。

一、Woodpecker CI 的核心架构

Woodpecker 的设计极其精简,整个系统只有两类角色,理解它们就理解了这套引擎的运转方式。

1.1 Server:调度与控制台

Server 负责接收代码托管平台(GitHub、Gitea、GitLab 等)的 Webhook、解析流水线配置、向 Agent 派发任务,并对外提供 Web 控制台。它把运行状态存储在一个嵌入式数据库(默认 SQLite,也支持 PostgreSQL)中,因此你不需要再单独维护一套 MySQL 或 Redis,部署负担被压到最低。

1.2 Agent:真正干活的节点

Agent 通过 gRPC 与 Server 保持长连接,拉取任务后在本地用 Docker 容器逐步执行流水线步骤。每一步都是一个独立容器,天然隔离、随用随销,这也是它”容器原生”的真正含义——没有常驻进程堆积,也没有环境串味。

1.3 与 Drone 的关系

很多读者会问:Woodpecker 和 Drone 到底有什么区别?二者早期同源,但开源策略走向不同。下面这张表可以快速看清差异(如果你想了解 Drone 本身的玩法,可参考我们之前发布的 Drone CI 实战:容器原生 CI/CD 流水线):

维度Woodpecker CIDrone CI
许可证Apache-2.0 全功能开源社区版功能受限,企业版收费
状态存储嵌入式 SQLite / Postgres需外部数据库
流水线语法.woodpecker.yaml.drone.yml
插件生态官方 plugins/* 同构自有插件体系
自托管门槛极低,单份 compose 起中等

可以看到,在”完全开源、零外部依赖”这一点上,Woodpecker 对中小团队更友好,而 Drone 的企业版能力则更适合有合规采购需求的组织。

二、十分钟快速部署

最省心的方式是用 docker-compose 同时拉起 server 和 agent。下面是一份可直接使用的配置(请将域名、OAuth 凭据替换为你自己的):

version: '3'
services:
  woodpecker-server:
    image: woodpeckerci/woodpecker-server:latest
    container_name: woodpecker-server
    ports:
      - "8000:8000"
    environment:
      - WOODPECKER_HOST=https://ci.example.com
      - WOODPECKER_SERVER_ADDR=:9000
      - WOODPECKER_GITHUB_CLIENT=your_github_client_id
      - WOODPECKER_GITHUB_SECRET=your_github_client_secret
      - WOODPECKER_AGENT_SECRET=change_me_to_a_long_random_string
    volumes:
      - woodpecker-data:/var/lib/woodpecker
    restart: unless-stopped

  woodpecker-agent:
    image: woodpeckerci/woodpecker-agent:latest
    container_name: woodpecker-agent
    command: agent
    depends_on:
      - woodpecker-server
    environment:
      - WOODPECKER_SERVER=woodpecker-server:9000
      - WOODPECKER_AGENT_SECRET=change_me_to_a_long_random_string
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    restart: unless-stopped

volumes:
  woodpecker-data:

把这份文件保存为 docker-compose.yml 后执行 docker compose up -d 即可。注意 agent 必须挂载宿主机的 /var/run/docker.sock,因为它要靠宿主 Docker 来创建执行容器。如果你还希望把控制台通过域名对外暴露,可以参考我们之前的 Nginx 反向代理完整配置 一文做 HTTPS 反代。

三、编写第一条流水线

Woodpecker 的流水线配置文件放在仓库根的 .woodpecker/ 目录,也可以直接放在根目录的 .woodpecker.yaml。下面是一个 Node.js 项目的典型流水线:

steps:
  install:
    image: node:20
    commands:
      - npm ci
      - npm run lint

  test:
    image: node:20
    commands:
      - npm test

  build:
    image: plugins/docker
    settings:
      repo: yourname/my-app
      tags: ${CI_COMMIT_TAG:-latest}
      username:
        from_secret: docker_user
      password:
        from_secret: docker_pass
    when:
      event: [push, tag]

每个 step 都用 image 指定运行容器,命令在容器内顺序执行;只要某一步非零退出,整条流水线即判定失败。最后的 plugins/docker 是官方构建并推送镜像的插件,凭据通过 from_secret 从 Woodpecker 后台密钥中心注入,绝不会明文出现在仓库里。关于 Docker 容器编排的基础,也可以回看 Docker Compose 一键编排。

四、三个必须掌握的配置技巧

4.1 密钥管理

在 Server 控制台或通过 CLI 为仓库配置密钥后,配置文件里用 from_secret: 名称 引用即可,例如上面的 Docker 凭据。密钥在 Web 界面不可回看,安全性足够日常使用,也避免了把 token 提交进 Git 的历史风险。

4.2 矩阵构建

需要跨版本验证时,矩阵(matrix)能一次性展开多组任务,省去复制粘贴步骤:

steps:
  test:
    image: node:${matrix.node}
    commands:
      - npm ci
      - npm test
matrix:
  node:
    - "18"
    - "20"
    - "22"

4.3 触发条件

通过 when 精确控制阶段在什么事件下执行:push、tag、pull_request、cron 都能自由组合。比如只在打 tag 时才构建并推送镜像,平时 push 只跑测试,避免无谓地往镜像仓库写 tag,也加快反馈速度。

五、进阶:缓存、插件与 Kubernetes Runner

流水线跑得慢,往往卡在依赖安装。Woodpecker 支持用 plugins/s3-cache 或本地 volume 缓存 node_modules,能把单轮构建从几分钟压到几十秒。插件方面,官方维护的 plugins/* 覆盖了 Docker 构建、Slack 通知、SSH 部署等常见需求;若官方没有现成插件,你也可以直接写一段任意镜像的 shell 命令,灵活性很高。

当单机 Docker 不够用时,Woodpecker 还提供 Kubernetes、Nomad 等 Runner,把任务调度到集群里执行,体验与 GitHub Actions 的 self-hosted runner 类似,但完全跑在你自己的基础设施上,数据不出内网。

六、Woodpecker 与同类工具怎么选

工具部署成本适用规模突出优势
Woodpecker CI低(单 compose)小到中型团队全开源、零外部依赖
Drone CI中中小团队生态成熟
GitHub Actions极低(SaaS)全规模与 GitHub 深度集成
Jenkins高大型 / 复杂插件海量、可编程极强

选型没有银弹:如果你的代码已经托管在 GitHub 且追求零运维,Actions 最省事;如果你坚持数据自持、想要一个干净不臃肿的自托管引擎,Woodpecker 是非常值得考虑的选项。我们也写过 Jenkins 实战 与 GitHub Actions 从零搭建,可以对照阅读。

七、生产落地建议

  • 给 agent 单独的资源配额,避免构建任务吃光宿主机内存触发 OOM,影响同机其他服务。
  • 用反向代理为 Server 开启 HTTPS,并开启注册白名单,防止陌生人滥用你的构建算力。
  • 把流水线运行状态接进 Prometheus + Grafana 监控,重点关注失败率与平均耗时,及时揪出”习惯性红构建”。
  • 定期清理旧的构建产物与镜像标签,别让镜像仓库被无限膨胀的 tag 撑爆磁盘。

总结

Woodpecker CI 用”两个组件、一份 compose、以容器为执行单元”的极简设计,把自托管 CI/CD 的门槛降到了最低。它完全开源、无外部数据库依赖,配置语法与 Drone 一脉相承却又更轻,是中小团队摆脱重型 Jenkins、又不愿把源码托付给 SaaS 的优质折中方案。从今天这份 docker-compose 起步,配合矩阵构建、密钥管理与插件体系,你很快就能拥有一套属于自己的、干净利落的持续交付流水线。

上一篇 技术写作实战:把复杂技术写清楚
下一篇 Spring Cloud 实战:微服务注册发现与远程调用
最新评论
Docker 网络模式详解:bridge/host 生产选型 - FSData
Docker 网络模式详解:bridge/host 生产选型 - FSData
8月20日
[…] 注意最后那条:把端口绑定到 127.0.0.1,再由宿主机上的 Nginx 反代进来,比直接 -p 80:80 暴露安全得多,也方便统一做
Vue3 + TypeScript 工程化:类型安全的前端架构 - FSData
Vue3 + TypeScript 工程化:类型安全的前端架构 - FSData
8月20日
[…] Pinia 的工程化用法,可以参考我们之前的实战文章 《Vue3 组合式 API + Pinia:状态管理从入门到实战》,那里覆盖了 Sto
2026 年最值得装的 10 个 VS Code 插件(AI/前端/后端/效率全覆盖) - FSData
2026 年最值得装的 10 个 VS Code 插件(AI/前端/后端/效率全覆盖) - FSData
8月19日
[…] 状态,点一下就能起停容器,配合我们讲过的 Docker Compose 编排 […]
Redis 缓存设计:穿透、击穿、雪崩与最佳实践 - FSData
Redis 缓存设计:穿透、击穿、雪崩与最佳实践 - FSData
8月19日
[…] 缓存三大坑的本质都是”缓存失效导致请求穿透到数据库”。记住口诀:穿透用布隆、击穿用锁、雪崩用错峰。配合合理的过期策略
GitHub Actions 实战:从零搭建 CI/CD 流水线 - FSData
GitHub Actions 实战:从零搭建 CI/CD 流水线 - FSData
8月19日
[…] Docker 镜像部署。结合我们之前写的 Docker Compose 一键编排实战,可以在 CI […]