Passa al contenuto principale
Versione: 0.5.6

Drone CI su Aruba Cloud

Esegui il deployment di Drone CI — una piattaforma di integrazione continua self-hosted — su Aruba Cloud tramite Terraform e cloud-init. Drone si integra con Gitea tramite OAuth2 ed esegue le pipeline di build all'interno di container Docker.

Versione provider: arubacloud/arubacloud ~> 1.0 | Terraform: ≥ 1.9


Introduzione​

Drone CI è una piattaforma CI/CD nativa per container dove ogni passo della pipeline viene eseguito in un container Docker isolato. Questo esempio esegue il provisioning di:

  • Drone Server (container Docker) — interfaccia web, API e orchestrazione delle pipeline
  • Drone Docker Runner (container Docker) — esegue i passi della pipeline sulla stessa VM
  • Docker installato dal repository apt Docker ufficiale
  • Integrazione OAuth2 con Gitea — gli utenti accedono a Drone con i loro account Gitea
  • Porta 80 per l'interfaccia web di Drone

Prerequisito: È richiesta un'istanza Gitea in esecuzione. Usa l'esempio Gitea o l'esempio Forgejo da questo repository, quindi segui i passaggi di configurazione OAuth2 descritti di seguito prima di eseguire terraform apply.


Panoramica dell'architettura​


Infrastruttura creata​

RisorsaPattern del nomeDescrizione
arubacloud_projectdrone-prodContenitore del progetto
arubacloud_vpcdrone-prod-vpcVirtual Private Cloud
arubacloud_subnetdrone-prod-subnetSubnet base
arubacloud_securitygroupdrone-prod-vm-sgSecurity group
arubacloud_securityruledrone-prod-vm-sshRegola ingress SSH
arubacloud_securityruledrone-prod-vm-httpRegola ingress HTTP TCP 80
arubacloud_elasticipdrone-prod-vm-eipIP pubblico della VM
arubacloud_blockstoragedrone-prod-bootDisco di boot da 40 GB (Performance)
arubacloud_keypairdrone-prod-keypairChiave pubblica SSH
arubacloud_cloudserverdrone-prod-vmVM CloudServer

Costo mensile stimato​

RisorsaSpecificheCosto stimato/mese
VM CloudServerCSO2A4 — 2 vCPU / 4 GB~€18
Disco di boot40 GB Performance~€6
Elastic IP—~€3
Totale~€27/mese

Requisiti​

  • Terraform ≥ 1.9
  • ArubaCloud Terraform Provider ~> 1.0
  • Un account ArubaCloud con credenziali API OAuth2
  • Una coppia di chiavi SSH
  • Un'istanza Gitea (o Forgejo) raggiungibile dalla VM Drone

Variabili​

Obbligatorie​

VariabileDescrizione
arubacloud_client_idClient ID OAuth2 di ArubaCloud
arubacloud_client_secretClient secret OAuth2 di ArubaCloud
ssh_public_keyContenuto della chiave pubblica SSH
gitea_urlURL base della tua istanza Gitea (es. http://1.2.3.4:3000)
gitea_client_idClient ID OAuth2 dall'applicazione OAuth Gitea
gitea_client_secretClient secret OAuth2 dall'applicazione OAuth Gitea
drone_rpc_secretSegreto condiviso tra il server Drone e il runner
drone_admin_userNome utente Gitea a cui concedere privilegi di admin Drone

Opzionali​

VariabileDefaultDescrizione
app_name"drone"Nome breve usato in tutti i nomi delle risorse
environment"prod"Etichetta dell'ambiente
location"ITBG-Bergamo"Regione ArubaCloud
zone"ITBG-1"Zona di disponibilità
billing_period"Hour""Hour" o "Month"
vm_flavor"CSO2A4"Flavor del CloudServer
vm_image"LU22-001"Immagine del disco di boot (Ubuntu 22.04 LTS)
vm_disk_size_gb40Dimensione del disco di boot in GB
ssh_cidr"0.0.0.0/0"CIDR per SSH
web_cidr"0.0.0.0/0"CIDR per l'interfaccia web Drone porta 80

Output​

OutputDescrizione
drone_urlURL dell'interfaccia web di Drone CI
gitea_oauth_redirect_urlURL di redirect da inserire quando si crea l'applicazione OAuth Gitea
vm_public_ipIndirizzo IP pubblico della VM
ssh_commandComando SSH per connettersi alla VM

Istruzioni di deployment​

Drone CI richiede un'applicazione OAuth2 Gitea prima del deployment. L'URL di redirect include l'IP Elastico della VM Drone, che non è noto fino al primo terraform apply. Usa l'approccio in due fasi di seguito.

Fase 1 — Ottieni l'IP Elastico​

Applica con valori Gitea segnaposto per eseguire il provisioning della VM e ottenere il suo IP:

cp terraform.tfvars.example terraform.tfvars
# Compila le credenziali ArubaCloud, ssh_public_key, e valori segnaposto temporanei:
# gitea_url = "http://placeholder"
# gitea_client_id = "placeholder"
# gitea_client_secret = "placeholder"
# drone_rpc_secret = "placeholderplaceholder"
# drone_admin_user = "placeholder"

terraform init
terraform apply
terraform output gitea_oauth_redirect_url
# → http://<drone-ip>/login

Fase 2 — Crea l'applicazione OAuth Gitea​

Nella tua istanza Gitea: Impostazioni → Applicazioni → Applicazioni OAuth2 → Crea

  • Nome applicazione: Drone CI
  • URI di redirect: http://<drone-ip>/login (dall'output della Fase 1)

Copia il Client ID e il Client Secret.

Fase 3 — Ri-applica con le credenziali reali​

Aggiorna terraform.tfvars con i valori reali:

gitea_url = "http://your-gitea-ip:3000"
gitea_client_id = "real-client-id"
gitea_client_secret = "real-client-secret"
drone_rpc_secret = "$(openssl rand -hex 16)"
drone_admin_user = "your-gitea-username"
terraform apply

Terraform sostituisce il user_data della VM e la VM viene ricreata con la configurazione corretta. Il bootstrap richiede circa 3–5 minuti.

Fase 4 — Accedi a Drone​

terraform output drone_url

Apri l'URL nel browser e accedi con il tuo account Gitea. Il drone_admin_user riceve automaticamente i privilegi di amministratore.


La tua prima pipeline​

Aggiungi un file .drone.yml a qualsiasi repository Gitea:

kind: pipeline
type: docker
name: default

steps:
- name: test
image: alpine
commands:
- echo "Hello from Drone CI!"
- uname -a

Esegui un push su Gitea — Drone riceve il webhook ed esegue automaticamente la pipeline.


Risoluzione dei problemi​

L'interfaccia di Drone non si carica​

ssh ubuntu@$(terraform output -raw vm_public_ip)
docker compose -f /opt/drone/docker-compose.yml ps
docker compose -f /opt/drone/docker-compose.yml logs drone-server

Il login OAuth fallisce (redirect URI mismatch)​

L'URI di redirect in Gitea deve corrispondere esattamente a http://<drone-ip>/login. Verifica:

  1. Gitea → Impostazioni → Applicazioni → la tua app OAuth → URI di redirect
  2. Il valore deve essere http://<drone-ip>/login (senza slash finale, IP corretto)

Il runner non preleva i job​

docker compose -f /opt/drone/docker-compose.yml logs drone-runner

Il runner si connette al server tramite la rete interna Docker (hostname drone-server). Verifica che entrambi i container siano in esecuzione:

docker compose -f /opt/drone/docker-compose.yml ps

Riferimenti​