V tomhle návodu se naučíte, jak propojit váš projekt s GitLabem bez nutnosti instalovat celý systém. Stačí na server nainstalovat pouze gitlab-runner, abychom mohli využívat veškeré potřebné příkazy. Pak ho propojíme se shared-runnerem na GitLab.com a můžeme vesele pushovat i bez nutnosti instalovat celý GitLab na vlastním serveru.
Pokud ale potřebujete mít vše pod jednou střechou, tak mrkněte na návod, jak nainstalovat GitLab a taky jak nastavit automatický deploy aplikací.
1. Krok – Vytvořit si účet na GitLab.com
Pokud nemáte účet, tak je třeba se zaregistrovat.
VPS Centrum
Vyzkoušejte zdarma naši aplikaci pro správu serveru a domén. Budete si připadat jako zkušený administrátor.
Po registraci musíte vyplnit ještě 3 kroky, kdy se vás ptají, kdo všechno bude na projektu pracovat, vyberete jméno organizace a příslušnou URL a založíte si první projekt.
2. Krok – Nainstalujeme GitLab runner na server
Pro testovací účely využíváme naše virtuální servery s VPS Centrem. Konkrétně tarif Basic, který běží na Debian / Buster.
Nejdříve přidáme oficiální GitLab repozitář. Přihlásíme se na SSH a vykonáme příkaz:
curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | bash
Výstup by měl vypadat takto:
% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 5945 100 5945 0 0 8704 0 --:--:-- --:--:-- --:--:-- 8691 Detected operating system as debian/buster. Checking for curl... Detected curl... Checking for gpg... Detected gpg... Running apt-get update... done. Installing debian-archive-keyring which is needed for installing apt-transport-https on many Debian systems. Installing apt-transport-https... done. Installing /etc/apt/sources.list.d/runner_gitlab-runner.list...done. Importing packagecloud gpg key... done. Running apt-get update... done. The repository is setup! You can now install packages.
Pro instalaci GitLab runneru využijeme příkaz, kdy vypneme “skel”, abychom zamezili budoucímu problému, s nenalezením souborů či složek. Problém se objevuje pouze na distribuci Debian / Buster.
export GITLAB_RUNNER_DISABLE_SKEL=true
Následně přejdeme k instalaci runneru.
apt-get install gitlab-runner
3. Krok – Zaregistrujeme GitLab runner
Přihlásíme se na GitLab.com a pod vašim projektem půjdeme do sekce Settings > CI/CD, kde rozšíříte formulář s Runnery jako na obrázku níže.
Freelo - Nástroj na řízení úkolů a projektů
Přidej se, pozvi svůj tým a klienty, rozděl práci a sleduj, jak se úkoly dají do pohybu.
Ujistěte se, že tzv. Shared runners jsou vypnuté, abychom mohli pushovat pomocí specifického runneru, který si teď jdeme nainstalovat.
Budeme potřebovat zaregistrovat runner s touto URL “https://gitlab.com/” a registrační token, který si zkopírujete.
Půjdeme tedy zase na SSH a zadáte příkaz:
gitlab-runner register
- Poté vložíte URL: https://gitlab.com/
- Zadáte token z administrace
- Můžete vložit popisek runneru (volitelné)
- Přidat tag nebo-li označení runneru: deploy
- Vybereme spouštěč runneru v našem případě: shell
Vystup příkazu:
root@rve03-david-janik ~ # gitlab-runner register Runtime platform arch=amd64 os=linux pid=13937 revision=775dd39d version=13.8.0 Running in system-mode. Enter the GitLab instance URL (for example, https://gitlab.com/): https://gitlab.com/ Enter the registration token: wY6-7ZjSggxiST-fXuKV Enter a description for the runner: [rve03-david-janik.vas-server.cz]: testing Enter tags for the runner (comma-separated): deploy Registering runner... succeeded runner=wY6-7ZjS Enter an executor: shell, ssh, docker+machine, docker-ssh+machine, kubernetes, custom, parallels, virtualbox, docker, docker-ssh: shell Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
Můžeme si ověřit, jestli runner v pořádku běží příkazem:
gitlab-runner verify
Výstup by měl vypadat:
root@rve03-david-janik ~ # gitlab-runner verify Runtime platform arch=amd64 os=linux pid=14651 revision=775dd39d version=13.8.0 Running in system-mode. Verifying runner... is alive runner=YawZ9Ssz
Když se pak vrátíme do administrace na GitLab.com a aktualizujeme stránku v nastavení CI / CD, tak nově registrovaný runner už uvidíme. Viz.
A už nám zbývají poslední dva kroky. Vytvořit konfigurační soubor .gitlab-ci.yml, který z odpovídá za práci runneru a jejich chování a jako poslední krok přidáme SSH klíč.
Tady si už vystačíme z minulého návodu, kde jsme nastavili deploy nejdříve na devel a poté se změny propíšou i na produkční verzi. Každý projekt, vývojář by si měl ale takový soubor umět vytvořit sám, tak aby pokryl svoje potřeby.
4. Krok – Vytvoření konfiguračního souboru .gitlab-ci.yml
V nově vytvořeném projektu vytvoříme 3 důležité soubory:
- .gitlab-ci.yml (script zodpovědný za deploy)
- .deploy_ignore (které složky se při deploy nekopírují)
- .gitignore (git dané soubory nebo složky bude ignorovat)
Pod námi je skript, který vložíte přímo do souboru .gitlab-ci.yml , samozřejmě “variables” vyměníte za svoje údaje/domény.
Pomocí skriptu pod námi budeme uploadovat změny/soubory do dvou složek. Do vývojové, která je zobrazena jako “devel” a pak poputují přimo do produkce.
variables: PROJECT_NAME: "test-gitlab-vh" PRODUCTION_DIR: "/www/hosting/vas-hosting.cz/www" PRODUCTION_SERVER: "rve03.vas-server.cz" DEVELOP_DIR: "/www/hosting/vas-hosting.cz/devel" DEVELOP_SERVER: "rve03.vas-server.cz" DEPLOY_USER: "deploy" stages: - deploy deploy-job: stage: deploy tags: - deploy only: - production script: - rsync -ar --compress --delete --exclude-from=.deploy_ignore --rsync-path="sudo rsync" --chown=www-data:www-data --exclude-from=.gitignore . $DEPLOY_USER@$PRODUCTION_SERVER:$PRODUCTION_DIR deploy-local-master-job: stage: deploy tags: - deploy only: - master script: - rsync -ar --compress --delete --exclude-from=.gitignore --rsync-path="sudo rsync" --chown=www-data:www-data --exclude-from=.deploy_ignore . $DEPLOY_USER@$DEVELOP_SERVER:$DEVELOP_DIR/ deploy-local-job: stage: deploy tags: - deploy except: - master - production script: - rsync -ar --compress --delete --exclude-from=.gitignore --rsync-path="sudo rsync" --chown=www-data:www-data --exclude-from=.deploy_ignore . $DEPLOY_USER@$DEVELOP_SERVER:$DEVELOP_DIR/$PROJECT_NAME-$CI_BUILD_REF_NAME
5. Krok – Nastavení SSH klíče
Poslední část je nejvíce záludná a týká se vygenerování a správného nastavení SSH klíčů.
Pro vygenerování nového SSH klíče používáme metodu RSA, která se nám osvědčila.
Jako první se musíme přihlásit z roota pod uživatele “gitlab-runner”, který byl při instalaci Gitlabu automaticky vytvořen.
su gitlab-runner
Vygenerujeme SSH klíč.
ssh-keygen -o -t rsa -b 4096
Po vygenerování se vás zeptá, jestli chcete nechat defaultní cestu a pokud ano, stiskněte Enter. Poté se vás zeptá, jestli chcete zaheslovat SSH klíč, a to v našem případě rozhodně nechceme = stiskněte 2x enter.
Poté už se zobrazí klíč podobný tomuto:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQClpCnfh7fzJEKSu1+qXw9Rg5vx9S5tAtC2f57wF2JxjlodvaNvaeTK0yZjpOjwVZ4ZyRS5KNuh8QexPMV0tdMaxM2rnrdFU3PaDPNT2zUE2vz6NBkNwCNb7rhMQCGZGuU9T8b6/JAAMzmJudu2vgS3vFVuKbAohjECiWxK+gtVY5K6F4Z29PoOxNKAlHgvbkFYnCnSsXHruwTsjvmBWC95u/uzDwJLJsS6S9qCYnKHXUq4knIaD67LIqSrgDeel/LQBi0/FrZCrptG2hiz1bIb6VibQctTlYEIoKNfShYila/f5qXiQNkdeXF/38CBl2tsxMUBcQGLnZiSsxx4703O+kDxX+l3C2Y4MXdyWYPzFEXVVwXN5fXBBgmCjBiUYSyP1uq/nocUpSOo56I1MrIf/KZFbeCb2MCppiwA4wfceTfplpiH0U1YVHbQ7KJW+gHS2DZKefMEoA1UabGIcDKEQyM2NAdOioqatOLwjUj2jE0D6tggfoQ2tnc01Tgq1T0eGlvRPmS1gbgmPFDyKUoIvj9ODyPycyQFePoJWVdJb7wcvliVzU8grpRcBSch2KZbKMkHDFYPEc8TXL+BrBDQXs8wXjP7jNtIGRh4a8+idWlj4605cFEr6uk0pGivV6jyRK4xKwiMKB5J7I0VSWSL9+dRfXQcOdah2E+sWTJUxQ== gitlab-runner@xxx08-vh-test-gitlab2.vas-server.cz
Tento klíč si uložíme do poznámkového bloku, protože se nám bude za chvilku hodit.
Mezitím se STÁLE pod uživatelem gitlab-runner přihlásíme na ssh pod uživatele deploy.
ssh deploy@xxx11.vas-server.cz
Zeptá se vás to pouze napoprvé, jestli chcete tomuto serveru důvěřovat a napíšete: yes
Můžeme si otevřít další terminal či se přihlásit zpět na roota a následně se přihlásíme pod uživatele “deploy”.
su deploy
A musíme se podívat, jestli uživatel deploy má vytvořenou složku /.ssh.
cd ~ ls -a
Pokud složku .ssh neuvidíme, tak pokračujeme příkazem
mkdir .ssh cd .ssh touch authorized_keys
Poslední příkaz vytvoří soubor, kam se následně vkládají SSH klíče.
Poté pod rootem je třeba vložit SSH klíč tímto příkazem pod uživatele deploy. (Vyměňte za svůj SSH klíč)
echo "from="46.234.108.7,gitlab.vasedomena.com",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQClpCnfh7fzJEKSu1+qXw9Rg5vx9S5tAtC2f57wF2JxjlodvaNvaeTK0yZjpOjwVZ4ZyRS5KNuh8QexPMV0tdMaxM2rnrdFU3PaDPNT2zUE2vz6NBkNwCNb7rhMQCGZGuU9T8b6/JAAAbmJudu2vgS3vFVuKbAohjECiWxK+gtVY5K6F4Z29PoOxNKAlHgvbkFYnCnSsXHruwTsjvmBWC95u/uzDwJLJsS6S9qCYnKHXUq4knIaD67LIqSrgDeel/LQBi0/FrZCrptG2hiz1bIb6VibQctTlYEIoKNfShYila/f5qXiQNkdeXF/38CBl2tsxMUBcQGLnZiSsxx4703O+kDxX+l3C2Y4MXdyWYPzFEXVVwXN5fXBBgmC jBiUYSyP1uq/nocUpSOo56I1MrIf/KZFbeCb2MCppiwA4wfceTfplpiH0U1YVHbQ7KJW+gHS2DZKefMEoA1UabGIcDKEQyM2NAdOioqatOLwjUj2jE0D6tggfoQ2tnc01Tgq1T0eGlvRPmS1gbgmPFDyKUoIvj9ODyPycyQFePoJWVdJb7wcvliVzU8grpRcBSch2KZbKMkHDFYPEc8TXL+BrBDQXs8wXjP7jNtIGRh4a8+idWlj4605cFEr6uk0pGivV6jyRK4xKwiMKB5J7I0VSWSL9+dRfXQcOdah2E+sWTJUxQ== gitlab-runner@xxx08-vh-test-gitlab2.vas-server.cz ~deploy/.ssh/authorized_keys
Pokud vše proběhlo úspěšně, tak se můžete zpátky přihlásit pod uživatele “deploy” a podívat se jestli se klíč v pořádku vložil.
cat ~/.ssh/authorized_keys
Nadále rsync potřebuje, aby uživatel deploy mohl spouštět “sudo” bez nutnosti zadávat heslo. Na to nám stačí 2 příkazy, které musíme spustit pod rootem.
echo "deploy ALL=(root) NOPASSWD:/usr/bin/rsync,/usr/sbin/nginx deploy ALL=(www-data) NOPASSWD:ALL" > /etc/sudoers.d/deploy
chmod 0440 /etc/sudoers.d/deploy
Po těchto příkazech nám deploy začne fungovat!
Stačí jít do jakéhokoliv souboru a po kliknutí na edit udělat nějakou změnu. Klidně jenom přidat řádek navíc a po kliknutí na “Commit changes” se spustí uploadování změn.
Následně v sekci CI / CD > Pipelines uvidíte veškeré změny, které proběhly a vždy chceme vidět zelenou fajfku na znamení, že je všechno v pořádku.
Doporučujeme se poté připojit na FTP a zkontrolovat, že se soubor nahrál do složky na produkční i develovou verzi, jak je specifikováno v konfiguračním souboru(.gitlab-ci.yml). Vyzkoušejte i jestli GitLab správně ignoroval složky nebo soubory, které jste do souboru .deploy_ignore nastavili.