Sign in / Register
Structure

Vytvoření adresářové struktury

Termín na odevzdání je neděle ve druhém výukovém týdnu do 23:59.

V aktuálním adresáři upravte skript run.sh. Skript bude mít následující 2 úkoly:

  1. Vytvořit v domovském adresáři (~) adresářovou strukturu:

    ~/ulohy/tyden01/
    ~/ulohy/tyden02/
    ⋮
    ~/ulohy/tyden13/
  2. V adresáři ~/ulohy/tyden01 vytvořit jakýmkoli způsobem soubor Hotovo.txt, jehož obsahem bude uživatelské jméno aktuálního uživatele, který spouští tento skript (použijte příkaz whoami).

Celkově tedy bude struktura souborů/adresářů vypadat:

~
└── ulohy
    ├── tyden01
    │   └── Hotovo.txt
    ├── tyden02
    ├── tyden03
    ├── tyden04
    ├── tyden05
    ├── tyden06
    ├── tyden07
    ├── tyden08
    ├── tyden09
    ├── tyden10
    ├── tyden11
    ├── tyden12
    └── tyden13

run.sh

Lokální vývoj a testování

Pro vývoj a testování úlohy na lokálním počítači (oproti vyhodnocení na Gitlabu/IGA) je možné použít připravené skripty, které spustí skript úlohy (run.sh) v docker/podman kontejneru (virtuálním počítači s předpřipraveným operačním systémem a nástroji) a provede testy řešení úlohy.

Doporučuji použít nástroj podman (ve skriptu je nastaven jako výchozí) místo nástroje docker, který je asi známější. podman je jednak k dispozici na školních počítačích (docker není), ale především pro podporu overlay připojení souborů do kontejneru. Tento režim umožní zápis do připojených souborů/adresářů, aniž by došlo ke změně připojovaných dat - vytvoří nad připojovanými daty další vrstvu, kterou po skončení kontejneru zahodí.

Pokud nástroj podman (nebo docker) na svém počítači nemáte, je potřeba jej nainstalovat. Na domovské stránkce podmanu najdete návod na instalaci pro různé operační systémy.

Pokud byste trvali na použití nástroje docker, nastavte proměnnou prostředí container na hodnotu docker, např.:

  • container=docker .academy/t , nebo
  • export container=docker; .academy/t

Pro vývoj je připraven skript .academy/dev a pro testování je to skript .academy/t. Oba skripty jsou velmi podobné a liší se pouze ve dvou ohledech. Oba připojí kořen repozitáře úlohy do domovského adresáře (/root) v kontejneru (pokud možno v "overlay" režimu) a spustí testy.

  1. Skript dev ale po skončení testů zůstane v kontejneru, aby bylo možné analyzovat výsledek a
  2. soubor run.sh je připojený v režimu zápisu, aby se jeho úpravy propsaly do repozitáře úlohy. Pro opakování testů je uvnitř kontejneru možné použít funkci t, která znovu spustí testy.

Pokud z nějakého důvodu váš systém nepodporuje podman overlay, přidejte skriptům při spouštění přepínač -o. Tedy např. .academy/dev -o nebo .academy/t -o. Tím se vypne vlastnost overlay při připojování adresářů.

Na rozdíl od testů v rámci Gitlabu/IGA, které pouze vyhodnotí správnost řešení a zobrazí výsledky testů, skripty dev a t zobrazí i rozdíly mezi očekávaným a obdrženým výsledkem (pomocí nástroje diff). Ukázka výstupu příkazu .academy/t:

evaluate_shell[test]: 01: Structure                     [ OK ]
evaluate_shell[test]: 01: Content                       [ FAILED ]
--- Expects (.test01_content)
+++ Gets
@@ -1 +1 @@
-root
+pokus

Příklad výstupu ukazuje rozdíl mezi očekávaným obsahem (zde ze souboru .test01_content) - označeným jako Expects a studentským řešením, označeným jako Gets. Následující řádek ukazuje pozici (číslo/interval řádků) ve Expects a Gets, kde jsou rozdíly - tedy 1. řádek v souboru Expects a 1. řádek v souboru Gets. Následují řádky označující změny, které je potřeba provést v souboru Expects, aby byl stejný jako Gets. Zde je potřeba přidat řádek obsahující root (očekáváme) a naopak ubrat řádek obsahující pokus (dostali jsme). Pro snadnější pochopení je možné výstup číst jako: Chybí řádek root (-), přebývá řádek pokus (+).

How-To

Úlohy lze řešit přímo v systému IGA, úpravou skriptu run.sh v textovém poli a kliknutím na tlačítko ▶ Evaluate, případně v GitLab editoru a prohlédnutí výsledku v CI/CD GitLabu.

Pro efektivní, lokální, práci však doporučuji:

  1. Používat terminál a v něm zkoušet úlohu řešit - uvidíte výstup a chybové hlášení příkazů a shell provede kontrolu syntaxe.
  2. Naučit se používat některý z klasických editorů pro příkazový řádek (nainstalované jsou vi/vim, joe, nano) pro úpravu skriptu uvnitř kontejneru (v rámci .academy/dev). Změny run.sh zevnitř kontejneru se propíší do repozitáře okamžitě. Naopak, pokud změnu run.sh provedete mimo kontejner, projeví se až při dalším spuštění kontejneru.
  3. Naučit se používat git z příkazové řádky
  4. Hledat chyby nástrojem shellcheck

Příprava prostředí před řešením úlohy (stačí udělat jednou, pokud jste to už neudělali), detaily viz Vzdálený přístup:

  1. Přihlásit se do IGA/GitLabFIT
    • Kliknout na tlačítko Sign in / Register vpravo nahoře této stránky, IGA
    • Kliknout na tlačítko Gitlab FIT !!!, což vás přesměruje na fakultní GitLab
    • Zadat přihlašovací údaje k fakultnímu GitLabu (detaily v Návodech FIT)
  2. Vytvořit si SSH klíče v terminálu:
     ssh-keygen
  3. Vypsat veřejný klíč v terminálu a nahrát jej do Gitlab IGA. Návod je pro přidání klíče do Gitlab FIT, pro tyto úlohy na IGA je však pořeba nahrát klíč do Gitlab IGA:
     cat ~/.ssh/id_ed25519.pub

Příklad práce na této úloze:

  1. Vyzvednout si (+ Acquire) úlohu, tím se v zápatí aktivuje tlačítko 🗗 SSH pro zkopírování příkazu na klonování repozitáře
  2. Kliknout na tlačítko 🗗 SSH v zápatí stránky, tím se do schránky (clipboardu) zkopíruje text
  3. Vložit do terminálu obsah schránky (CTRL+SHIFT+V), např:
     git clone git@gl.iga.ksi.fit.cvut.cz:bi-uos/b251/structure/_vase-username_.git bi-uos-structure
  4. Vstoupit do naklonovaného adresáře bi-uos-structure (můžete si urychlit práci tím, že po cd stisknete ESC., čímž se vloží poslední slovo předchozího příkazu):
     cd bi-uos-structure
  5. Spustit vývojové prostředí (podman container):
     .academy/dev

    Tím se stáhne image systému (pouze poprvé), pak se spustí kontejner s imagem, kde budeme jako uživatel root (s domovským adresářem /root) a s repozitářem úlohy připojeným do /mnt. Změní se prompt, např.: bf0ab3336af2:/mnt#), jak je vidět, nejsme v domovském adresáři, ale v adresáři s repozitářem úlohy. Na začátku se v kontejneru spustí testy nad řešením/skriptem run.sh. Jelikož je zatím řešení prázdné, uvidíte, že neprochází testy a jaká je rozdíl mezi očekávanou a momentální situací, tedy něco jako:

     evaluate_shell[test]: 01: Structure                     [ FAILED ]
     --- Expects (.test01_structure)
     +++ Gets
     @@ -1,15 +1 @@
     -d /root/ulohy
     -d /root/ulohy/tyden01
     -d /root/ulohy/tyden02
     -d /root/ulohy/tyden03
     -d /root/ulohy/tyden04
     -d /root/ulohy/tyden05
     -d /root/ulohy/tyden06
     -d /root/ulohy/tyden07
     -d /root/ulohy/tyden08
     -d /root/ulohy/tyden09
     -d /root/ulohy/tyden10
     -d /root/ulohy/tyden11
     -d /root/ulohy/tyden12
     -d /root/ulohy/tyden13
     -f /root/ulohy/tyden01/Hotovo.txt
     +
     evaluate_shell[test]: 01: Content                       [ FAILED ]
     diff: can't stat '/root/ulohy/tyden01/Hotovo.txt': No such file or directory
  6. Přejít do domovského adresáře:
     cd
  7. Zkusit vytvořit ručně adresář ulohy:
     mkdir ulohy
  8. Spustit znovu testy:
     t

    Tentokrát už první řádka rozdílů nebude začínat znakem -:

     evaluate_shell[test]: 01: Structure                     [ FAILED ]
     --- Expects (.test01_structure)
     +++ Gets
     @@ -1,15 +1 @@
      d /root/ulohy
     -d /root/ulohy/tyden01
     …
  9. Přidat poslední 2 příkazy do skriptu (pozor, teď jsme v jiném adresáři, takže použijeme absolutní cestu) /mnt/run.sh nebo ~-/run.sh:
     echo cd >> /mnt/run.sh
     echo mkdir ulohy >> /mnt/run.sh

    nebo lépe, pomocí editoru, např. nano, nebo odvážnější pomocí vim:

     nano /mnt/run.sh

    V editoru nano se uložení+ukončení provede CTRL+X (po potrvrzení změn: y) .

    ESC . vloží poslední argument (slovo) předchozí řádky

    Časem možná zjistíte, že někdy je snazší si situaci nekomplikovat změnou pracovního/aktuálního adresáře a místo toho soubory zadávat včetně cesty.

  10. Najít případné chyby pomocí nástroje shellcheck:
     shellcheck /mnt/run.sh

    Prázdný výstup znamená žádné nalezené chyby. Své řešení můžete vylepšit podle nápovědy shellchecku (pokud chcete), nebo se na poukazovaný problém zeptat (na webu shellchecku pod uváděným kódem nebo na cvičení).

  11. Ukončit vývojové prostředí:
     exit

    nebo stiskem klávesy CTRL+D

  12. Spusit jenom testy nad současnou podobou řešení:
     .academy/t
  13. Uložit postup práce do repozitáře a nahrát na server
     git add run.sh
     git commit -m 'Create main dir'
     git push

Nový obsah skriptu run.sh uvidíte:

  1. v prostředí IGA (po obnovení/reloadu stránky) a výsledek testů pak uvidíte po kliknutí na tlačítko Save and Evaluate (pokud jste skript změnili), nebo
  2. v prostředí Gitlabu, kliknutím na tlačítko Gitlab (odvede vás na náhled skriptu run.sh) a následně kliknutím na ikonu (✔️) vpravo nad obsahem souboru a následně kliknutím na tlačítko evaluate.

Nečekejte zatím jiný výsledek, než FAILED, jenom jsme se lehce posunuli k řešení, ale testy stále neprochází. Dále už pokračujte sami.

V obou případech se na Gitlabu spouští testy ve strohém režimu, kdy se nezobrazují rozdíly výsledku oproti očekávání. Proto je pro řešení úlohy lepší používat terminál (ideálně s připraveným prostředím .academy/dev a .academy/t), než naslepo psát kód do editoru v prohlížeči (v IGA nebo Gitlab prostředí).

Úvod do Test-driven development (TDD): Jak můžete vidět, všechny testy, jejich provedení, předávané hodnoty i očekávané výstupy jsou otevřené. Zkoumejte jejich činnost, upravujte je, nebo přidávejte další dle libosti.

Případné problémy nebo náměty posílejte na lukas.barinka@fit.cvut.cz