跳转至

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 connectedAgent 无法连接 Server检查 AGENT_SECRET 和 gRPC 端口
pipeline not found.woodpecker.yml 不存在在仓库根目录创建配置文件
image pull errorDocker 镜像拉取失败检查镜像名和网络连接
secret not found密钥未配置在仓库设置中添加密钥
permission deniedDocker 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

同类对比

特性WoodpeckerDroneJenkinsGitea Actions
内存占用~30MB~50MB~1GB+内置
开源协议Apache 2.0自定义MITMIT
社区活跃度中(Harness)非常高
容器原生插件
K8s 后端支持支持插件不支持
配置复杂度低(GH兼容)

选型建议:想要最轻量的容器化 CI 选 Woodpecker(Drone 的纯开源替代);用 Gitea/Forgejo 可以直接用内置 Actions;需要插件生态选 Jenkins。