Style guide per lo sviluppo
L’obiettivo è dare alcune indicazioni su come poter lavorare con la nuova Developer platform di Santagostino.
A questo link trovate invece una OTTIMA StyleGuide per la scrittura codice (prendete spunto, al Santagostion lo facciamo!)
Daremo delle linee guida su:
GitHub è il nostro punto d’inizio per tutti gli sviluppi.
Perchè L’abbiamo scelto?
Consigliamo l’utilizzo delle PullRequest per strutturare meglio i rilasci e per avere un doppio check del codice
Consigliamo l’utilizzo dei test per migliorare la stabilità del codice per quelle parti “critiche” del codice.
Alcune note sulle PR
Indicazioni di stile
<feature|bug|fixed|>/[<numero_card>_]<nome_branch>
(esempio feature/42_scopo_della_vita
)[ref #<numero_card> :] <titolo>
Dotenv-vault è lo strumento che utilizziamo per la condivisione e il monitoraggio degli envfile. Gli envfile sono spesso necessari nella fase di start di un progetto e provvedono a fornire i valori per le variabili d’ambiente relative al progetto stesso. Tuttavia gli envfile contengono spesso dati sensibili ed è quindi necessario aggiungere un layer di sicurezza alla condivisone di tali informazioni.
Perchè l’abbiamo scelto?
Nel suo ciclo di vita un Vault deve essere inizializzato una sola volta(Idealmente in fase di inizializzazione del progetto) e aggiornato ogni qualvolta gli envfiles subiscano dei cambiamenti. Vediamo di seguito come è possibile effettuare il primo setup ed utilizzarlo.
Se non è ancora stato installato, il primo comando di dotenv-vault su npx lo installerà per noi.
Per inizializzare un vault è necessario aprire la command line e digitare:
npx dotenv-vault new
Questo ci permette di configurare il vault per la prima volta e genera 2 file:
Una volta inizializzato il vault è possibile effettuare l’update delle proprietà dell’envfile e/o recuperare la versione più recente dell’envfile. Da riga di comando:
make pull-dotenv
esegue lo storage delle modifiche dell’envfilemake push-dotenv
recupera la versione piu’ recente dell’envfile dal vaultN.B: make pull-dotenv
e make push-dotenv
sono rispettivamente i wrapper dei comandi npx dotenv-vault pull
e npx dotenv-vault push
. Tuttavia per coerenza con gli standard è preferibile utilizzare i wrapper.
Per compiere le azioni pull e push è necessario essere autenticati.
Qualora ci fosse bisogno di autenticarsi è sufficiente digitare da riga di comando:
npx dotenv-vault login
Si aprirà una scheda del browser dove è possibile effettuare la login.
E’ possibile gestire gli accessi al vault e controllarne i contenuti.
Da riga di comando è sufficiente digitare:
npx dotenv-vault open
Si aprirà una scheda del browser dove è possibile controllare il nostro vault.
Di seguito disegnamo un flusso di sviluppo che è stato implmentato in tutti gli starterkit e che consigliamo anche per progetti che non partono dagli starterkit.
Da Backstage è possibile “istanziare” un nuovo servizio partendo dallo starterkit che soddisfa i requisiti base.
make init
make create-branch-feature BRANCH=<nome-brnach>
o make create-branch-fix BRANCH=<nome-brnach>
per lo sviluppo (usare le linee guida descritte sopra)make stop
oppure docker-compose stop
per stoppare il dockerNOTA: usare docker-compose start
per attivare i container del progetto già inizializzati e buildati.
NON DIMENTICARE MAI DI FARE GLI UNIT-TEST DEL TUO CODICE, AIUTERANNO LA MANTENIBILITA’ E LA COOPERAZIONE TRA I DEV!!!
Abbiamo creato alcuni starterkit che coprono una buona parte delle possibilità di servizi che possiamo creare.
Uno starterkit è la base di sviluppo che già fornisce alcune funzionalità per aiutare il programmatore e per farlo concentrare sulla business logic, accellerando i tempi di sviluppo (non deve gestire, se non in casi particolari, il deploy e la configurazione del progetto).
Uno starterkit racchiude:
Questo file contiene una serie di script che possono essere utilizati per alcune operazioni.
Aiuta a creare “alias” di comandi.
I comandi che troverete saranno:
make init
: inizializza il progetto e il branch stagemake all
: eseguirà una serire di comandi per inizializzare il progettomake up
: accende i docker per il progettomake cli
: attiva la shell del container dockermake logs
: essendo in docker attivati in detaxch mode questo comando attiva il tail sui logsmake unit-test
: lancia la suite di testmake lint
: lancia il lintmake stage-deploy
: istnaza le librerie necessari per lo sviluppomake build
: istanzia i docker necessarimake check-env-file
: verifica la presenza del env filemake pull-dotenv
: scarica il dotenv dal vaultmake push-dotenv
: mette il dotenv nel vaultmake create-branch-feature BRANCH=<nome-brnach>
: crea un branch partendo da stage e aumenta di una minor version il package.jsonmake create-branch-fix BRANCH=<nome-brnach>
: crea un branch partendo da stage e aumenta di una patch version il package.jsonIndipendentemente dal linguaggio (JS o PHP), per instalalre delel dipendenze, dovete sempre entrare nei container e da li lanciare i comandi. In questo modo non si crea incongruenza con i lockfile dei gestori di pacchetti e non darà errore in prod o stage.
La documentazione (se si parte dagli starterkit) verrà deployata in automatico, si dovrà solo scriverla, perchè non partira dai commenti nel codice
Verrà deployata su backstage in modo tale che sarà disponibile nel catalogo servizi.
La docs usa anche PLANTUML un ottimo plugin per fare grafici in markdown e utile per avere una documentaizone più strututrata e di facile lettura.
Come creare una nuova pagina nelal docs?
mkdocs.yml
aggiungendo la voce di menu desiderata e il path del file MD desiderato/docs/
Se il servizio avrà delle API che potranno essere consumate all’esterno, è bene predisporre anche il file swagger per la documentazione delle API.
Anche questo file verrà letto e gestito da backstage per la generazione della documentazione, nell’apposita sezione API.
Come creare la documentazione per le api?
api-docs
nella folder principale del progetto.<nome-servizio>_api.yml
definition
lo swagger del servizioI dati per accedere ai servizi (database, token API, chiavi JWT) sono dati molto sensibili, e averli in chiaro su un repository, potrebbero minarne la sicurezza.
Si è scelto di utilizzare le secrets di GitHub per conservare questi dati e passarli sempre come variabili nei workflow e negli ambienti di stage/prod.
L’organizzazione ha già molte chiavi di default che possono essere utilizzate, in più ogni repository può avere le sue personali.
Localmente : Utilizzare il file .env (nel repository è commentato e deve essere creato come il file .env.template
)
Per ambienti di stage e prod
docker-compose.yml
prod.yml
stage.yml
nella sezione envCome utilizzarli
make init
Best practice #1: se la secrets sarà usata da più servizi allora è bene metterla a livello di organizzazione.
Best practice #2: per uniformare l’utilizzo delle secrets è bene utilizzare nomi generali sul progetto (senz aindicare ambinete di STAGE o PROD) cosi che solo nei workflow si vanno a settare le secrets corrette per i vari ambienti su cui si sta facendo il deploy.
Consigliamo di utilizzare il plugin di VSCode REST API perchè permette di avere dei file testuali all’interno del git (opportunamente formattati) per fare chiamate REST.
Il vantaggio sarà quello di condividere tramite GIT le nostre chiamate e di averne alcune di test utili per debug.
NOTA #1: utilizzare estensione .http per avere identazione, colorazione e autocompletamento
NOTA #2: se le nostre API da testare utilizzano delle APIKEY sfruttare i file .env per inserire la chiave cosi rimarrà locale e non sarà pushata su git.
Un progetto di sviluppo (grande o piccolo che sia) per noi è considerato finito quando:
Per DoD Tecnica definiamo quei punti che devono essere fatti sul progetto su cui si è lavorato (che sia un servizio nuovo o esistente).
Qui sotto elenchiamo i punti che un DEV dovrebbe sempr efare in un progetto:
Alcuni strumenti che consigliamo per gestire al meglio un progetto