Çatdırılma səhifəsi vaxt aşımı göstərir və Jenkins heç nə qeyd etmir; bu, heç vaxt gəlməmiş bir bağlantının əlamətidir. GitHub webhook-u öz infrastrukturundan konfiqurasiya etdiyiniz payload URL-ə doğru gedən HTTP POST kimi göndərir. VPN Jenkins-i məhz bu cür bağlantını rədd etməklə qoruyur. Hər iki tərəfdə heç nə pozulmayıb. Problemin özü sorğunun istiqamətidir.

Çatdırılma əslində nəyə cəhd edir

GitHub payload URL-dəki host adını həll edir və ona açıq internetdən qoşulur. Əgər o URL xüsusi ünvana, yaxud yalnız şəbəkənizin içində həll olunan ada işarə edirsə, cəhd heç bir sorğu göndərilməmişdən uğursuz olur. Əgər kənarınızın atdığı açıq ada işarə edirsə, cəhd bunun əvəzinə vaxt aşımına uğrayır.

Bu fərq diaqnostika üçün vacibdir. DNS xətası və filtrdən keçməyən port hər ikisi Jenkins tərəfində heç nə olmamış kimi görünür və hər ikisi GitHub-da fərqli səbəb əlavə olunmuş uğursuz çatdırılma kimi görünür. URL-i dəyişməzdən əvvəl həmin səbəbi oxuyun.

Xaricə qoşulan tunel dinləyici yaratmır. İnsanların fərqli işləməsini gözlədiyi hissə məhz budur.

Bağlantının istiqamətini düzəltməyin üç yolu

Hər həll bağlantını kimin başlatdığını dəyişir və yalnız üç forma var.

ApproachWho initiatesWhat you give up
Relay serviceAn outbound client inside the networkA third party sees every payload
Reverse tunnel or ingressThe public edge, into a controlled listenerAn inbound surface you must secure
Runner or pollingThe agent, outbound to GitHubInstant delivery, replaced by a schedule

Sorğu göndərmə ən az zərif və idarə etməsi ən asan üsuldur. Relay port açmadan demək olar ki, ani əks əlaqə saxlayır. Payload məxfiliyi üçüncü tərəfi istisna etdikdə runner adətən düzgün cavabdır, çünki iş artıq şəbəkənin içində olan maşında çalışa bilər.

Müasir səslənənə görə deyil, idarə edə bildiyinizə görə seçin.

Çatdırılmanı smee ilə xaricə ötürün

Relay xidmətində kanal yaradın və onun URL-ni saxlayın. Şəbəkənin içində klienti quraşdırın və çatdırılmaları Jenkins-in gözlədiyi yola ötürün. Repozitoriya parametrlərindəki payload URL kanalın URL-nə çevrilir, məzmun növü isə application/json təyin olunur.

sudo npm install --global smee-client
smee -u CHANNEL_URL --path /github-webhook/ --port 8080

Üç detal işləyib-işləmədiyini həll edir. Yol GitHub hadisələri üçün Jenkins-in gözlədiyi ilə uyğun olmalıdır, bu da standart olaraq /github-webhook/-dir. Jenkins klientə verdiyiniz portda dinləməlidir. Və işdə konfiqurasiya olunmuş Jenkins URL həmin yolla uyğun olmalıdır, əks halda hadisə gəlir və sonra atılır.

Sonda əlavə slash uyğunsuzluğu 404 yaradır; bu, çatdırılma xətası kimi oxunur, amma deyil.

Həftəni keçəcək şəkildə işə salmaq

Ön planda işləyən klient terminal ilə birlikdə ölür və webhook-lar bir gün işləyib dayanır. Ona Restart=always olan unit verin, Jenkins istifadəçisi kimi işə salın və ilk real çatdırılmadan sonra jurnalı oxuyun. İşləyən relay-i konfiqurasiya edilmiş relay-dən ayıran son addım məhz budur.

[Unit]
Description=smee webhook relay
After=network.target

[Service]
Type=simple
Restart=always
RestartSec=2
User=jenkins
ExecStart=/usr/bin/smee -u CHANNEL_URL --path /github-webhook/ --port 8080

[Install]
WantedBy=multi-user.target

Təkrar düyməsi ilə deyil, real push ilə sınaqdan keçirin. Təkrar relay-in saxladığı payload-ı işlədir, GitHub-dan kanalınıza qədər olan yolu yox, ona görə canlı çatdırılma hələ də uğursuz olduğu halda keçə bilər.

Unit dayandıqda xəbərdarlıq qurun. İşləməyən relay təbiətinə görə səssizdir və səssizlik artıq ayırdığınız şeydir.

Relay nə görə bilər və nə vaxt ondan istifadə etməməli

Relay payload-ı sonlandırır, ona görə repozitoriya adlarını, commit məlumatlarını və hadisənin daşıdığı hər şeyi görür. Kanal URL-nə açıq son nöqtə kimi yanaşın. Saxta çatdırılmaların rədd edilməsi üçün Jenkins secret token-ı konfiqurasiya olunmuş saxlayın və Jenkins-in istifadə etdiyi token-ın əhatəsini lazım olan minimumla məhdudlaşdırın.

Payload məxfiliyi buna imkan vermirsə, özünüzün yerləşdirdiyi runner və ya autentifikasiyalı əks tunel cavabdır.

Relay artıq infrastrukturdur və tetiklediyi build ilə eyni nəzərdən keçirməyə layiqdir. Kanal sızsa onu rotasiya edin və canlı çatdırılmanı son dəfə nə vaxt yoxladığınız tarixi qeyd edin. Həmin tarixi runbook-da kanal URL-nin yanına yazın. Bir ildir heç kimin nəzərdən keçirmədiyi relay heç kimin sahib olmadığı açıq son nöqtədir.

Əlaqəli məqalələr