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:
- Rsync を使用して 2 つの Apache Web サーバー/Web サイトを同期する方法
- 非標準の SSH ポートで Rsync を使用してファイル/ディレクトリを同期する方法
- Linux での Rsync コマンドの 16 の実践例
- Rsync: Linux で新しいファイルまたは変更されたファイルを同期する
- Come eseguire il backup di una directory Linux su un computer remoto con rsync
- Come eseguire il backup dell'intero sistema Linux utilizzando Rsync
- Riprendi i file parzialmente trasferiti su SSH utilizzando Rsync
- Backup di file e directory utilizzando Rsync in Linux
- Esempi di comandi Linux Rsync per principianti
- Grsync - Un semplice frontend grafico per Rsync
- Come eseguire il backup di file da VPS Linux remoto utilizzando lo script Rsync
- Sincronizza directory locali e remote utilizzando Rsync in Linux
- Come padroneggiare il comando rsync in Linux
- 15 esempi pratici di comando Rsync in Linux
- Comando Rsync in Linux con esempi pratici