Skip to content

Woodpecker

Woodpecker CI — это современная система для организации непрерывной интеграции и развертывания (CI/CD). Она позволяет автоматизировать процессы сборки, тестирования, и деплоя приложений, упрощая работу разработчиков и DevOps-инженеров. Woodpecker CI — это форк Drone CI, который развивается независимо и активно поддерживается сообществом.

Архитектура woodpecker

  • Woodpecker Server Основной компонент, управляющий пайплайнами и взаимодействующий с системами контроля версий (VCS) и агентами. Отвечает за:

    • Подключение к VCS (GitHub, GitLab, Gitea, Bitbucket и др.).
    • Хранение конфигураций пайплайнов (.woodpecker.yml).
    • Генерацию событий для триггера пайплайнов (например, push, pull request).
    • Координацию выполнения задач с агентами.
  • Woodpecker Agent Рабочий компонент, который выполняет шаги пайплайна. Каждый агент:

    • Получает задания от сервера.
    • Запускает Docker-контейнеры для изолированного выполнения шагов.
    • Возвращает результаты выполнения серверу.
    • Может быть установлен на отдельной машине или в том же окружении, где развернут сервер.
  • Система контроля версий (VCS) Woodpecker Server интегрируется с VCS для:

    • Отслеживания изменений в репозиториях.
    • Получения .woodpecker.yml из репозитория.
    • Генерации событий для запуска пайплайнов.
  • Docker

    • Используется для изоляции и выполнения каждого шага пайплайна в отдельном контейнере.
    • Агент запускает Docker-контейнеры на основе образов, указанных в конфигурации.

Схема архитектуры

Text Only
+---------------------------+
|   Система контроля версий  |
|  (GitHub, GitLab, Gitea)   |
+---------------------------+
             |
             | Вебхуки/API
             v
+---------------------------+
|     Woodpecker Server      |
|  - Управление пайплайнами  |
|  - Подключение к VCS       |
|  - Планирование задач      |
+---------------------------+
             |
             | Распределение задач
             v
+---------------------------+
|     Woodpecker Agent       |
|  - Выполнение задач        |
|  - Запуск Docker-контейнеров|
+---------------------------+
             |
             | Результаты выполнения
             v
+---------------------------+
|        Логи и Статус       |
|   (Веб-интерфейс/CLI)      |
+---------------------------+

Процесс выполнения пайплайна

  1. Интеграция с VCS:

    • Woodpecker Server подключается к репозиторию через вебхуки или API VCS.
    • При событии (например, push) сервер запускает соответствующий пайплайн.
  2. Планирование задач:

    • Сервер анализирует файл .woodpecker.yml и разбивает пайплайн на шаги.
    • Задачи распределяются между доступными агентами.
  3. Выполнение шагов:

    • Агент получает задание и запускает Docker-контейнеры для каждого шага.
    • Шаги выполняются последовательно или параллельно в зависимости от конфигурации.
  4. Передача результатов:

    • Агент возвращает результаты выполнения шагов серверу.
    • Сервер сохраняет логи и статус выполнения пайплайна.
  5. Обновление статуса в VCS:

    • После завершения пайплайна сервер обновляет статус сборки в системе контроля версий (например, успешная или проваленная сборка).

Разворачиваем woodpecker

Самый простой способ развернуть ci/cd систему woodpecker (с сервером и одним агентом) - использовать docker compose.

Другие способы с офф. сайта

Ниже приведен docker-compose файл, который создает готовую к использованию CI/CD систему gitea+woodpecker.

  • Gitea готова к работе, необходимо только добавить файлы с секретами для БД. После первоначального запуска gitea, ее необходимо инициализировать, затем создать пользователей, репозитории, и добавить приложение для аутентификации woodpecker.
  • Woodpecker настроен на работу в docker-сети с gitea. Необходимо добавить секреты для аутентификации на сервере gitea и секрет для взаимодействия между клиентом и сервером.
  • Proxy. Для работы системы понадобится обратный прокси, поскольку сервисы gitea и woodpecker (в данном примере) слушают на localhost.
  • Backup service. Добавлен сервис для резервирования томов docker
YAML
---
networks:
  gitea:
    driver: bridge

volumes:
  db_data: {}
  git_data: {}
  woodpecker-server-data: {}
  woodpecker-agent-config: {}

secrets:
  db_secret: # password к БД для gitea
    file: ./docker-secrets/gitea_db_password
  root_db_secret: # root pathword
    file: ./docker-secrets/gitea_root_db_password
  WOODPECKER_AGENT_SECRET: # секрет для коммуникации междк агентом и сервером
    file: ./docker-secrets/WOODPECKER_AGENT_SECRET # создается вручную, например командой openssl rand -hex 32
  WOODPECKER_GITEA_CLIENT: # ID авторизованного в gitea OAuth2 приложения
    file: ./docker-secrets/WOODPECKER_GITEA_CLIENT # создается через интерфейс gitea
  WOODPECKER_GITEA_SECRET: #  секрет авторизованного в gitea OAuth2 приложения
    file: ./docker-secrets/WOODPECKER_GITEA_SECRET # создается через интерфейс gitea


services:

  backup: # сервис для резервирования docker volumes
    image: offen/docker-volume-backup:latest
    restart: always
    environment:
      BACKUP_CRON_EXPRESSION: "0 3 * * *"
      BACKUP_FILENAME: git_ci-backup-%Y-%m-%dT%H-%M-%S.tar.gz
      BACKUP_LATEST_SYMLINK: git_ci-backup-latest.tar.gz
      BACKUP_PRUNING_PREFIX: git_ci-backup-
      BACKUP_RETENTION_DAYS: 7
    volumes:
      - db_data:/backup/db_data-backup:ro
      - git_data:/backup/git_data-backup:ro
      - woodpecker-server-data:/backup/woodpecker-server-data:ro
      - woodpecker-agent-config:/backup/woodpecker-agent-config:ro 

      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /backups/docker/gitea_woodpecker:/archive

      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro


  gitea: # сервис для управления git
    image: gitea/gitea:latest
    container_name: gitea
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - DB_TYPE=postgres
      - DB_HOST=db:5432
      - DB_NAME=gitea
      - DB_USER=gitea
      - DB_PASSWD_FILE=/run/secrets/db_secret
      - DISABLE_REGISTRATION=true
      - ENABLE_REVERSE_PROXY_AUTHENTICATION=true
    secrets:
      - db_secret
    restart: always
    volumes:
      - git_data:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "127.0.0.1:3001:3000" # пробрасываем порт для web-интерфейса
      - "22:22" # пробрасываем порт для работы с git по ssh
    depends_on:
      - db
    networks:
      - gitea
    # labels:
    #   # перед созданием резервной копии, контейнер будет остановлен
    #   - docker-volume-backup.stop-during-backup=true 

  db: # сервис БД для gitea
    image: postgres:alpine
    container_name: gitea_db
    environment:
      - POSTGRES_ROOT_PASSWORD_FILE=/run/secrets/root_db_secret
      - POSTGRES_PASSWORD_FILE=/run/secrets/db_secret
      - POSTGRES_USER=gitea
      - POSTGRES_DB=gitea
      - POSTGRES_INITDB_ARGS="--encoding=UTF8"
    secrets:
      - db_secret
      - root_db_secret
    restart: always
    volumes:
      - db_data:/var/lib/postgresql/data
    expose:
      - 5432
    networks:
      - gitea

  woodpecker-server: # сервис разворачивающий woodpecker
    image: woodpeckerci/woodpecker-server:latest
    ports:
      - "127.0.0.1:3002:8000" # пробрасываем порт для web-интерфейса
    volumes:
      - woodpecker-server-data:/var/lib/woodpecker/
    environment:
      - WOODPECKER_OPEN=false
      - WOODPECKER_HOST=https://ci.example.com # указываем свой URL
      - WOODPECKER_AGENT_SECRET_FILE=/run/secrets/WOODPECKER_AGENT_SECRET
      - WOODPECKER_ADMIN=akula
      - WOODPECKER_GITEA=true
      - WOODPECKER_GITEA_URL=https://git.example.com # указываем URL с gitea
      - WOODPECKER_GITEA_CLIENT_FILE=/run/secrets/WOODPECKER_GITEA_CLIENT
      - WOODPECKER_GITEA_SECRET_FILE=/run/secrets/WOODPECKER_GITEA_SECRET
      - WOODPECKER_GITEA_SKIP_VERIFY=true
    secrets: # пробрасываем секреты
      - WOODPECKER_AGENT_SECRET
      - WOODPECKER_GITEA_CLIENT
      - WOODPECKER_GITEA_SECRET
    networks:
      - gitea

  woodpecker-agent:
    image: woodpeckerci/woodpecker-agent:latest
    command: agent
    restart: always
    depends_on:
      - woodpecker-server
    volumes:
      - woodpecker-agent-config:/etc/woodpecker
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - WOODPECKER_SERVER=woodpecker-server:9000 # указываем месторасположения сервера
      - WOODPECKER_AGENT_SECRET_FILE=/run/secrets/WOODPECKER_AGENT_SECRET # указываем где хранится секрет
      - WOODPECKER_BACKEND_DOCKER_NETWORK=gitea_gitea # очень ВАЖНЫЙ параметр
    secrets:
      - WOODPECKER_AGENT_SECRET # пробрасываем в контейнер секрет
    networks:
      - gitea