Что такое Drone CI?

Drone — это современная Container-native CI/CD платформа, которая выполняет каждый шаг пайплайна в изолированном Docker контейнере. Это обеспечивает консистентность, безопасность и простоту масштабирования сборочных процессов.

Ключевые особенности Drone

  • Container-native — каждый шаг выполняется в Docker контейнере
  • YAML конфигурация — простое описание пайплайнов
  • Автоматическое масштабирование — поддержка Kubernetes
  • Плагины — богатая экосистема готовых решений
  • Multi-platform — Linux, Windows, macOS, ARM
  • Git интеграция — GitHub, GitLab, Bitbucket, Gitea

Установка Drone

Установка с помощью Docker Compose:

 1# docker-compose.yml
 2version: '3.8'
 3services:
 4  drone:
 5    image: drone/drone:2
 6    ports:
 7      - "80:80"
 8      - "443:443"
 9    volumes:
10      - drone-data:/data
11    environment:
12      - DRONE_GITHUB_CLIENT_ID=your_github_client_id
13      - DRONE_GITHUB_CLIENT_SECRET=your_github_client_secret
14      - DRONE_RPC_SECRET=super-duper-secret
15      - DRONE_SERVER_HOST=drone.example.com
16      - DRONE_SERVER_PROTO=https
17      
18  drone-runner:
19    image: drone/drone-runner-docker:1
20    volumes:
21      - /var/run/docker.sock:/var/run/docker.sock
22    environment:
23      - DRONE_RPC_PROTO=https
24      - DRONE_RPC_HOST=drone.example.com
25      - DRONE_RPC_SECRET=super-duper-secret
26      - DRONE_RUNNER_CAPACITY=2
27      - DRONE_RUNNER_NAME=my-runner
28      
29volumes:
30  drone-data:

Запуск:

1# Запуск Drone
2docker-compose up -d
3
4# Проверка статуса
5docker-compose ps

Создание пайплайна

Файл .drone.yml в корне репозитория:

 1kind: pipeline
 2type: docker
 3name: default
 4
 5steps:
 6- name: test
 7  image: node:16-alpine
 8  commands:
 9  - npm ci
10  - npm test
11  
12- name: build
13  image: node:16-alpine
14  commands:
15  - npm run build
16  when:
17    branch:
18    - main
19    
20- name: docker-build
21  image: plugins/docker
22  settings:
23    repo: myorg/myapp
24    tags: 
25    - latest
26    - ${DRONE_COMMIT_SHA:0:8}
27    username:
28      from_secret: docker_username
29    password:
30      from_secret: docker_password
31  when:
32    branch:
33    - main
34    
35- name: deploy
36  image: plugins/ssh
37  settings:
38    host: production-server.com
39    username: deploy
40    key:
41      from_secret: ssh_key
42    script:
43    - docker pull myorg/myapp:${DRONE_COMMIT_SHA:0:8}
44    - docker-compose up -d
45  when:
46    branch:
47    - main

Использование плагинов

Drone имеет обширную экосистему плагинов:

 1steps:
 2- name: slack-notification
 3  image: plugins/slack
 4  settings:
 5    webhook:
 6      from_secret: slack_webhook
 7    channel: "#ci-cd"
 8    template: >
 9      {{#success build.status}}
10        ✅ Build {{build.number}} succeeded for {{repo.name}}
11      {{else}}
12        ❌ Build {{build.number}} failed for {{repo.name}}
13      {{/success}}
14      
15- name: s3-upload
16  image: plugins/s3
17  settings:
18    bucket: my-artifacts
19    access_key:
20      from_secret: aws_access_key
21    secret_key:
22      from_secret: aws_secret_key
23    source: dist/**/*
24    target: /releases/${DRONE_TAG}
25  when:
26    event:
27    - tag
28    
29- name: kubernetes-deploy
30  image: plugins/kubernetes
31  settings:
32    kubernetes_server:
33      from_secret: k8s_server
34    kubernetes_token:
35      from_secret: k8s_token
36    deployment: myapp
37    repo: myorg/myapp
38    tag: ${DRONE_COMMIT_SHA:0:8}

Условное выполнение

 1steps:
 2- name: test-frontend
 3  image: node:16
 4  commands:
 5  - npm test
 6  when:
 7    path:
 8      include:
 9      - "frontend/**"
10      
11- name: test-backend
12  image: python:3.9
13  commands:
14  - pytest
15  when:
16    path:
17      include:
18      - "backend/**"
19      
20- name: deploy-staging
21  image: plugins/ssh
22  when:
23    branch:
24    - develop
25    event:
26    - push
27    
28- name: deploy-production
29  image: plugins/ssh
30  when:
31    branch:
32    - main
33    event:
34    - promote
35    target:
36    - production

Работа с секретами

 1# Добавление секрета через CLI
 2drone secret add myorg/myrepo \
 3  --name docker_password \
 4  --value "my-secret-password"
 5
 6# Секрет только для определённых событий
 7drone secret add myorg/myrepo \
 8  --name production_key \
 9  --value "prod-secret" \
10  --event push \
11  --event tag

Матричные сборки

 1kind: pipeline
 2type: docker
 3name: matrix-build
 4
 5steps:
 6- name: test
 7  image: node:${NODE_VERSION}
 8  commands:
 9  - npm ci
10  - npm test
11
12matrix:
13  NODE_VERSION:
14  - "14"
15  - "16"
16  - "18"
17  
18---
19kind: pipeline
20type: docker
21name: multi-arch
22
23platform:
24  os: linux
25  arch: ${ARCH}
26
27steps:
28- name: build
29  image: golang:1.19
30  commands:
31  - go build -o app-${ARCH}
32
33matrix:
34  ARCH:
35  - amd64
36  - arm64

Интеграция с Kubernetes

Развертывание Drone в Kubernetes:

 1# drone-namespace.yaml
 2apiVersion: v1
 3kind: Namespace
 4metadata:
 5  name: drone
 6---
 7# drone-server.yaml
 8apiVersion: apps/v1
 9kind: Deployment
10metadata:
11  name: drone-server
12  namespace: drone
13spec:
14  replicas: 1
15  selector:
16    matchLabels:
17      app: drone-server
18  template:
19    metadata:
20      labels:
21        app: drone-server
22    spec:
23      containers:
24      - name: drone-server
25        image: drone/drone:2
26        ports:
27        - containerPort: 80
28        env:
29        - name: DRONE_GITHUB_CLIENT_ID
30          valueFrom:
31            secretKeyRef:
32              name: drone-secrets
33              key: github-client-id

Мониторинг и логи

 1# Просмотр логов сборки
 2drone build logs myorg/myrepo 1
 3
 4# Информация о репозитории
 5drone repo info myorg/myrepo
 6
 7# Список последних сборок
 8drone build list myorg/myrepo
 9
10# Перезапуск сборки
11drone build restart myorg/myrepo 1

Создание собственного плагина

 1# plugin.py
 2#!/usr/bin/env python3
 3import os
 4import requests
 5
 6def main():
 7    # Получение переменных окружения
 8    webhook_url = os.environ.get('PLUGIN_WEBHOOK_URL')
 9    message = os.environ.get('PLUGIN_MESSAGE', 'Build completed')
10    
11    # Отправка уведомления
12    payload = {
13        'text': message,
14        'build_number': os.environ.get('DRONE_BUILD_NUMBER'),
15        'repo': os.environ.get('DRONE_REPO'),
16        'branch': os.environ.get('DRONE_BRANCH')
17    }
18    
19    response = requests.post(webhook_url, json=payload)
20    if response.status_code != 200:
21        exit(1)
22
23if __name__ == '__main__':
24    main()
1# Dockerfile для плагина
2FROM python:3.9-alpine
3RUN pip install requests
4COPY plugin.py /plugin.py
5RUN chmod +x /plugin.py
6ENTRYPOINT ["/plugin.py"]

Сравнение с другими CI системами

ОсобенностьDroneJenkinsGitLab CI
Container-nativeДаЧастичноДа
Простота настройкиВысокаяНизкаяСредняя
МасштабированиеАвтоматическоеРучноеАвтоматическое
ПлагиныDocker-basedМножествоВстроенные

Случаи использования Drone

  • Микросервисная архитектура — изоляция сборок
  • Cloud-native приложения — Kubernetes интеграция
  • Multi-platform проекты — поддержка разных архитектур
  • DevOps команды — простота управления и масштабирования

Преимущества Drone

  • Полная изоляция каждого шага сборки
  • Простая и понятная YAML конфигурация
  • Автоматическое масштабирование в облаке
  • Богатая экосистема плагинов
  • Отличная интеграция с контейнерными технологиями

Рекомендации по использованию

  • Используй официальные образы для популярных языков
  • Кешируй зависимости между сборками
  • Настрой уведомления о статусе сборок
  • Применяй условное выполнение для оптимизации

FAQ

Подходит ли Drone для больших монорепозиториев?

Да, Drone поддерживает условное выполнение на основе изменённых путей, что делает его эффективным для монорепозиториев.

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

Нет, Drone полностью основан на контейнерах. Для сред без Docker лучше рассмотреть другие CI системы.