589_Woodpecker CI
一句话概述:Woodpecker CI 是从 Drone 分叉的开源持续集成引擎,Server+Agent 架构,每步在独立容器中运行,配置简洁,内存占用仅 30MB,是最轻量的自托管 CI/CD 方案之一。
核心知识点表
| 概念 | 白话解释 |
|---|
| Server | 服务端,提供 Web UI 和 API,处理 Webhook |
| Agent | 代理端,实际执行构建任务的组件 |
| Workflow | 工作流,一组按顺序执行的步骤 |
| Matrix | 矩阵构建,用不同参数组合运行同一流水线 |
| Plugin | 插件,预打包的 Docker 镜像实现特定功能 |
| Forge | 代码平台,Woodpecker 支持 Gitea/GitHub/GitLab/Bitbucket |
安装配置
Docker Compose 部署
# docker-compose.yml
services:
woodpecker-server:
image: woodpeckerci/woodpecker-server:v3 # v3.x 版本
container_name: woodpecker-server
restart: always
ports:
- "8000:8000" # Web 界面
volumes:
- woodpecker-data:/var/lib/woodpecker # 数据(SQLite 存在这)
environment:
- WOODPECKER_OPEN=true # 允许注册
- WOODPECKER_HOST=https://ci.example.com # 外部访问地址
- WOODPECKER_GITEA=true # 使用 Gitea 作为代码平台
- WOODPECKER_GITEA_URL=https://git.example.com # Gitea 地址
- WOODPECKER_GITEA_CLIENT=your-client-id # OAuth Client ID
- WOODPECKER_GITEA_SECRET=your-client-secret # OAuth Secret
- WOODPECKER_AGENT_SECRET=${AGENT_SECRET} # Agent 通信密钥
woodpecker-agent:
image: woodpeckerci/woodpecker-agent:v3 # Agent
container_name: woodpecker-agent
restart: always
depends_on:
- woodpecker-server
volumes:
- /var/run/docker.sock:/var/run/docker.sock # Docker socket
environment:
- WOODPECKER_SERVER=woodpecker-server:9000 # gRPC 连接 Server
- WOODPECKER_AGENT_SECRET=${AGENT_SECRET} # 必须与 Server 一致
- WOODPECKER_MAX_WORKFLOWS=2 # 最大并行工作流数
volumes:
woodpecker-data:
# 生成通信密钥并保存到 .env
echo "AGENT_SECRET=$(openssl rand -hex 32)" > .env
docker compose up -d # 启动
基本使用
配置工作流(.woodpecker.yml)
# .woodpecker.yml(放在仓库根目录)
when:
event: [push, pull_request] # 触发事件
branch: main # 只在 main 分支
steps:
- name: install # 步骤1:安装依赖
image: node:20-alpine # 使用的 Docker 镜像
commands: # 执行的命令
- npm ci # 安装依赖
- name: test # 步骤2:测试
image: node:20-alpine
commands:
- npm test # 运行测试
- name: build # 步骤3:构建
image: node:20-alpine
commands:
- npm run build # 构建项目
- name: deploy # 步骤4:部署
image: plugins/docker # Docker 构建插件
settings:
repo: registry.example.com/app
tags: latest
username:
from_secret: reg_user # 从密钥中读取
password:
from_secret: reg_pass
when:
event: push
branch: main # 只在 main 分支 push 时部署
使用服务容器
# 启动数据库等辅助服务
services:
- name: postgres # PostgreSQL 服务
image: postgres:16
environment:
POSTGRES_DB: testdb
POSTGRES_PASSWORD: test
steps:
- name: test
image: node:20
environment:
DB_URL: postgres://postgres:test@postgres:5432/testdb
commands:
- npm run test:integration # 集成测试
多工作流
# .woodpecker/test.yml — 测试工作流
steps:
- name: test
image: python:3.12
commands:
- pip install -r requirements.txt
- pytest
# .woodpecker/deploy.yml — 部署工作流
depends_on: [test] # 依赖测试工作流通过
steps:
- name: deploy
image: plugins/ssh
settings:
host: { from_secret: server }
script: cd /app && docker compose pull && docker compose up -d
高级用法
矩阵构建
# 用不同版本并行测试
matrix:
NODE_VERSION:
- 18
- 20
- 22
steps:
- name: test
image: node:${NODE_VERSION} # 使用矩阵变量
commands:
- node --version
- npm test
密钥管理
# 方法1:Web 界面 → 仓库设置 → Secrets
# 方法2:CLI
woodpecker secret add \
--repository user/repo \
--name deploy_key \
--value "$(cat ~/.ssh/id_rsa)" # 添加 SSH 私钥
资源限制
# 限制容器资源使用
steps:
- name: build
image: node:20
# Woodpecker Agent 可配置全局资源限制:
# WOODPECKER_BACKEND_DOCKER_MEMORY=2g # 内存限制
# WOODPECKER_BACKEND_DOCKER_CPUS=1 # CPU 限制
常见报错
| 报错信息 | 原因 | 解决方案 |
|---|
agent not connected | Agent 无法连接 Server | 检查 AGENT_SECRET 和 gRPC 端口 |
pipeline not found | .woodpecker.yml 不存在 | 在仓库根目录创建配置文件 |
image pull error | Docker 镜像拉取失败 | 检查镜像名和网络连接 |
secret not found | 密钥未配置 | 在仓库设置中添加密钥 |
permission denied | Docker socket 权限 | 确保 Agent 能访问 Docker socket |
速查表
# === 默认端口 ===
# 8000 → Web UI(HTTP)
# 9000 → gRPC(Agent 通信)
# === 配置文件位置 ===
# .woodpecker.yml → 单文件配置
# .woodpecker/*.yml → 多工作流配置
# .woodpecker.yaml 也可以 → YAML 后缀
# === 内置变量 ===
CI_COMMIT_SHA # 提交 SHA
CI_COMMIT_BRANCH # 分支名
CI_COMMIT_TAG # Git tag
CI_BUILD_NUMBER # 构建编号
CI_REPO # 仓库名
CI_BUILD_STATUS # 构建状态
# === 支持的 Forge ===
# Gitea | Forgejo | GitHub | GitLab | Bitbucket
同类对比
| 特性 | Woodpecker | Drone | Jenkins | Gitea Actions |
|---|
| 内存占用 | ~30MB | ~50MB | ~1GB+ | 内置 |
| 开源协议 | Apache 2.0 | 自定义 | MIT | MIT |
| 社区活跃度 | 高 | 中(Harness) | 非常高 | 高 |
| 容器原生 | 是 | 是 | 插件 | 是 |
| K8s 后端 | 支持 | 支持 | 插件 | 不支持 |
| 配置复杂度 | 低 | 低 | 高 | 低(GH兼容) |
选型建议:想要最轻量的容器化 CI 选 Woodpecker(Drone 的纯开源替代);用 Gitea/Forgejo 可以直接用内置 Actions;需要插件生态选 Jenkins。