Доступна открытая система автоматизации сборочных процессов Сicada, позволяющая на своём сервере развернуть инфраструктуру, похожую на GitHub Actions, Azure DevOps и Gitlab CI, не зависящую от облачных сервисов. Код проекта написан на языке Python и распространяется под лицензией AGPLv3.
Система способна автоматически запускать сценарии сборки и тестирования кодовых баз при срабатывании определённых событий, таких как поступление push-запроса в Git, создание релизов, открытие/закрытие issue и открытие/закрытие pull-запросов. Отличительной чертой Сicada является предоставление для определение логики работы предметно ориентированного функционального языка программирования, поддерживающего переменные, выражения, циклы, условные блоки и встроенные функции.
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-форматов конфигурации, используемых в разных платформах автоматизации сборок. В Сicada предлагаются независимые от платформ универсальные типы событий, которые позволяют привязать один и тот же сценарий автоматизации к разным платформам, например, обработчик push-запросов может быть прикреплён к событиям, поступающим из GitHub и Gitlab.
Особое внимание также уделяется безопасному хранению токенов и паролей, применяемых для доступа к API, репозиториям и окружениям для установки результирующих сборок. Подобная конфиденциальная информация хранится в зашифрованном виде (AES-GCM c 256-разрядным ключом) при помощи инструментария HashiCorp Vault. Для каждого репозитория и точки установки создаётся отдельный ключ шифрования, ключи автоматически обновляются каждые 30 дней, хранилище ключей запускается на отдельном сервере.
Секретные данные по умолчанию не передаются через переменные окружения, а в репозиторий открывается только доступ на чтение. Имеется встроенная защита от подстановки команд в выражения, обеспечивающая автоматическое экранирование опасных конструкций, например, выражение ‘let name = “; rm -rf /”; echo Hello, (name)’ не приведёт к выполнению команды “rm”. Из оптимизаций отмечается встроенная система кэширования результатов компиляции и загрузки ресурсов.