Достъпната отворена система за автоматизация на процесите по сглобяване Cicada позволява на собствения си сървър да разгръща инфраструктура, подобна на GitHub Actions, Azure DevOps и Gitlab CI, независима от облачни услуги. Кодът на проекта е написан на Python и се разпространява под лиценция AGPLv3.
Системата е способна автоматично да стартира сценарии за сглобяване и тестване на кодови бази при определени събития, като получаване на push заявки в Git, създаване на релийзи, отваряне/затваряне на issues и отваряне/затваряне на pull заявки. Отличителна черта на Cicada е предоставянето на логика за работа чрез предметно ориентиран функционален език за програмиране, който поддържа променливи, изрази, цикли, условни блокове и вградени функции. 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)
Предложеният език позволява лесно създаване на обработчици, които е трудно да се опишат в конфигурационни файлове с YAML формат, и дава възможност да се заобиколят външни скриптове на Shell или Python. Осъщественият подход също решава проблема с несъвместимостта на YAML формати за конфигурация, използвани в различни платформи за автоматизация на сглобявания. В Cicada се предлагат универсални типове събития, независими от платформата, които позволяват свързването на един и същ автоматизационен сценарий с различни платформи, например, обработчикът на push заявки може да бъде свързан със събития от GitHub и Gitlab.
Особено внимание се обръща на сигурното съхранение на токени и пароли, използвани за достъп до API, репозитории и среди за инсталиране на резултатните сглобявания. Подобна конфиденциална информация се съхранява в криптиран вид (AES-GCM с 256-разряден ключ) с инструменти на HashiCorp Vault. За всяко репозиторио и точка на инсталация се създава отделен ключ за криптиране, ключовете се актуализират автоматично на всеки 30 дни, а хранилището на ключовете работи на отделен сървър.
По подразбиране, секретните данни не се предават чрез променливи среди, а в хранилището се предоставя само достъп за четене. Има вградена защита срещу инжектиране на команди в изрази, което осигурява автоматично екраниране на опасни конструкции, например, изразът ‘let name = «; rm -rf /»; echo Hello, (name)’ няма да доведе до изпълнение на командата «rm». Сред оптимизациите е вградена система за кеширане на резултатите от компилацията и зареждането на ресурси.
Източник: opennet.ru
