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-контейнеры на основе образов, указанных в конфигурации.
Схема архитектуры
+---------------------------+
| Система контроля версий |
| (GitHub, GitLab, Gitea) |
+---------------------------+
|
| Вебхуки/API
v
+---------------------------+
| Woodpecker Server |
| - Управление пайплайнами |
| - Подключение к VCS |
| - Планирование задач |
+---------------------------+
|
| Распределение задач
v
+---------------------------+
| Woodpecker Agent |
| - Выполнение задач |
| - Запуск Docker-контейнеров|
+---------------------------+
|
| Результаты выполнения
v
+---------------------------+
| Логи и Статус |
| (Веб-интерфейс/CLI) |
+---------------------------+
Процесс выполнения пайплайна
-
Интеграция с VCS:
- Woodpecker Server подключается к репозиторию через вебхуки или API VCS.
- При событии (например, push) сервер запускает соответствующий пайплайн.
-
Планирование задач:
- Сервер анализирует файл .woodpecker.yml и разбивает пайплайн на шаги.
- Задачи распределяются между доступными агентами.
-
Выполнение шагов:
- Агент получает задание и запускает Docker-контейнеры для каждого шага.
- Шаги выполняются последовательно или параллельно в зависимости от конфигурации.
-
Передача результатов:
- Агент возвращает результаты выполнения шагов серверу.
- Сервер сохраняет логи и статус выполнения пайплайна.
-
Обновление статуса в 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
---
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