Skip to content

📄 Drone CI

1. Общее описание

Drone — это современная система непрерывной интеграции (CI) с открытым исходным кодом, полностью построенная на контейнерах Docker. Она позволяет автоматизировать сборку, тестирование и деплой приложений через простую конфигурацию в файле .drone.yml.

Основные особенности:

  • Полностью построена на Docker.
  • Поддержка GitHub, GitLab, Gitea, Bitbucket и других SCM.
  • Простая YAML-ориентированная конфигурация.
  • Возможность self-hosted.
  • Поддержка плагинов, матричных билдов, условий и секретов.
  • Бесплатна и открыта (есть коммерческая версия — Drone Enterprise).

2. Архитектура Drone

Компонент Описание
Server Основной сервер Drone, который обрабатывает события из репозитория и запускает пайплайны.
Runner Агент, который выполняет этапы пайплайна внутри контейнеров. Может быть разных типов: docker, exec, kubernetes.
Repository Источник кода (например, GitHub), где находится проект и .drone.yml.
Pipeline Последовательность шагов, описанных в .drone.yml, которые Drone запускает после коммита или пула реквеста.

3. Основные понятия

Термин Определение
Pipeline Последовательность команд, разделённых на этапы.
Step Отдельный этап выполнения в pipeline. Каждый step — это отдельный Docker-контейнер.
Secret Защищённая переменная окружения, доступная только в runtime.
Environment Variable Переменная окружения, передаваемая в контейнер.
Plugin Преднастроенный Docker-образ для распространённых задач (например, уведомления, деплой).
Matrix Build Параллельное выполнение одного pipeline с разными параметрами.
Trigger Условие, при котором запускается pipeline (ветка, событие, пользователь).

4. Установка и настройка

4.1 Установка сервера Drone

Пример установки через Docker:

docker run \
  --volume=/var/lib/drone:/data \
  --env=DRONE_GITHUB_CLIENT_ID=your_client_id \
  --env=DRONE_GITHUB_CLIENT_SECRET=your_secret \
  --env=DRONE_RPC_SECRET=your_rpc_secret \
  --env=DRONE_SERVER_HOST=drone.example.com \
  --env=DRONE_SERVER_PROTO=https \
  --publish=80:80 \
  --publish=443:443 \
  --restart=always \
  --detach \
  drone/drone:latest

4.2 Настройка Runner (Docker)

docker run -d \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e DRONE_RPC_URL=http://drone-server \
  -e DRONE_RPC_SECRET=your_rpc_secret \
  -p 3000:3000 \
  --restart always \
  drone/drone-runner-docker

4.3 Интеграция с GitHub

Создайте OAuth App в GitHub: - Homepage URL: https://drone.example.com - Authorization callback URL: https://drone.example.com/login

Используйте полученные client_id и client_secret в конфиге сервера.


5. Конфигурационный файл .drone.yml

Это главный файл, управляющий поведением Drone. Он должен находиться в корне репозитория.

Пример базового pipeline

kind: pipeline
type: docker
name: default

steps:
  - name: build
    image: golang:1.21
    commands:
      - go mod download
      - go test ./...

Матричная сборка

matrix:
  GO_VERSION:
    - "1.19"
    - "1.20"
    - "1.21"

steps:
  - name: build
    image: golang:${GO_VERSION}
    commands:
      - go mod download
      - go test ./...

Плагины

Пример отправки уведомления в Slack:

- name: notify slack
  image: plugins/slack
  settings:
    webhook: https://hooks.slack.com/services/...
    channel: general
    username: drone

6. Управление секретами

Секреты можно добавлять через CLI или UI.

Пример через интерфейс:

  1. Перейдите в настройки репозитория в Drone.
  2. Добавьте секрет, например:
  3. Name: API_KEY
  4. Value: my-secret-key

Использование секрета в .drone.yml:

steps:
  - name: deploy
    image: alpine
    environment:
      API_KEY:
        from_secret: API_KEY
    commands:
      - echo $API_KEY

7. Работа с условиями

Вы можете фильтровать запуск пайплайнов по различным условиям:

when:
  branch:
    - main
  event:
    - push

Можно использовать: - branch: указывает, какие ветки триггерят билд. - event: какие события (push, pull_request, tag и т.д.). - environment: для фильтрации по средам.


8. Best Practices

  • Храните .drone.yml в репозитории.
  • Используйте матричные билды для тестирования под разные версии.
  • Не храните секреты в конфиге — используйте систему Secrets.
  • Разбивайте pipeline на логические шаги.
  • Используйте кэширование (через volume) для зависимостей.
  • Для сложных сценариев используйте собственные Docker-образы.

9. Полезные ссылки


10. FAQ

❓ Можно ли использовать Drone без Docker?

Да, есть exec runner, который работает без Docker, но тогда теряется изоляция окружений.

❓ Как проверить конфигурацию .drone.yml локально?

Используйте Drone CLI:

drone exec

❓ Как запустить билд вручную?

В UI нажмите кнопку "Rebuild", или используйте API.

❓ Поддерживает ли Drone Windows?

Ограниченная поддержка через Kubernetes runner.