Неге GitHub webhook-тары VPN артындағы Jenkins алдында уақыт шегінен шығады
GitHub webhook-тарды ішке қарай жібереді, сондықтан Jenkins-ті қорғайтын VPN оларды қабылдамайды. Жеткізуді relay арқылы сыртқа шығарыңыз немесе webhook-ты сұрау жүргізетін agent-пен ауыстырыңыз.
Жеткізу беті уақыт шегінен шығуды көрсетеді, ал Jenkins ештеңе жазбайды, бұл ешқашан келмеген қосылымның белгісі. GitHub webhook-ты өз инфрақұрылымынан сіз конфигурациялаған payload URL-ге қарай шығыс HTTP POST ретінде жібереді. VPN Jenkins-ті дәл осындай қосылымды қабылдамау арқылы қорғайды. Екі жақта да ештеңе сынбаған. Мәселе сұраныстың бағытында.
Жеткізу шын мәнінде нені әрекет етеді
GitHub payload URL-дегі хост атауын шешіп, оған ашық интернеттен қосылады. Егер бұл URL жеке мекенжайға немесе тек сіздің желіңіздің ішінде шешілетін атауға нұсқаса, әрекет кез келген сұраныс жіберілмес бұрын сәтсіз аяқталады. Егер ол сіздің шетіңіз тастайтын ашық атауға нұсқаса, әрекет оның орнына уақыт шегінен шығады.
Бұл айырмашылық диагностика үшін маңызды. DNS ақауы мен сүзілген порт екеуі де Jenkins жағында ештеңе болмағандай көрінеді, және екеуі де GitHub-та басқа себеп қоса берілген сәтсіз жеткізу ретінде көрінеді. URL-ді өзгертуден бұрын сол себепті оқыңыз.
Сыртқа қарай қоңырау шалатын туннель тыңдаушы жасамайды. Адамдар дәл осы бөлікті басқаша жұмыс істейді деп күтеді.
Қосылым бағытын түзетудің үш жолы
Әр шешім қосылымды кім бастайтынын өзгертеді, және тек үш пішін бар.
| Approach | Who initiates | What you give up |
|---|---|---|
| Relay service | An outbound client inside the network | A third party sees every payload |
| Reverse tunnel or ingress | The public edge, into a controlled listener | An inbound surface you must secure |
| Runner or polling | The agent, outbound to GitHub | Instant 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 — ешкімге тиесілі емес ашық соңғы нүкте.