Problem:
Rozwijasz projekt w Function App. Dostałeś do napisania funkcję w C#. Funkcja została napisana, przetestowana i wdrożona na produkcję. Jak to w życiu, pojawiają się zmiany wymagań do funkcji, które też rozwijasz wdrażasz i zamiast oczekiwanych zmian widzisz błąd:
"We are not able to load some functions in the list due to errors".
Gdy oglądasz szczegóły błędu widzisz:
"The operation timed out and could not be completed".
W kodzie praktycznie nic się nie zmieniło a aplikacji nie da się uruchomić i używać.
Do zrobienia builda i deploymentu używałem Azure Devops.
Rozwiązanie:
Jeżeli szukasz szybkiego rozwiązania problemu to zaraz Ci go podam. W moim przypadku problemem nie był kod, który zmieniłem, bo zmiana była wręcz kosmetyczna: dodanie jednego loggera do obsługi błędów.
Deployment poprzedniej wersji także sprawiał, że aplikacja znowu zaczynała działać.
Co w takim razie było źle? W Dev Ops pipelines wystarczyło ustawić, żeby czyścił katalog deploymentu.
Niejasne? Już tłumaczę.
Jak to się stało, czyli tło wydarzeń
Kod do Azure Function napisany jest w C# (.Net Framework) i przed wdrożeniem wymaga zbudowania na docelowej platformie. Budowanie było robione przy użyciu Azure Dev Ops.
Aplikacja działała na produkcji przez jakiś czas. Były do niej wprowadzane poprawki i wszystko działało.
Kolejna poprawka sprawiła, że aplikacja się rozsypała. Aplikacja odmówiła posłuszeństwa i przestała działać:
Zmiany kodu do poprzedniej wersji i ponowny deployment nie pomagał rozwiązać problemu. Zmiana była symboliczna: dodanie loggera do obsługi błędów.
Czyszczenie katalogu przed deploymentem
W moim przypadku problemem okazał się brak czyszczenia katalogu przed zrobieniem builda.
Devops ustawiony był w ten sposób, żeby nie czyścić katalogu przed deploymentem, co miało przyśpieszyć wykonywanie builda a spowodowało błędy w deploymencie.
W dokumentacji opisane to jest tutaj:
https://learn.microsoft.com/en-us/azure/devops/pipelines/repos/pipeline-options-for-git?view=azure-devops&tabs=yaml#clean-the-local-repo-on-the-agent