Table of Contents

Laborator 07 - CI/CD & Documentation

Documentatia

Comentariile

Comentariile sunt printre cele mai folosite si abuzate moduri de a documenta codul. Desi acestea nu sunt recomandate pentru toate cazurile acestea pot fi folosite pentru a ascunde diverse imperfectiuni ale codul sau proiectului ca nume neinspirate ale variabilelor sau functiilor, design slab al codului sau lipsa uneltelor de proces (sistem de versionare, issue tracking etc.). Comentariile pot fi utile pentru a explica de ce este facut un lucru in cod, pentru a documenta un design bazat pe pseudo-cod sau pentru a referentia lucruri conexe.

Tipuri de comentarii

Documentarea unui API

Uneltele de documentare a API-urilor au devenit extrem de comune in prezent. Acestea:

DoxyGen

Unul dintre cele mai cunoscute unelte de documentare a API-urilor. In acest laborator vom folosi Docstring-uri fiind cea mai utilizata conventie de scriere a comentariilor in cadrul limbajului Python. DoxyGen va genera documentatia automat folosindu-se de prezenta comentariilor in format Docstring.

Pentru a instala DoxyGen puteti folosi comanda:

sudo apt install doxygen

Pentru a putea genera documentatia aceasta are nevoie de un fisier de configurare, Doxyfile. Pentru a genera un template pentru acest fisier puteti folosi comanda:

doxygen -g

Pentru a rula DoxyGen, puteti rula direct in terminal:

doxygen

Daca sunt necesare alte configuratii, atunci va fi necesara schimbarea fisierului Doxyfile.

Continuous Integration

In cadrul Continuous integration practicile de version control, compilarea si testarea automata sunt combinate astfel incat schimbarile care ajung in repository-ul de version control sunt automat verificate, testate si regenerate rapoartele aferente. Este de preferat sa se faca aceste lucruri complet sau partial pentru a reduce riscul ca schimbarile noi sa introduca probleme ca erori de compilare sau bug-uri.
Pentru ca sunt multi pasi necesari in a executa un plan de Continuous Integration, durata poate sa fie extrem de mare. Datorita acestui fapt, de fiecare data cand se introduc schimbari noi se va prefera rularea unui plan redus(de exemplu care include compilarea si analiza statica, dar nu include testare si analiza dinamica). Planul complet poate sa fie rulat ocazional, cum ar fi peste noapte, cand poate sa dureze mult mai mult. Pentru a putea beneficia de Continuous Integration, un proiect trebuie sa aiba mai multe caracteristici:

Avantaje:

Dezavantaje:

Sistem de Continuous Integration


Un server de Continuous Integration este o masina accesibila din retea care:

Un CI runner (sau nod) e un proces pe o masina care:

Cand un runner este notificat de serverul de CI, acesta:

GitHub Actions

GitHub furnizeaza o solutie integrata de Continuous Integration printr-un serviciu numit “Actions”.
Acest serviciu poate fi accesat din pagina proiectului, selectand tab-ul Actions, de exemplu.
Pentru a creea un Action nou, este necesara creearea unui fisier de workflow la calea .github/workflows/ din repository. Acest lucru se poate face atat local cat si din GitHub. Fisierul de workflow are extensia .yml pentru ca foloseste sintaxa YAML si contine indicatii legate de cand si ce este executat in cadrul unui action. Un exemplu de fisier de workflow gasiti aici.
Fisierele ce pot rezulta in urma rularii anumitor pasi pot fi publicate ca artefacte si in cadrul GitHub Actions. Pentru a face acest lucru, puteti folosi urmatoarea sintaxa, dupa pasul de generare al fisierului dorit:

- name: Upload a Build Artifact
    uses: actions/upload-artifact@v3.0.0
    with:
      # Artifact name
      name: # optional
      # Destination path
      path: # optional

Generarea unui artefact de build este o extensie a sistemului oferit de GitHub. Aici gasiti marketplace-ul cu toate extensiile disponibile pentru GitHub Actions.

Exercitii

  1. Clonati repo-ul.
  2. Folositi DoxyGen pentru a genera documentatia deja existenta in acest proiect. Verificati fisierul html/index.html pentru a observa ce functii sunt deja documentate.
  3. Adaugati Docstrings si pentru celelalte functii din fisierul tree.py.(TODO 1)
  4. Implementati functiile _printPreorderTree si _printPostorderTree si scrieti cel putin 2 unit teste pentru functia _find.
  5. In GitHub, creati un action care ruleaza unit testele pentru fiecare commit nou adaugat pe branch-ul main. Pentru a putea face acest lucru, faceti un fork al repository-ului si actualizati branch-ul main al fork-ului nou creat.
  6. Actualizati action-ul creat anterior, astfel incat acesta sa se ruleze numai atunci cand se creaza un pull request.(Hint)
  7. Creati o noua actiune care ruleaza doxygen, doar atunci cand se creeaza un nou tag cu o noua versiunea a aplicatiei, si salveaza documentatia ca un artefact.(Hint)

Este recomandat sa folositi un fisier .gitignore care va ignora fisierele ce nu sunt necesare a fi incarcate in repo (cum ar fi fisierele executabile compilate). Acest fisier trebuie adaugat in folder-ul repository-ului (preferabil in root-ul acestuia) si adaugat in remote cu urmatorul commit. Un exemplu de continut pentru acest fisier gasiti aici.