Что такое 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:
Запуск:
Создание пайплайна
Файл .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
Работа с секретами
Матричные сборки
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# 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()
Сравнение с другими CI системами
Особенность | Drone | Jenkins | GitLab CI |
---|---|---|---|
Container-native | Да | Частично | Да |
Простота настройки | Высокая | Низкая | Средняя |
Масштабирование | Автоматическое | Ручное | Автоматическое |
Плагины | Docker-based | Множество | Встроенные |
Случаи использования Drone
- Микросервисная архитектура — изоляция сборок
- Cloud-native приложения — Kubernetes интеграция
- Multi-platform проекты — поддержка разных архитектур
- DevOps команды — простота управления и масштабирования
Преимущества Drone
- Полная изоляция каждого шага сборки
- Простая и понятная YAML конфигурация
- Автоматическое масштабирование в облаке
- Богатая экосистема плагинов
- Отличная интеграция с контейнерными технологиями
Рекомендации по использованию
- Используй официальные образы для популярных языков
- Кешируй зависимости между сборками
- Настрой уведомления о статусе сборок
- Применяй условное выполнение для оптимизации
FAQ
Подходит ли Drone для больших монорепозиториев?
Да, Drone поддерживает условное выполнение на основе изменённых путей, что делает его эффективным для монорепозиториев.
Можно ли запускать Drone без Docker?
Нет, Drone полностью основан на контейнерах. Для сред без Docker лучше рассмотреть другие CI системы.