Ricerca nel sito web

Come utilizzare Rsync e SSH in una pipeline CI GitLab dockerizzata


rsync è una popolare utility di sincronizzazione dei file che utilizza un algoritmo efficiente per ridurre al minimo il consumo di larghezza di banda. Uno dei ruoli comuni di rsync è la distribuzione di una build di un sito Web su un server di produzione remoto. Ecco come combinare la versatilità di rsync con l'automazione fornita dalle pipeline GitLab CI.

Esecutori della pipeline

GitLab CI supporta diversi tipi di esecutori di pipeline. Questi definiscono l'ambiente in cui verrà eseguito il lavoro. L'esecutore shell è l'impostazione predefinita ed esegue bare metal sulla macchina host. Consente alle tue pipeline di utilizzare qualsiasi comando disponibile sull'host senza ulteriore configurazione. Poiché le distribuzioni Linux più popolari vengono fornite con rsync installato, questo approccio è facile da gestire.

Sfortunatamente, l'esecutore shell non fornisce un forte isolamento e può inquinare l'ambiente del tuo host nel tempo. Un'alternativa migliore è l'esecutore docker, che crea un nuovo contenitore Docker per ogni processo CI. Tutti i lavori vengono eseguiti in un ambiente pulito che non può influire sull'host.

Lo svantaggio qui è che le immagini di base di Docker generalmente non includono rsync o ssh. Anche le immagini ufficiali del sistema operativo come ubuntu:latest vengono fornite come build minime senza questi comandi. Ciò rende uno script della pipeline leggermente più complesso per aggiungere le dipendenze e rsync i tuoi file.

Ecco come aggiungere rsync alla tua pipeline. Assicurati di avere a disposizione un GitLab Runner basato su Docker prima di continuare. Supponiamo anche che tu abbia un progetto GitLab pronto per l'uso.

Prepararsi

Avrai bisogno di una coppia di chiavi SSH disponibile se utilizzerai rsync per connetterti a un host SSH remoto. Puoi generare chiavi pubbliche e private eseguendo ssh-keygen -t rsa. Copia la chiave pubblica sul server a cui ti connetterai.

Successivamente, copia la chiave privata generata negli appunti:

cat ~/.ssh/id_rsa | xclip -selection c

Vai al tuo progetto GitLab e fai clic su Impostazioni nella parte inferiore del menu di navigazione a sinistra. Fare clic sulla voce CI/CD nel sottomenu. Scorri verso il basso fino alla sezione Variabili nella pagina risultante.

Fare clic sul pulsante blu Aggiungi variabile. Assegna un nome alla nuova variabile nel campo Chiave. Stiamo usando SSH_PRIVATE_KEY. Incolla la tua chiave privata nel campo Valore, comprese le righe iniziali ----BEGIN e finali -----END.

L'aggiunta della chiave come variabile CI consente di farvi riferimento nella pipeline in un secondo momento. Verrà aggiunto all'agente SSH nei contenitori creati dalla pipeline.

Aggiunta del file della pipeline

GitLab CI esegue lavori basati sui contenuti di un file .gitlab-ci.yml nel tuo repository. GitLab troverà automaticamente questo file ed eseguirà la pipeline che definisce quando invii le modifiche ai tuoi rami.

class="co4">deploy:class="co3">
  stageclass="sy2">: deployclass="co3">
  imageclass="sy2">: alpine:latestclass="co4">
  scriptclass="sy2">:
    - rsync -atv --delete --progress ./ user@example.com:/var/www/html

Questo .gitlab-ci.yml contiene un lavoro che usa rsync per sincronizzare il contenuto della directory di lavoro con /var/www/html su il server example.com. Utilizza l'immagine Docker alpine:latest come ambiente di compilazione. La pipeline attualmente fallirà perché rsync non è incluso nell'immagine Alpine.

Installazione di SSH e rsync

Alpine è una buona base per il lavoro perché è un'immagine leggera con poche dipendenze. Ciò riduce l'utilizzo della rete mentre GitLab estrae l'immagine all'inizio del lavoro, accelerando la pipeline. Per far funzionare rsync, aggiungi SSH e rsync all'immagine, quindi avvia l'agente SSH e registra la chiave privata generata in precedenza.

class="co4">deploy:class="co3">
  stageclass="sy2">: deployclass="co3">
  imageclass="sy2">: alpine:latestclass="co4">
  before_scriptclass="sy2">:
    - apk update && apk add openssh-client rsync
    - eval $class="br0">(ssh-agent -sclass="br0">)
    - echo class="st0">"$SSH_PRIVATE_KEY" | ssh-add -class="co4">
  scriptclass="sy2">:
    - rsync -atv --delete --progress ./ user@example.com:/var/www/html

OpenSSH e rsync vengono installati utilizzando il gestore di pacchetti apk di Alpine. L'agente di autenticazione SSH viene avviato e la tua chiave privata viene aggiunta tramite ssh-add. GitLab inietta automaticamente la variabile di ambiente SSH_PRIVATE_KEY con il valore che hai definito nelle impostazioni del tuo progetto. Se hai utilizzato una chiave diversa nella schermata delle variabili di GitLab, assicurati di modificare la pipeline di conseguenza.

Gestione della verifica dell'host

SSH richiede in modo interattivo la conferma la prima volta che ti connetti a un nuovo host remoto. Questo non è compatibile con l'ambiente CI, dove non sarai in grado di vedere o rispondere a queste richieste.

Sono disponibili due opzioni per risolvere questo problema: disabilitare i controlli rigorosi della chiave dell'host o registrare in anticipo il server come host noto.

Per la prima opzione, aggiungi la seguente riga al before_script della tua pipeline:

- echo class="st0">"Host *ntStrictHostKeyChecking no" >> ~/.ssh/config

Sebbene funzioni, è un potenziale rischio per la sicurezza. Non avresti alcun avviso se un utente malintenzionato acquisisse il controllo del dominio o dell'IP del tuo server. L'uso del controllo della chiave host consente di verificare che l'identità del telecomando sia quella che ci si aspetta.

Puoi aggiungere il remoto come host noto in modo non interattivo connettendoti ad esso sul tuo computer al di fuori della tua pipeline. Ispeziona il tuo file ~/.ssh/known_hosts e trova la riga contenente l'IP o il nome host del telecomando. Copia questa riga e usa la procedura precedente per aggiungere una nuova variabile GitLab CI. Nomina questa variabile SSH_HOST_KEY.

Ora aggiorna la tua sezione before_script con la seguente riga:

- echo class="st0">"$SSH_HOST_KEY" > ~/.ssh/known_hosts

Ora sarai in grado di connetterti al server senza ricevere alcuna richiesta di conferma. Invia il codice al tuo repository GitLab e osserva il completamento della pipeline.

Ulteriori miglioramenti

Questa pipeline è un semplice esempio di come iniziare con SSH e rsync in un ambiente dockerizzato. Esistono opportunità per migliorare ulteriormente il sistema racchiudendo i passaggi di preparazione in una fase di compilazione dedicata che costruisce un'immagine Docker che è possibile riutilizzare tra le pipeline.

Il .gitlab-ci.yml beneficerebbe anche di un maggiore uso delle variabili. Astrazione del nome host del server remoto (example.com), della directory (/var/www/html) e dell'utente (user) in GitLab CI le variabili aiuterebbero a mantenere pulito il file, impedirebbero ai browser di repository occasionali di vedere i dettagli ambientali e ti permetterebbero di modificare i valori di configurazione senza modificare il file della pipeline.

Riepilogo

L'uso di rsync nelle pipeline GitLab CI richiede una piccola configurazione manuale per formare un ambiente di compilazione che abbia le dipendenze necessarie. Devi inserire manualmente una chiave privata SSH e registrare il server remoto come host noto.

Sebbene siano disponibili immagini Docker della community che eseguono SSH e rsync su immagini di base popolari, queste alla fine ti danno meno controllo sulla tua build. Stai estendendo la catena di approvvigionamento della tua pipeline con un'immagine di cui non puoi necessariamente fidarti. Iniziare con un'immagine di base del sistema operativo e aggiungere ciò di cui hai bisogno ti aiuta ad avere fiducia nelle tue build.

Articoli correlati:


Tutti i diritti riservati. © Linux-Console.net • 2019-2025