rsync je populární nástroj pro synchronizaci souborů, který používá účinný algoritmus k minimalizaci spotřeby šířky pásma. Jednou z běžných rolí rsync je nasazení webové stránky na vzdálený produkční server. Zde je návod, jak zkombinovat všestrannost rsync s automatizací poskytovanou GitLab CI pipelines.
Vykonavatelé potrubí
GitLab CI podporuje několik typů pipeline exekutorů. Ty definují prostředí, ve kterém bude vaše úloha probíhat. shell
executor je výchozí a běží na holém počítači na hostitelském počítači. Umožňuje vašim kanálům používat jakýkoli příkaz dostupný na hostiteli bez další konfigurace. Protože se většina populárních linuxových distribucí dodává s nainstalovaným nástrojem rsync, lze tento přístup snadno zvládnout.
Bohužel, shell
exekutor neposkytuje silnou izolaci a může časem znečišťovat prostředí vašeho hostitele. Lepší alternativou je docker
exekutor, který pro každou úlohu CI spustí nový kontejner Docker. Všechny úlohy běží v čistém prostředí, které nemůže ovlivnit hostitele.
Nevýhodou je, že základní obrázky Dockeru obecně neobsahují rsync
nebo ssh
. Dokonce i oficiální obrázky OS jako ubuntu:latest
odesílat jako minimální sestavení bez těchto příkazů. Díky tomu je o něco složitější kanálový skript pro přidávání závislostí a rsync
vaše soubory.
Zde je návod, jak přidat rsync do vašeho kanálu. Než budete pokračovat, ujistěte se, že máte k dispozici GitLab Runner založený na Dockeru. Budeme také předpokládat, že máte projekt GitLab, který je připraven k použití.
Příprava
Budete-li k připojení ke vzdálenému hostiteli SSH používat rsync, budete potřebovat pár klíčů SSH. Veřejné a soukromé klíče můžete vygenerovat spuštěním ssh-keygen -t rsa
. Zkopírujte veřejný klíč na server, ke kterému se budete připojovat.
Dále zkopírujte vygenerovaný soukromý klíč do schránky:
cat ~/.ssh/id_rsa | xclip -selection c
Přejděte do svého projektu GitLab a klikněte na „Nastavení“ v dolní části levé navigační nabídky. Klikněte na položku „CI/CD“ v podnabídce. Na výsledné stránce přejděte dolů do sekce Proměnné.
Klikněte na modré tlačítko „Přidat proměnnou“. Do pole „Klíč“ zadejte název nové proměnné. Používáme SSH_PRIVATE_KEY
. Vložte svůj soukromý klíč do pole „Value“ včetně úvodního ----BEGIN
a koncové -----END
řádky.
Přidáním klíče jako proměnné CI na něj budete později odkazovat ve svém kanálu. Bude přidán do agenta SSH v kontejnerech, které vytvoří váš kanál.
Přidání souboru kanálu
GitLab CI spouští úlohy založené na obsahu .gitlab-ci.yml
soubor ve vašem úložišti. GitLab tento soubor automaticky najde a spustí kanál, který definuje, když do svých větví posíláte změny.
deploy: stage: deploy image: alpine:latest script: - rsync -atv --delete --progress ./ [email protected]:/var/www/html
Tento .gitlab-ci.yml
obsahuje úlohu, která používá rsync
pro synchronizaci obsahu pracovního adresáře do /var/www/html
na example.com
server. Používá alpine:latest
Docker image jako prostředí sestavení. Potrubí aktuálně selže, protože rsync
není součástí obrázku Alpine.
Instalace SSH a rsync
Alpine je dobrým základem pro tuto práci, protože je to lehký obraz s několika závislostmi. To snižuje využití sítě, zatímco GitLab stahuje obraz na začátku úlohy, čímž se zrychluje váš kanál. Aby rsync fungoval, přidejte do obrazu SSH a rsync a poté spusťte agenta SSH a zaregistrujte soukromý klíč, který jste vygenerovali dříve.
deploy: stage: deploy image: alpine:latest before_script: - apk update && apk add openssh-client rsync - eval $(ssh-agent -s) - echo "$SSH_PRIVATE_KEY" | ssh-add - script: - rsync -atv --delete --progress ./ [email protected]:/var/www/html
OpenSSH a rsync se instalují pomocí Alpine apk
správce balíčků. Spustí se ověřovací agent SSH a váš soukromý klíč se přidá pomocí ssh-add
. GitLab automaticky vkládá SSH_PRIVATE_KEY
proměnná prostředí s hodnotou, kterou jste definovali v nastavení projektu. Pokud jste na obrazovce proměnných GitLab použili jiný klíč, ujistěte se, že jste odpovídajícím způsobem upravili svůj kanál.
Správa ověření hostitele
SSH interaktivně vyzve k potvrzení při prvním připojení k novému vzdálenému hostiteli. To není kompatibilní s prostředím CI, kde tyto výzvy neuvidíte ani na ně nebudete moci reagovat.
K řešení tohoto problému jsou k dispozici dvě možnosti:Zakázat přísné kontroly klíčů hostitele nebo svůj server předem zaregistrovat jako „známého“ hostitele.
Pro první možnost přidejte následující řádek do before_script
vašeho kanálu :
- echo "Host *ntStrictHostKeyChecking no" >> ~/.ssh/config
I když to funguje, je to potenciální bezpečnostní riziko. Pokud by útočník získal kontrolu nad doménou nebo IP vašeho serveru, neměli byste žádné varování. Použití kontroly klíče hostitele vám umožní ověřit, že identita vzdáleného ovladače je taková, jakou očekáváte.
Vzdálené ovládání můžete přidat jako známého hostitele neinteraktivně tak, že se k němu připojíte na svém vlastním počítači mimo váš kanál. Zkontrolujte své ~/.ssh/known_hosts
soubor a najděte řádek obsahující IP nebo název hostitele vzdáleného. Zkopírujte tento řádek a použijte postup z dříve k přidání nové proměnné GitLab CI. Pojmenujte tuto proměnnou SSH_HOST_KEY
.
Nyní aktualizujte svůj before_script
oddíl s následujícím řádkem:
- echo "$SSH_HOST_KEY" > ~/.ssh/known_hosts
Nyní se budete moci připojit k serveru, aniž byste obdrželi jakékoli potvrzovací výzvy. Vložte svůj kód do svého úložiště GitLab a sledujte, jak se vaše potrubí dokončuje.
Další vylepšení
Tento kanál je jednoduchým příkladem toho, jak začít s SSH a rsync v dockerizovaném prostředí. Existují příležitosti k dalšímu vylepšení systému zabalením přípravných kroků do vyhrazené fáze sestavení, která vytvoří obraz Dockeru, který můžete znovu použít mezi kanály.
Soubor .gitlab-ci.yml
by také těžilo z většího využívání proměnných. Abstrahování názvu hostitele vzdáleného serveru (example.com
), adresář (/var/www/html
) a uživatel (user
) do proměnných GitLab CI by pomohly udržet soubor čistý, zabránily běžným repozitářům vidět podrobnosti o prostředí a umožnily by vám měnit hodnoty konfigurace bez úpravy souboru kanálu.
Přehled
Použití rsync v kanálech GitLab CI vyžaduje trochu ručního nastavení, aby se vytvořilo prostředí sestavení, které má potřebné závislosti. Musíte ručně vložit soukromý klíč SSH a zaregistrovat vzdálený server jako známého hostitele.
Ačkoli jsou k dispozici komunitní obrazy Dockeru, které dávají SSH a rsync na oblíbené základní obrazy, nakonec vám dávají menší kontrolu nad vaší sestavou. Rozšiřujete dodavatelský řetězec vašeho potrubí o obrázek, kterému nemůžete nutně věřit. Začněte základní bitovou kopií operačního systému a přidejte to, co potřebujete, pomůže vám mít důvěru ve vaše sestavy.