CI/CD alapok ============ A verziókezelők lehetőséget adnak arra, hogy az egyes műveleteik különféle programok lefutását triggereljék. Ez az alapja az ún CI/CD (Continuous Integration (CI): folyamatos integráció és Continuous Delivery (CD): folyamatos szállítás.) megoldásoknak. SSH kulcs felvétele a GitHubba ------------------------------ Amennyiben a GitHubba ssh-n szeretnél bejelentkezni, érdemes felvenned az adott projekthez hozzáférést biztosító **nyilvános** kulcsokat. Ehhez a :envvar:`Profil` / :envvar:`Settings` / :envvar:`SSH and GPK Keys` menüben kell hozzáadnod mindazok kulcsát, akik számára hozzáférést szeretnél biztosítani. .. image:: images/github-add-ssh-key.png :alt: Repository elkészítése :width: 99% :align: center A Kulcsot a Title mezőben érdemes elnevezned, meghatároznod a felhasználási körét és be kell illesztened magát a nyilvános kulcsot. Unixon a kulcsodat a :file:`~/.ssh/id_rsa.pub` fájl tartalmazza, az én esetemben ez az alábbi: .. code-block:: console koczka@columbo:~$ cat ~/.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDMTTLjL9YctmaKeoKRlYEC0H3Q1LyQkrWUPt9FHYxLM1+ZbSpSJwtKqzk4XPiHCzUJ/nch5ilaOFcA0MUkH7kkgonRbyuS2uNSgYGTmwosKZC88TaeF2ICkWwjC5AZUzRJ2JKg4/PPE6Ei15p+dANS55WktEvEpZcaNZLkNZXyUXS35mSDQAuLCgfmFGO+xV2bQyvCJcXL1+tX+kTm2+90KgHb83/AS8px3gqQr+PYI5sdSsvADnApUSgfSHQ4plssS/5Mv5/Z047qQZ1Zt+ltIxY9c5wIHVbU8ThNYvveLI6mOEp6ghqgsKXN9x9QC6C5l9KTkP0Wi1Izu8/FQvWUHR4dwiRQUT7/mes30LR98fgTktYP7zdF5BN119V5rReIiGJiWd3tGGNmCQ08S3w2dh2xh7yRBlU4suMEOxw1f76gEV30Tqoo4skJKf5bodVB48OuAiPrEfXImGX6F7lcm22EDEaQvek29QGZQDC6BsxyV4bCIe0hxznozpcSEp0= koczka@columbo.uni-eszterhazy.hu Amennyiben nem lenne ilyen fájlod, generálj egy kulcsprát az :command:`ssh-keygen` paranccsal: .. code-block:: console koczka@columbo:~$ ssh-keygen .. image:: images/github-add-ssh-key-form.png :alt: Repository elkészítése :width: 90% :align: center Példa ----- Készítsünk egy GitHub repository-t, mely a feltöltött programfájlokat egy linterrel ellenőrzi! A Git-et most parancssorból fogjuk kezelni. Repó elkészítése ^^^^^^^^^^^^^^^^ #. Jelentkezz be a GitHubba a saját felhasználói hozzáféréseddel! #. Hozz létre egy új repository-t :envvar:`ci-cd-demo` néven! Tültsd ki a leírás és a Licensz mezőket is! #. A tesztelést végző *action scripteket* nem szeretnénk mozgatni, ezért a :file:`.github` könyvtárat hozzáadjuk a :file:`.gitignore` fájl tartalmához, majd commitoljuk. (:envvar:`Add file` / :envvar:`Create new file` / :file:`.gitignore`) .. image:: images/create-repo.png :alt: Repository elkészítése :width: 99% :align: center A következő lépés a munkafolyamat (workflow) beállítása. Egy olyan scriptet készítünk, amely minden feltöltéskor lefut, és végrehajtja az abban foglaltakat. Ehhez a GitHub felületén az :envvar:`Actions` menüt kell kiválasztani. Számos előre definiált konfiguráció közül választhatunk, nekünk most egy :envvar:`Simple workflow` kell majd. .. image:: images/simple-workflow.png :alt: A Workflow beállítása :width: 99% :align: center Nyomd meg a :envvar:`Create` gombot, és elkészítjük a workflow fájlt. A folyamatok fájljai a :envvar:`.github/workflows/` könyvtárba kerülnek. Az új fájl neve legyen :file:`linter.yml`, a tartalma pedig az alábbi: .. code-block:: console name: Linter on: push: branches: [ "main" ] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Install pyLint run: pip install pylint - name: Run the linter run: python3 linter.py continue-on-error: false Ezzel előkészítettük a Github környezetét, teszteljük egy projekten! Először hozzuk létre a repó munkaterületét a saját gépünkön! .. code-block:: console koczka@columbo:~$ git clone git@github.com:koczkaferenc/ci-cd-demo.git Cloning into 'ci-cd-demo'... remote: Enumerating objects: 16, done. remote: Counting objects: 100% (16/16), done. remote: Compressing objects: 100% (10/10), done. remote: Total 16 (delta 0), reused 0 (delta 0), pack-reused 0 Receiving objects: 100% (16/16), 15.22 KiB | 15.22 MiB/s, done. .. code-block:: console cd ci-cd-demo Hozzuk létre a linter számára nem "barátságos" :file:`helloworld.py` programot: .. code-block:: console def helloworld(): print('Hello world') helloworld() És az előző órán tanult :file:`linter.py`-t: .. code-block:: console import sys from pylint import lint THRESHOLD = 8 run = lint.Run(["helloworld.py"], do_exit=False) score = run.linter.stats.global_note if score < THRESHOLD: print("Linter failed: Score < threshold value") sys.exit(1) sys.exit(0) Töltsük fel ezeket a repóba, de előtte a webes felületen kattints az :envvar:`Actions` menüre! .. code-block:: console git add linter.py git commit -m "Added linter.py" git push origin main .. code-block:: console git add helloworld.py git commit -m "Added helloworld.py" git push origin main .. image:: images/linter-runs-with-errors.png :alt: A Linter futása :width: 99% :align: center Tegyük Linter-konformmá a :file:`helloworld.py` fájlt! .. code-block:: console """ Hello World program """ def helloworld(): """ Koszonto fuggvény """ print('Hello world') helloworld() Push-oljuk újra a változásokat, és ellenőrizzük a Linter eredményét! .. code-block:: console git add helloworld.py ; git commit -m "WIP" ; git push origin main Most máér hiba nélkül fut a Linter! .. image:: images/linter-runs-well.png :alt: A Linter futása :width: 99% :align: center További részletek a https://docs.github.com/en/actions/using-workflows oldalon érhetők el.