È disponibile un sistema di automazione dei processi di build chiamato Cicada, che consente di implementare un'infrastruttura simile a GitHub Actions, Azure DevOps e GitLab CI sul proprio server, senza dipendere dai servizi cloud. Il codice del progetto è scritto in Python e distribuito sotto licenza AGPLv3.
Il sistema è in grado di avviare automaticamente script di build e test delle basi di codice al verificarsi di determinati eventi, come l'invio di una richiesta push in Git, la creazione di release, l'apertura/chiusura di issue e l'apertura/chiusura di pull request. Una caratteristica distintiva di Cicada è la fornitura di un linguaggio di programmazione funzionale orientato al dominio, che supporta variabili, espressioni, cicli, blocchi condizionali e funzioni incorporate. on git.push fn test(compiler): env.CC = compiler echo Testing (compiler) shell make clean all let compilers = [«gcc», «clang»] for compiler in compilers: test(compiler)
Il linguaggio proposto consente di creare facilmente gestori che sono problematici da descrivere nei file di configurazione basati sul formato YAML, ed elimina la necessità di collegare script esterni in Shell o Python. Inoltre, l'approccio implementato risolve anche il problema dell'incompatibilità dei formati YAML di configurazione utilizzati nelle diverse piattaforme di automazione delle build. Su Cicada vengono offerti tipi di eventi universali indipendenti dalla piattaforma, che permettono di legare lo stesso script di automazione a diverse piattaforme; ad esempio, un gestore di richieste push può essere collegato a eventi provenienti da GitHub e GitLab.
Particolare attenzione è dedicata anche alla memorizzazione sicura di token e password utilizzati per accedere alle API, ai repository e agli ambienti per l'installazione delle build risultanti. Queste informazioni riservate sono conservate in forma crittografata (AES-GCM con una chiave a 256 bit) utilizzando gli strumenti di HashiCorp Vault. Per ogni repository e punto di installazione viene creato un chiave di crittografia separata, le chiavi vengono aggiornate automaticamente ogni 30 giorni e il magazzino delle chiavi è avviato su un server separato. server.
I dati segreti per impostazione predefinita non sono trasmessi tramite variabili d'ambiente, e viene aperto solo l'accesso in sola lettura al repository. È presente una protezione integrata contro l'inserimento di comandi nelle espressioni, garantendo l'escape automatico delle costruzioni pericolose; ad esempio, l'espressione ‘let name = «; rm -rf /»; echo Hello, (name)’ non porterà all'esecuzione del comando «rm». Tra le ottimizzazioni, si segnala un sistema di caching integrato per i risultati di compilazione e caricamento delle risorse.
Fonte: opennet.ru
