Drone CI — lekki self-hosted CI/CD dla projektów Git
Opublikowano: 10 kwietnia 2026 · Kategoria: VPS i serwery
GitHub Actions jest wygodne, ale każde uruchomienie pobiera minuty z puli i każde zużycie kosztuje przy prywatnych repozytoriach. Jenkins jest potężny, ale rozbudowany — kilkaset MB JAR, Groovy DSL i dziesiątki wtyczek do skonfigurowania. Drone CI to złoty środek: kontenerowy CI/CD w Go, konfigurowany jednym plikiem YAML, działający na VPS za kilkanaście złotych. Ten artykuł przeprowadza przez instalację Drone Server i Docker Runner, integrację z Gitea przez OAuth, definiowanie pipeline .drone.yml i zarządzanie sekretami.
Instalacja Drone Server
Drone Server i Runner uruchamiamy przez Docker Compose. Server obsługuje UI, API i webhooki z repozytorium Git. Runner pobiera zadania z Servera i wykonuje je w kontenerach Docker.
# docker-compose.yml
version: "3.9"
services:
drone-server:
image: drone/drone:2
container_name: drone-server
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./drone-data:/data
environment:
# Gitea OAuth (patrz nizej jak uzyskac)
- DRONE_GITEA_SERVER=https://git.example.com
- DRONE_GITEA_CLIENT_ID=GITEA_OAUTH_CLIENT_ID
- DRONE_GITEA_CLIENT_SECRET=GITEA_OAUTH_CLIENT_SECRET
# Konfiguracja serwera
- DRONE_RPC_SECRET=losowy-secret-min-32-znaki
- DRONE_SERVER_HOST=drone.example.com
- DRONE_SERVER_PROTO=https
# Opcjonalnie: tylko wybrani admini
- DRONE_USER_FILTER=myuser,teamuser
drone-runner:
image: drone/drone-runner-docker:1
container_name: drone-runner
restart: unless-stopped
depends_on:
- drone-server
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- DRONE_RPC_PROTO=http
- DRONE_RPC_HOST=drone-server
- DRONE_RPC_SECRET=losowy-secret-min-32-znaki
- DRONE_RUNNER_CAPACITY=2 # max 2 rownoczesne pipeline
- DRONE_RUNNER_NAME=vps-runner Konfiguracja OAuth w Gitea
Drone loguje użytkowników przez OAuth z serwera Git. W Gitea tworzysz Application OAuth2 w ustawieniach konta lub (jako admin) globalnie.
# W Gitea UI: # Settings → Applications → OAuth 2.0 Applications → Create OAuth2 Application # Application Name: Drone CI # Redirect URI: https://drone.example.com/login # Kliknij "Create Application" # Skopiuj Client ID i Client Secret → wklej do docker-compose.yml # Dla GitHub zamiast Gitea: # github.com → Settings → Developer Settings → OAuth Apps → New OAuth App # Homepage URL: https://drone.example.com # Authorization callback URL: https://drone.example.com/login # Zamien DRONE_GITEA_* na DRONE_GITHUB_CLIENT_ID i DRONE_GITHUB_CLIENT_SECRET # Uruchom Drone docker compose up -d # Otwórz https://drone.example.com → zaloguj sie przez Gitea OAuth
Plik .drone.yml — pipeline stages i steps
Pipeline definiujesz w pliku .drone.yml w root repozytorium. Każdy step wykonuje
się w oddzielnym kontenerze Docker — możesz używać dowolnego obrazu z Docker Hub lub prywatnego
rejestru Harbor.
---
kind: pipeline
type: docker
name: default
# Trigger: tylko na push do main i PR
trigger:
branch:
- main
- develop
event:
- push
- pull_request
steps:
# Step 1: instalacja zależności
- name: install
image: node:20-alpine
commands:
- npm ci
# Step 2: testy (równolegle z lintem po zainstalowaniu)
- name: test
image: node:20-alpine
depends_on:
- install
commands:
- npm test
# Step 3: lint (równolegle z testem)
- name: lint
image: node:20-alpine
depends_on:
- install
commands:
- npm run lint
# Step 4: build i push do Harbor (tylko main)
- name: docker-build
image: plugins/docker
depends_on:
- test
- lint
settings:
registry: harbor.example.com
repo: harbor.example.com/myproject/myapp
tags:
- latest
- ${DRONE_COMMIT_SHA:0:8}
username:
from_secret: harbor_user
password:
from_secret: harbor_password
when:
branch:
- main
event:
- push
# Step 5: deploy przez SSH (tylko main)
- name: deploy
image: appleboy/drone-ssh
depends_on:
- docker-build
settings:
host: prod.example.com
username: deploy
key:
from_secret: ssh_deploy_key
script:
- docker pull harbor.example.com/myproject/myapp:latest
- docker compose -f /opt/myapp/docker-compose.yml up -d myapp
when:
branch:
- main
event:
- push Zarządzanie sekretami
# Instalacja Drone CLI curl -L https://github.com/harness/drone-cli/releases/latest/download/drone_linux_amd64.tar.gz \ | tar zx sudo mv drone /usr/local/bin/drone # Konfiguracja CLI (token z Settings → User → API Keys) export DRONE_SERVER=https://drone.example.com export DRONE_TOKEN=twoj-token-api # Dodaj sekrety (dla konkretnego repozytorium) drone secret add --repository owner/myapp --name harbor_user --data robot\$ci drone secret add --repository owner/myapp --name harbor_password --data ROBOT_TOKEN drone secret add --repository owner/myapp --name ssh_deploy_key --data @/path/to/id_rsa # Secrets globalne (dla wszystkich repo organizacji) drone orgsecret add myorg harbor_user robot\$ci # Lista sekretów drone secret ls --repository owner/myapp
Porównanie Drone CI vs Jenkins vs GitHub Actions
| Cecha | Drone CI | Jenkins | GitHub Actions |
|---|---|---|---|
| Min. RAM | 256 MB (server) | 512 MB (JVM) | N/A (SaaS) |
| Koszt dla prywatnych repo | Koszt VPS | Koszt VPS | $4/msc (2000 min free) |
| Format konfiguracji | YAML (.drone.yml) | Groovy (Jenkinsfile) | YAML (.github/workflows/) |
| Izolacja kroków | Każdy step = kontener | Agenci, węzły, Docker | Każdy job = VM lub kontener |
| Trudność setup | Łatwa (Docker Compose) | Średnia (wiele wtyczek) | Brak (SaaS) |
| Marketplace wtyczek | Drone Plugins (~100) | Jenkins Plugins (1900+) | GitHub Marketplace (20k+) |
| Zgodność z GitHub Actions | Nie | Nie | Tak (natywne) |