Code Monkey home page Code Monkey logo

code-to-deployed-app's Introduction

Poznej FI - Workshop - Od verzování až k automatickému nasazení

Společně si zkusíme verzovat zdrojový kód a spolupracovat na něm. Následně ho ručně otestujeme a zařídíme, aby se testy spouštěly při každé změně. A pokud testy uspějí, zveřejníme automaticky novou verzi a nasadíme ji na náš server. V neposlední řadě si ukážeme, že Docker je elegantní způsob distribuce některých typů programů.

  • Čas: 1h 30m
  • Přístupové údaje: Pro zrychlení některé předem vygenerované (odkaz je na tabuli). Zkoušíte si to doma? Klidně si založte vlastní účty.
  • Klíčová slova: git, pytest, CI/CD, Github Actions, Virtual Machine in Cloud, SSH, Docker

Plán

Úvod (5 min)

Git (10 min, párově)

Výchozí stav: logika, webserver

  • Nainstalování GitHub Desktop (připraveno předem)
  • Založení GitHub účtu (připraveno předem)
  • Přihlášení do GitHub Desktop
  • Představení ukázkového projektu (hlavně souboru logic.py) a jeho repositáře (i.e. tohoto) na webu
  • GitHub Desktop (klonování repositáře)
  • Každý pár účastníků si vytvoří vlastní větev na základě větve initial a přejde na svou individuální větev

Testování (15 minut, párově)

  • otevření VS Code a složky v něm

  • každý pár účastníků vytvoří soubor test_number1_number2.py (nějaké čísla si vymyslete, jiná než ostatní)

  • v GitHub Desktop: add changes, commit, push

  • Pytest

    • instalace Pytest
      • python -m pip install pytest
      • přidat řádek pytest do requirements.txt
        • requirements.txt lze nainstalovat pomocí python -m pip install -r requirements.txt
    • každý pár účastníků napíše nějaké testy používající assert
    • testy lze spustit pomocí: python -m pytest .
    • v GitHub Desktop: add changes, commit, push
  • vysvětlení Pull Requestů, založení jednoho

  • organizátor PR ověří a mergne do větve demo

Diff

Refactoring (5 minut, společně)

  • přejít na větev demo, git pull, vytvořit si novou větev
  • společně trochu vylepšíme logic.py
    • Chcete nápady? Zkuste EduLint. Na tak malém kódu toho moc není, ale jako ukázka dobrý. :)
    • Můžete si na začátek souboru přidat řádek # edulint: enhancement a zapnou se ještě další kontroly.
  • Změny můžeme dělat v klidu, protože když něco rozbijeme, testy nám to řeknou a historie nám umožňuje to vrátit!

Diff

Continuous integration (Github Actions) (10 minut, společně)

  • Založení workflow souboru .github/workflows/test-publish-deploy.yaml
  • Spuštění pytest ve workflow souboru
  • Push do Gitu
  • Zkontrolovat výsledek v Github Actions

Diff

Vzdálený server (10 minut, část ukázka, SSH a git clone párově)

  • Virtual Machine v cloudu (na Cloudovém providerovi nezáleží)
  • připojení na vzdálený server - SSH a základ Bashe
    • ssh root@SOME_IP nebo ssh [email protected]
    • při zadávání hesla to bude vypadat, jako by se nepsalo, ale jen je skryté
  • každý si vytvoří vlastní složku a přejde do ní
    • mkdir SOME_NAME
    • cd SOME_NAME
  • git clone repositář
    • git clone https://github.com/PoznejFIWorkshop/code-to-deployed-app.git
    • cd code-to-deployed-app
    • git checkout YOUR_BRANCH_NAME
  • ukázka git sychronizace
    • lokálně (i.e. na PC ve škole)
      • drobná změna v kódu (klidně třeba jen přidání prázdného řádku)
      • v GitHub Desktop: add changes, commit, push
    • na vzdáleném serveru (i.e. skrz SSH): git pull

Docker (30 minut, společně)

Základná myšlenka Dockeru: Zabalím svůj kód/program a vše co potřebuje tak, aby to šlo snadno spustit kdekoliv.

Příklad: Představme si, že můj kód potřebuje Python 3.10, několik balíčků nainstalovaných pomocí pipu a běží pouze na Linuxu. Všechny tři věci tedy zabalíme do tzv. image, který pak lze virtualizovaně spustit kdekoliv.

Instalace Docker a Docker-compose

  • Nainstalovat Docker a Docker-compose (připraveno předem)
    • _I na systémech kde je Docker nainstalovaný často docker-compose není by default nainstalovaný. Na Linuxu ho lze doinstalovat např. pomocí apt install -y docker-compose.

Ukázky spouštění věcí zabalených do Dockeru

Pro programy s CLI nebo webovým rozhraním už to možná udělal někdo za nás. Pojďme si to na pár ukázat:

  • příklad: Librespeed - Vlastní test rychlosti sítě
docker run -d --name=librespeed -p 8081:80 -v ${PWD}/librespeed/config:/config --restart unless-stopped lscr.io/linuxserver/librespeed:latest
  • příklad: Python libovolné verze izolovaný od hlavního systému
docker run -it python:3.10
docker run -it python:3.10 bash
docker run -it --volume ${PWD}:/app --workdir /app python:3.10 bash

Jak zabalíme do Dockeru náš projekt?

  • Napíšeme soubor Dockerfile a .dockerignore
  • Následně:
docker build --tag poznejfi1 .
docker run -it poznejfi1 pytest .
docker run -it -p 80:80 poznejfi1
docker run --detach -p 80:80 poznejfi1

Diff

Jak si udělat spouštění ještě jednoduší? (docker-compose)

Konfigurační parametry si můžeme uložit do souboru a verzovat je! Docker-compose navíc usnadňuje propojení více Docker kontejnerů dohromady (např. aplikace + databáze).

Konfiguraci si uložíme do souboru: docker-compose.yaml. Pak stačí udělat:

docker-compose up --build --detach
docker-compose down

Diff

Continuos deployment (15 minut, společně)

Pojďme taky zveřejnit naše dílo! Budeme upravovat soubor .github/workflows/test-publish-deploy.yaml

  • Registrace na Docker Hub (nebo podobné, např. Github Registry) (připraveno předem)

  • Vytvoření API tokenu pro Docker Hub (připraveno předem)

  • Nastavení Github Secrets (Docker API token, SSH přihlašovací údaje)

  • CD: Deploy using git

Diff

  • CD: Build image, push to registry
  • CD: Deploy skript (docker-compose pull, docker-compose up)

Diff

Velké upozornění nakonec

Nyní víte dostatek na to, abyste byli nebezpeční pro sebe i okolí! Vše co jsme si ale dnes ukázali se můžete doučit samostudiem, teď když víte, co je možné. Nezapomeňte při samostudiu na dostatečně silná hesla, šifrování, firewally, zálohování a to, že Docker kontejnery jsou pouze dočasné, pouze věci namountované skrz volumes jsou věčné!

Pokud by zbyl čas, můžeme se podívat na další témata:

Nextcloud

NextCloud image od LinuxServer.io:

---
version: "2.1"
services:
  nextcloud:
    image: lscr.io/linuxserver/nextcloud:latest
    container_name: nextcloud
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC
    volumes:
      - ./nextcloud/appdata:/config
      - ./nextcloud/data:/data
    ports:
      - 443:443
    restart: unless-stopped

Start chvilku trvá, pak dostupný na https://SOME_IP

Git intermediate

  • větve, merge, merge konflikty
  • Github a privátní repositáře

Linux

  • ssh klíče

Self-hosting gotchas

  • Docker obchází firewall (jak UFW, tak některé pravidla z iptables)
  • Jak dělat zálohy volumes
  • Docker na Windows
  • VPN vs Veřejně dostupné z internetu

Cokoliv, co navrhnete

Poznámky pro přednášejícího - co zařídit předem:
  • Udělat kopii tohoto repositáře do lokace ~/example_project
  • Přihlašovací údaje na lokální PC
  • Linux VM
  • vytvořit větev demo na základě větve initial
  • Přihlašovací údaje pro účastníky
    • GitHub účet
    • API klíč pro Docker Hub
    • napsat je do dokumentu, který se nasdílí s účastníky
    • připravit je do repository secrets
  • Na serveru připravit:
apt update
apt install -y docker-compose
docker pull python:3.10
docker pull python:3.10-slim-buster
docker pull lscr.io/linuxserver/librespeed:latest

cd ~
git clone https://github.com/PoznejFIWorkshop/code-to-deployed-app.git example_project
  • na místě workshopu:
    • Na všechny PC nainstalovat GitHub Desktop (pozor - na FI se po každém odhlášení smaže)
    • Na tabuli napsat link na repositář a na přihlašovací údaje

code-to-deployed-app's People

Contributors

borysekondrej avatar

Stargazers

 avatar

Watchers

 avatar Tomáš Kebrle avatar  avatar

Forkers

borysekondrej

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.