Dostępny jest otwarty system automatyzacji procesów budowania Cicada, który pozwala na wdrożenie na własnym serwerze infrastruktury podobnej do GitHub Actions, Azure DevOps i GitLab CI, niezależnie od usług w chmurze. Kod projektu jest napisany w języku Python i rozpowszechniany na licencji AGPLv3.
System jest w stanie automatycznie uruchamiać skrypty budowania i testowania baz kodu w momencie wystąpienia określonych zdarzeń, takich jak otrzymanie żądania push w Git, tworzenie wydań, otwieranie/zamykanie problemów oraz otwieranie/zamykanie żądań pull. Wyjątkową cechą Cicada jest zapewnienie możliwości określenia logiki działania w kontekstowo zorientowanym języku programowania, który wspiera zmienne, wyrażenia, pętle, bloki warunkowe i wbudowane funkcje. on git.push fn test(kompilator): env.CC = kompilator echo Testowanie (kompilator) shell make clean all let kompilatory = ["gcc", "clang"] for kompilator in kompilatory: test(kompilator)
Proponowany język pozwala łatwo tworzyć obsługujące, które trudno opisać w plikach konfiguracyjnych opartych na formacie YAML, i umożliwia obejście się bez zewnętrznych skryptów w Shell lub Pythonie. Przy tym zastosowane podejście rozwiązuje również problem z niekompatybilnością formatów YAML używanych na różnych platformach automatyzacji budowy. W Cicada oferowane są uniwersalne typy zdarzeń niezależne od platformy, które pozwalają przypisać ten sam skrypt automatyzacji do różnych platform, na przykład, obsługujący żądania push mogą być przypisane do zdarzeń pochodzących z GitHub i GitLab.
Szczególną uwagę zwraca się również na bezpieczne przechowywanie tokenów i haseł używanych do dostępu do API, repozytoriów i środowisk instalacji wynikowych budów. Tego typu poufne informacje przechowywane są w formie zaszyfrowanej (AES-GCM z 256-bitowym kluczem) za pomocą narzędzi HashiCorp Vault. Dla każdego repozytorium i punktu instalacji tworzony jest oddzielny klucz szyfrujący, klucze są automatycznie aktualizowane co 30 dni, a magazyn kluczy działa na osobnym serwerze.
Domyślne dane nie są przekazywane przez zmienne środowiskowe, a dostęp do repozytoriów jest tylko do odczytu. Istnieje wbudowana ochrona przed wstawianiem poleceń do wyrażeń, zapewniająca automatyczne maskowanie niebezpiecznych konstrukcji, na przykład wyrażenie ‘let name = «; rm -rf /»; echo Hello, (name)’ nie spowoduje wykonania polecenia „rm”. Wśród optymalizacji wyróżnia się wbudowany system cache'owania wyników kompilacji i ładowania zasobów.
Źródło: opennet.ru
