Жеткізу беті уақыт шегінен шығуды көрсетеді, ал Jenkins ештеңе жазбайды, бұл ешқашан келмеген қосылымның белгісі. GitHub webhook-ты өз инфрақұрылымынан сіз конфигурациялаған payload URL-ге қарай шығыс HTTP POST ретінде жібереді. VPN Jenkins-ті дәл осындай қосылымды қабылдамау арқылы қорғайды. Екі жақта да ештеңе сынбаған. Мәселе сұраныстың бағытында.

Жеткізу шын мәнінде нені әрекет етеді

GitHub payload URL-дегі хост атауын шешіп, оған ашық интернеттен қосылады. Егер бұл URL жеке мекенжайға немесе тек сіздің желіңіздің ішінде шешілетін атауға нұсқаса, әрекет кез келген сұраныс жіберілмес бұрын сәтсіз аяқталады. Егер ол сіздің шетіңіз тастайтын ашық атауға нұсқаса, әрекет оның орнына уақыт шегінен шығады.

Бұл айырмашылық диагностика үшін маңызды. DNS ақауы мен сүзілген порт екеуі де Jenkins жағында ештеңе болмағандай көрінеді, және екеуі де GitHub-та басқа себеп қоса берілген сәтсіз жеткізу ретінде көрінеді. URL-ді өзгертуден бұрын сол себепті оқыңыз.

Сыртқа қарай қоңырау шалатын туннель тыңдаушы жасамайды. Адамдар дәл осы бөлікті басқаша жұмыс істейді деп күтеді.

Қосылым бағытын түзетудің үш жолы

Әр шешім қосылымды кім бастайтынын өзгертеді, және тек үш пішін бар.

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

Сұрау жүргізу ең сәнсіз және басқаруға ең оңай. Relay порт ашпай-ақ дерлік лезде кері байланысты ұстайды. Payload құпиялылығы үшінші тарапты жоққа шығарғанда runner әдетте дұрыс жауап, өйткені жұмыс желінің ішінде тұрған машинада жүре алады.

Нені басқара алатыныңызға қарай таңдаңыз, заманауи естілетініне қарай емес.

Жеткізуді smee-мен сыртқа шығарыңыз

Relay қызметінде арна жасаңыз және оның URL-ін сақтаңыз. Желінің ішінде клиентті орнатып, жеткізулерді Jenkins күтетін жолға жіберіңіз. Репозиторий параметрлеріндегі payload URL арнаның URL-іне айналады, мазмұн түрі application/json болып орнатылады.

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

Үш деталь оның жұмыс істейтінін шешеді. Жол GitHub оқиғалары үшін Jenkins күтетінге сәйкес болуы керек, ол әдепкіде /github-webhook/. Jenkins клиентке берген портта тыңдауы керек. Және жұмыста конфигурацияланған Jenkins URL сол жолмен келісуі керек, әйтпесе оқиға келіп, содан кейін лақтырылады.

Соңындағы қиғаш сызықтың сәйкессіздігі 404 тудырады, ол жеткізу ақауы ретінде оқылады және олай емес.

Оны аптаға шыдайтындай іске қосу

Алдыңғы пландағы клиент терминалмен бірге өледі, ал webhook-тар бір күн жұмыс істеп, содан кейін тоқтайды. Оған Restart=always бар unit беріңіз, оны Jenkins пайдаланушысы ретінде іске қосыңыз және бірінші нақты жеткізуден кейін journal-ды оқыңыз. Дәл осы соңғы қадам жұмыс істейтін relay-ды конфигурацияланғаннан ажыратады.

[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

Қайталау түймесінің орнына нақты push-пен сынаңыз. Қайталау relay-дың сақталған payload-ын іске қосады, GitHub-тан арнаңызға дейінгі жолды емес, сондықтан тікелей жеткізу әлі сәтсіз болса да, ол өтуі мүмкін.

Unit тоқтағанда ескерту жасаңыз. Өшіп тұрған relay құрылымы бойынша үнсіз, және үнсіздік — сіз қазірдің өзінде жөндеп жатқан нәрсе.

Relay нені көре алады және оны қашан қолданбау керек

Relay payload-ты аяқтайды, сондықтан ол репозиторий атауларын, commit деректерін және оқиға алып жүргеннің бәрін көреді. Арнаның URL-ін ашық соңғы нүкте ретінде қарастырыңыз. Жалған жеткізулер қабылданбауы үшін Jenkins-тің құпия token-ын конфигурацияланған күйде ұстаңыз және Jenkins қолданатын token-ды қажетті минимуммен шектеңіз.

Егер payload құпиялылығы мұны жоққа шығарса, өз бетінше орналастырылған runner немесе аутентификацияланған кері туннель — жауап.

Relay енді инфрақұрылым және ол іске қосатын build сияқты қарауды қажет етеді. Арна ағып кетсе, оны айналдырыңыз және тірі жеткізуді соңғы рет қашан тексергеніңіздің күнін жазып қойыңыз. Сол күнді runbook-та арнаның URL-інің қасына қойыңыз. Бір жыл бойы ешкім қарамаған relay — ешкімге тиесілі емес ашық соңғы нүкте.

Қатысты мақалалар