Webhook to bardzo prosty, a jednocześnie niezwykle efektywny mechanizm pozwalający na dwóm aplikacjom na przekazywanie sobie nawzajem danych. Jeżeli potrzebujemy ze sobą zintegrować różne aplikacje wykorzystywane w infrastrukturze przeznaczonej do wykonywania zautomatyzowanych działań, na pewno bardzo szybko zetkniemy się z tym mechanizmem. Wiele rozszerzeń w popularnych programach zbudowanych jest właśnie w oparciu o ten mechanizm. Ja wykorzystałem go aby przekazywać status wykonania zadań w Jenkins do kanału w Microsoft Teams, dzięki czemu mogę na bieżąco reagować na problemy.
Webhook
Idea webhook-ów powstała jako jeden z elementów całej koncepcji API (Application Programming Interface), czyli interfejsu pozwalającego na programowanie aplikacji. Za jego pomocą jedna aplikacja może komunikować się z inną i wymieniać między sobą dane. Interfejsy API mogą udostępnione zarówno w postaci usługi nasłuchującej na wskazanym porcie, jak i jako proces obsługujący gniazda (sockets).
Webhook to metoda komunikacji dwóch aplikacji poprzez ich interfejsy API w czasie rzeczywistym. W typowych rozwiązaniach aplikacja A musi nieprzerwanie odpytywać aplikację B o interesujące ją informacje. W ten sposób na bieżąco aktualizuje posiadane dane, lecz obciąża to zasoby obu z nich. Stosując webhooki, to aplikacja B przesyła w czasie rzeczywistym dane do aplikacji A, informując ją tym samym o każdej zmianie jej stanu.
W dobie Internetu zarówno interfejsy API, jak i sam mechanizm webhook-ów, w swoim działaniu wykorzystują o protokół HTTP. Korzystają ze zdefiniowanych w nim akcji takich jak GET czy POST. Komunikacja powinna się odbywać w sposób zaszyfrowany, tak jak ma to miejsce przy otwieraniu obecnie większości stron WWW. Same zaś dane są zazwyczaj przesyłane w postaci obiektu typu JSON – pisałem o nich w jednym z moich poprzednich artykułów.
Integracja Microsoft Teams z Jenkins
Microsoft Teams to dynamicznie rozwijane narzędzie do pracy grupowej w rodzinie produktów Microsoft365. Jego podstawowe funkcjonalności możemy rozszerzać za pomocą dostępnych wtyczek, które integrują podstawowe funkcje produktu z zewnętrznymi aplikacjami. Właśnie za pomocą takiej wtyczki zintegrujemy nasze dwa produkty. Chcemy, aby każde wykonanie projektu w Jenkins kończyło się przekazaniem i wyświetleniem w wybranym przez nas kanale w ramach zespołu w Microsoft Teams informacji o statusie jego wykonania. Dzięki temu na bieżąco możemy obserwować bez przełączania się do samego Jenkins status projektów.
Wtyczki (connectors) dodajemy do poszczególnych kanałów. W tym celu z menu wybranego kanału wybieramy opcję Connectors. Pojawi nam się ekran zarządzania wtyczkami przypisanymi do wybranego kanału. Wyszukujemy wtyczkę o nazwie “Jenkins” i przystępujemy do jej konfiguracji.
Skonfigurować musimy tak na prawdę jednie jej nazwę. Po jej wprowadzeniu, zobaczymy unikalny dla tego połączenia adres URL. To za jego pomocą Jenkins będzie przekazywał informacje do Teams.
Poniżej znajdziemy też krótką instrukcję czynności, które musimy wykonać już w samym Jenkinsie
Konfiguracja Jenkins-a
Podobnie jak w Microsoft Teams także Jenkins pozwala na rozszerzanie jego podstawowych funkcjonalności poprzez wtyczki. Aby Jenkins potrafił rozmawiać Microsoft Teams, musimy zainstalować wtyczkę o nazwie Office 365 Connector. W tym celu wybieramy z menu opcję Manage Jenkins, a następnie Manage Plugins i wyszukujemy na liście dostępnych wtyczek tą, która nas interesuje.
Teraz dodajemy nową akcję do wybranego przez nas projektu lub projektów. Do każdego z nich czynność tą będziemy musieli powtarzać. Z poziomu projektu wybieramy Configure. W oknie konfiguracji powinna nam się pojawić nowa zakładka Office 365 Connector. Aby dodać nowy webhook, wciskamy przycik Add Webhook, wprowadzamy adres URL, który wygenerowała nam wtyczka w Microsoft Teams oraz wybieramy, w jakich sytuacjach ma on być wysyłany.
Komunikaty na kanale są wyświetlane w ściśle zdefiniowanej formie. My nie musimy się głowić jakie dane muszą zostać wysłane przez Jenkinsa oraz w jaki sposób przetworzone przez Microsoft Teams. Wystarczy, że wybierzemy odpowiednie opcje. Ja wysyłam u siebie jedynie informacje o statusie wykonania procesu zdefiniowanego w Jenkins. Tak wyglądają na moim kanale informacje o udanym i nieudanym wykonaniu projektu.