Kategórie
Vzdelávanie

Automatický deploy z Git-u na hosting

Doba čítania: 7 min.

Pre tých, ktorí ešte nepoznajú Git, ide o nástroj, pomocou ktorého viete udržiavať kód vašej stránky verziovaný. Ak robíte na stránke pravidelne nejaké zmeny a každú verziu chcete mať osobitne uloženú pre prípad, že by ste sa potrebovali niekedy k nej vrátiť, či len všeobecne zistiť kedy určitá zmena nastala, práve na to je Git. Vysvetlenie, ako Git pracuje je však už mimo tohto článku – ak sa s ním ešte len zoznamujete, odporúčam tento návod.

Kde bude môj Git projekt?

Projekty v Gite sú uložené v takzvaných repozitároch. Tie sa nachádzajú vždy na nejakom serveri, z ktorého si každý programátor stiahne na svoj počítač vlastnú kópiu. V tej robí požadované zmeny a tie následne pošle späť na Git server. Odtiaľ si tieto zmeny môžu k sebe stiahnuť ostatní členovia projektu, ale aj produkčný server, na ktorom nám beží stránka.

Ako produkčný server vystupuje v tomto článku hosting, ale pokojne môže ísť aj o váš virtuálny, či dedikovaný server.

Poslednou otázkou už len ostáva, čo nám bude slúžiť ako Git server? Možností je dnes mnoho: gitlab.com, github.com, bitbucket.com alebo podobné. Avšak v rámci tohto článku si ukážeme konfiguráciu pre Gitlab.

Čo k tomu potrebujem?

1. Dvojicu private/public ssh kľúčov

Pre zabezpečenie prepojenia Gitlabu a hostingu. Z bezpečnostných dôvodov sa neodporúča používať ten istý SSH kľúč, ako používate na vašu súkromnú komunikáciu. Ak neviete, čo sú to SSH kľúče alebo ako ich vygenerovať, môžete sa dozvedieť viac v tomto článku.

Pre vytvorenie novej dvojice spustite nasledujúci príkaz v príkazovom riadku na svojom počítači:

ssh-keygen -t rsa -b 4096 -C "moj@email.sk"

Tento command sa vás bude ešte pýtať na názov súboru a heslo kľúča. Názov zvoľte ľubovoľný (ide len o to, pod akým názvom bude uložený do priečinka, v ktorom sa momentálne nachádzate). Heslo nechajte prázdne (len stlačte enter).

2. Premium konzolu

Vedeli ste, že ku každému hostingu vo WebSupporte máte možnosť si spustiť shell konzolu pre základnú manipuláciu s vaším hostingom pomocou bashu? A práve to potrebujeme. V administračnom rozhraní prejdite na správu vášho hostingu, do časti „Web“ a následne prejdite na „Shell“. Nakoľko chceme, aby sa Gitlab s vaším hostingom mohol spojiť kedykoľvek niečo commitnete, potrebujeme premium konzolu, ktorá ostáva aktívna neustále. Ak teda nemáte premium konzolu, prejdite na jej objednávku, ktorú následne dokončite a uhraďte.

Premium shell vo WebSupport admin
Premium shell vo WebSupport admin

Pokiaľ už máte premium konzolu uhradenú, kliknite na Aktivovať konzolu, aby sa vám zobrazili jej prihlasovanie údaje. V príkazovom riadku následne zadajte príkaz, ktorý máte uvedený ako „SSH príkaz“ a po vyzvaní zadajte heslo. V tomto okamihu ste prihlásený na svojom hostingu. Všetky príkazy uvedené nižšie v článku bude potrebne spúšťať prihlasený do premium konzoly.

3. Vlastný github runner

Github runner neposkytujeme a tak je potrebné si zabezpečiť vlastný. Napríklad pomocou VPS. Info k inštalácii nájdete na https://docs.gitlab.com/runner/install/.

Predpríprava hostingu

V rámci tohto článku som zvolil štruktúru, kedy pre jednu doménu je možné mať aj viacero Git repozitárov (ak máte napríklad jeden projekt na samotnej doméne a iné projekty na subdomenách) a zároveň oddelenú súborovú štruktúru vášho projektu od štruktúry hostingového routovania – to ocenia tí, ktorí majú základný index.php v nejakom podpriečinku svojho repozitára (najmä pri použití frameworkov). Ak to chcete využiť, použite nasledujúcu sadu príkazov, ktorú je potrebné spustiť prihlásený do premium konzoly:

mkdir -p repos/mojsuperprojekt.git projects/mojsuperprojekt

git -C repos/mojsuperprojekt.git init --bare

vim repos/mojsuperprojekt.git/hooks/post-receive

chmod +x repos/mojsuperprojekt.git/hooks/post-receive

Tretí príkaz je vlastne na vytvorenie a editáciu nového súboru pomocou „vim-u“. Pokiaľ tento editor nepoznáte, odporúčam prečítať si tento článok. Samozrejme je možné docieliť rovnaký výsledok aj pomocou „nano“ alebo iných editorov, záleží už len od vašich preferencií.

Tento súbor je vlastne git hook, ktorý bude spustený po prijatí každého commitu z Gitlabu. Pre účely tohto článku by mal obsahovať nasledujúci kód, ktorý doň vložte.

#!/bin/sh

git --work-tree=/home/projects/mojsuperprojekt --git-dir=/home/repos/mojsuperprojekt.git checkout -f

Toto je nutný základ, avšak do tohoto súboru môžete pridať pokojne aj vlastný kód, ktorý sa má vykonať. Napríklad doinštalovanie nových composer balíčkov, migrácia databázy, prečistenie cache a podobne. To už záleží len od vášho projektu.

#!/bin/sh

git --work-tree=/home/projects/mojsuperprojekt --git-dir=/home/repos/mojsuperprojekt.git checkout -f

composer install --no-dev --working-dir=/home/projects/mojsuperprojekt

php /home/projects/mojsuperprojekt/artisan migrate --force

Po vytvorení tohto súboru sa uistite, že ste nezabudli spustiť aj štvrtý príkaz (ešte stále prihlasený v premium konzole).

chmod +x repos/mojsuperprojekt.git/hooks/post-receive

Teraz už len potrebujeme, aby sa aj reálna doména/subdoména načítavala z priečinka novo-vzniknutého projektu. Prejdite do priečinka vašej domény:

cd mojadomena.sk

vymažte aktuálny priečinok `web`:

rm -rf web

… a prepojte na ten priečinok vášho projektu, ktorý obsahuje základný `index.php` súbor, napríklad:

ln -s web ../projects/mojsuperprojekt/public

Pokiaľ chcete nejaký iný projekt rozbehať na ľubovoľnej subdoméne, stačí tento postup opakovať pre priečinok `mojadomena.sk/sub/nazovsubdomeny`.

Hodí sa poznamenať, že pokiaľ riešite tento návod pre už existujúce projekty, zrejme nechcete odmazať priečinok „web“, ale zvoliť opačný postup, čo sa týka prelinkovania. Zároveň ak váš projekt obsahuje súbor „index.php“ priamo v hlavnom priečinku celého projektu, je pre vás zbytočné mať oddelené cesty pre projekt a doménovú štruktúru. V tom prípade môže váš súbor „post-receive“ vyzerať skôr takto:

#!/bin/sh
git --work-tree=/home/mojadomena.sk/web --git-dir=/home/repos/mojsuperprojekt.git checkout -f

Na záver potrebujeme na hosting nahrať aj verejný kľúč pre overenia pripojenia z gitlabu. Môžeme to docieliť cez terminál (ak sme ešte pripojený k premium konzole) nasledujúcim príkazom alebo aj jednoduchšie cez formulár v správe premium konzoly v administračnom rozhraní.

mkdir ~/.ssh && vim ~/.ssh/authorized_keys

Pridávanie ssh kľúča

SSH kľúč

Samozrejme môžete okrem verejného kľúča pre Gitlab pridať aj váš osobný verejný SSH kľúč a pre budúce prihlasovanie sa do premium konzoly už nebudete potrebovať heslo.

Zabezpečenie pripojenia medzi Gitlabom a hostingom

V Gitlabe si vytvorte nový projekt. Nakoľko nechcete, aby vám vaše zdrojové kódy čítali ostatní používatelia Gitlabu, nezabudnite nastaviť projekt ako súkromný. Následne prejdite do nastavení „CI/CD Pipelines“ (hore vpravo) a v časti „Secret Variables“ pridáme novú premennú `SSH_PRIVATE_KEY`, ktorej hodnota bude vlastne obsah súboru privátneho kľúča.

Gitlab pipelines config

Gitlab Pipelines

To, aby sa Gitlab po každom commite pripojil na náš hosting/server docielíme tak, že do vášho projektu pridáte do hlavného priečinka nový súbor „.gitlab-ci.yml“, ktorého obsah bude vyzerať zhruba takto:

deployment:
    stage: deploy

    environment:

        name: production

        url: http://www.mojadomena.sk/

    only:

        - master
    script:
        - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'

        - eval $(ssh-agent -s)

        - ssh-add <(echo "$SSH_PRIVATE_KEY")

        - mkdir -p ~/.ssh

        - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'

        - git remote add production ssh://uid123@shellserver-2.websupport.sk:123/home/repos/mojsuperprojekt.git
        - git push production HEAD:master

Poznámka: Nezabudnite v predposlednom riadku zmeniť uid, server, jeho port a prípadne aj názov projektu tak, aby to sedelo s údajmi, ktoré vidíte v nastaveniach premium konzoly.

Tí pokročilejší si môžu na tomto mieste nakonfigurovať aj spúšťanie testov, linting, či iné pre-deploy tasky. Viac informácií nájdete v oficiálnej Gitlab dokumentácií.

Nastavenia „environment.name“ a „environment.url“ majú len informačný charakter pre používateľské rozhranie Gitlabu, kde sa vám zobrazí odkaz pre prechod na produkčnú verziu.

V tejto chvíli by malo byť všetko pripravené. Môžete urobiť svoj prvý commit do vášho repozitára. Po prijatí commitu sa v Gitlabe spustí nová pipeline s vami nadefinovaným taskom (alebo taskami). Môže to trvať aj niekoľko minút, no priebeh si viete kontrolovať priamo v Gitlab rozhraní, vo vašom projekte, v časti „Pipelines“.

Navyše po ukončení pipeline vám príde aj email s informáciou, či všetko zbehlo v poriadku. Ak áno, prihláste sa znova do vašej premium konzoly. Ak si vylistujete priečinok vášho projektu (`ls -l projects/mojsuperprojekt`), už by v ňom mali byť všetky súbory z Git repozitára. Zároveň by nové zmeny už mali byť live na vašej stránke. A do budúcna stačí už len commitovať nové zmeny do vášho repozitára a ostatné starosti nechať na Gitlab.

Autor: Tomáš Tatarko

Vo WebSupporte začínal ako developer, dnes pracuje ako Head of Internal Tools. Má pod palcom WebAdmina a je autorom nástroja Follow Company.