VPN으로 Jenkins를 열 수 있는데도 서로 다른 소유자의 서로 다른 두 연결이기 때문에 GitHub가 웹훅 실패를 보고하는 것을 볼 수 있습니다. 브라우저는 노트북이 협상한 터널을 타지만, GitHub의 전달 서비스는 공용 인터넷에서 시작하며 사설 네트워크로 들어가는 경로가 없습니다. Jenkins 자체가 같은 저장소에서 문제없이 가져올 수 있더라도 저장소 접근 권한은 이 사실을 바꾸지 않습니다. 인그레스, 릴레이, 폴링 중 하나를 고른 뒤 이벤트가 실제로 지나는 경로를 시험하세요.

브라우저 세션은 한 방향만 증명합니다

VPN 연결은 이 노트북이 내부 호스트에 닿을 수 있는가라는 한 가지 질문에 답합니다. 웹훅 전달은 외부 서비스가 그 호스트로 연결을 열 수 있는가라는 다른 것을 묻습니다. Jenkins가 저장소를 가져오는 것은 아웃바운드 트래픽이며 인바운드 도달 가능성에 대해 아무것도 말하지 않습니다. 다이어그램에서 두 방향을 별도 줄에 두고, 어느 쪽이 각각을 시작하는지도 적으세요.

무엇이든 바꾸기 전에 전달 기록을 읽으세요. 타임아웃, 연결 재설정, 어떤 작업과도 맞지 않은 수락된 요청은 네트워크, 프록시, 트리거 구성이라는 서로 다른 세 주인을 가집니다.

옵션 A: 좁은 엔드포인트를 노출하세요

조직이 이미 승인된 인그레스를 게시하고 있다면 대시보드 대신 웹훅 경로를 노출하세요. 보통은 훅 URL에 대한 POST를 받아 Jenkins로 전달하는 리버스 프록시 규칙을 두고, 관리 인터페이스는 외부에서 닿지 않게 유지하는 것을 뜻합니다.

curl -sS -o /dev/null -w "%{http_code}\n" -X POST https://jenkins.example.com/github-webhook/

터널 안에서의 성공은 아무것도 증명하지 않으므로 그 시험은 VPN 접근이 없는 네트워크에서 실행하세요. 엔드포인트는 GitHub가 서명 헤더로 보내는 공유 비밀이 없는 요청을 거부해야 하고, 게시한 단 하나의 경로와 메서드만 받아들여야 합니다. 공개된 Jenkins 콘솔은 웹훅 해결책이 아니라 다음 스캐너를 기다리는 사고입니다. 애플리케이션의 나머지가 이전 접근 제어를 유지하도록 규칙을 충분히 좁히세요.

옵션 B: 릴레이로 방향을 뒤집으세요

인바운드 노출이 승인되지 않는 곳에서는 네트워크 안의 작은 클라이언트가 릴레이로 향하는 아웃바운드 연결을 유지하고 전달된 이벤트를 받을 수 있습니다. 그러면 릴레이가 전달 경로의 일부가 되므로, 가용성과 인증은 빌드 작업만큼 중요합니다.

ssh -N -R 9000:localhost:8080 relay.example.net

방화벽 뒤의 웹훅에 대한 Jenkins 지침 은 이 형태를 설명하며, 자체 포워더를 작성하기 전에 읽을 가치가 있습니다. 끊긴 터널은 결코 보내지 않은 이벤트와 똑같이 보이므로, 릴레이에서 TLS를 종료하고, 이벤트가 작업에 닿기 전에 서명을 검증하고, 아웃바운드 링크를 감시하세요. 도중에 파싱되어 다시 인코딩된 JSON에서는 서명 검사가 실패하므로, 릴레이가 요청 본문을 바이트 단위로 보존하는지도 확인하세요.

옵션 C: 대신 저장소를 폴링하세요

폴링은 지연을 단순함과 맞바꾸며 인바운드 경로가 전혀 필요 없습니다. Jenkins는 일정에 따라 폴링할 수 있고, 작은 작업이 API를 조회해 낯선 리비전을 보면 빌드를 시작할 수도 있습니다.

curl -sS -u "$USER:$TOKEN" "https://api.github.com/repos/OWNER/REPO/commits?per_page=1"

각 폴링은 API 호출을 소비하고 push와 빌드 사이에, 바쁜 저장소와 공유 속도 한도에서 눈에 띄는 지연을 더합니다. 또한 폴러가 실행되는 곳에 자격 증명을 저장해야 하므로 토큰을 저장소 읽기 전용 접근으로 제한하고 다른 비밀과 똑같이 교체하세요. 이벤트 양이 적거나 인그레스가 결코 승인되지 않을 때 이것을 고르고, 나중에 아무도 빌드가 왜 늦는지 궁금해하지 않도록 작업 설명에 그렇게 적으세요.

페이지 로드가 아니라 실제 전달을 받아들이세요

어떤 옵션을 골랐든, 승인 시험은 소스 플랫폼이 보낸 이벤트이지 권한 있는 노트북에서 연 브라우저 탭이 아닙니다. 스크래치 브랜치에 빈 커밋을 push하고 전달 응답 코드, 릴레이 로그, 폴링 작업의 출력을 그 순서대로 읽으세요. 엔드포인트에서 200이 왔는데 빌드가 없으면 트리거 필터가 틀린 것이고, 타임아웃이면 경로가 아직 닫힌 것입니다. 그렇지 않으면 다음에 디버깅하는 사람이 브라우저 시험을 반복해 같은 막다른 길에 이르므로, 세 설계 중 무엇을 쓰는지 기록하세요.

모든 사람이 이미 VPN 세션을 가지고 있더라도 각각은 사설 애플리케이션으로 들어가는 자기 경로가 필요하므로, 결제 콜백과 다른 외부 알림에도 같은 논리를 적용하세요. 전달 경로는 애플리케이션 설계에 속하며 네트워킹 각주에 속하지 않습니다.

관련 글