728x90

 

최근 5일동안 Gitea와 Jenkins Webhook 연결 문제로 삽질을 엄청 많이 했습니다..... =(
혹여나 필자와 같은 상황에 있는 분들을 위해 정리를 해보고자 합니다.

 

만약 Gitea Jenkins Webhook 관련 연결 실패 때문이신 분들은 아래 기초적인 설정과정을 스킵하시고 맨 밑의 Trouble Shooting 부분으로 넘어가셔도 무방합니다 =)

 

우선 필자의 상황은 이렇습니다. 사설망에 구축된 GiteaAWS EC2 서버에 구축된 Jenkins를 연결하는 것이였습니다.

이 Webhook 연결을 통해 Gitea에 만든 Repo의 main branch에 Push 또는 merge가 되었을 때 webhook 을 통해 Jenkins 서버에 알리고 Jenkins Pipeline이 trigger 되는 구조입니다.

 

ex)
Gitea 에 생성된 repo의 main branch에 Push 또는 merge 발생 - 
Gitea의 webhook 설정에 설정된 Jenkins URL로 Post 요청
 - Jenkins 서버에 구축된 프로젝트 trigger - Jenkinsfile 또는 Jenkins 프로젝트 설정 내에 작성된 pipeline 스크립트 실행(구성해놓은 실질적인 작업들) - Pipleline에 작성되어진 Stage들을 모두 성공시 빌드된 file을 운영서버로 넘김

 

Gitea와 Jenkins의 Webhook 관련 공식문서나 Stackoverflow 의 답변들을 보면 Jenkins에 Gitea plugin을 설치하고

Jenkins에 Gitea관련 설정을 진행해줍니다.

아래 과정은 우선 Gitea에 Project Repository가 있다는 가정하에 진행을 해보도록 하겠습니다. 만약 Gitea에 Project repo 가 없다면 만들어줍시다! =)

필자의 경우 이미 plugin을 설치하였기 때문에 설치가 되어 있지 않다면 설치 가능에 들어가 Gitea Plugin을 설치해주도록 합니다.

이후 Jenkins 관리 - 시스템 설정에 들어가 Gitea를 연결해줄 것입니다.

Name = (내가 사용할 이름 아무거나)

Server URL = (Gitea URL 입력) 입력을 하였을 때 아래와 같이 Gitea version이 떠야 정상적으로 등록이 된 겁니다 =)

Credentials 의 경우 여기서 직접 생성을 하여도 되고 Jenkins 관리 - Credentials에 서 만들어도 무방합니다. 이 Credentails는 구축되어진 Gitea에 접근하기 위한 것이라고 생각하면 됩니다 ㅎㅎ.

 


 

이 Credential를 등록하는 대표적인 방법 2가지를 설명 해보도록 하겠습니다.

 

Jenkins 관리 - Credentials 에 들어가 Add credentials를 눌러줍시다.

 

그럼 위와 같은 창이 나올 겁니다.

 

먼저 첫번 째 방법은 kind를 username & password 로 하여 등록하는 방법입니다.

Username = Gitea 로그인시 아이디

Password = Gitea 로그인시 비밀번호

ID = 등록할 이 Credential 를 지칭할 이름 (필자의 경우 이미 Gitea라는 ID로 Credential 을 등록하였기에 이미 사용중인 ID라고 뜬다)

Description = 등록할 이 Credential 에 대한 설명

 

위와 같이 등록을 모두 하였다면 하단의  Create를 눌러 Credential을 생성해줍시다 !

 

또다른 방법은 Gitea에서 생성한 AccessToken을 넣어 Credential을 등록하는 방법입니다.

 

Kind 를 Gitea Personal Access Token으로 설정해주면 다음과 같은 설정 창이 보일 겁니다.

당연히 Gitea에서 생성한 Personal Access Token이 필요하기에 만들어보도록 합시다.

Gitea로 넘어와 로그인을 한 후 설정 - 어플리케이션 -엑세스 토큰 관리 에서 사용할 토큰이름을 지정해주고 토큰생성을 눌러주세요. 필자의 경우 이미 gitea라는 이름의 토큰을 생성하여 위와 같이 토큰이 있는 것을 확인할 수 있습니다.

 

 

예시를 위해 test 라는 새로운 토큰을 생성하였고, 위에서 token 넘버를 확인할 수 있습니닷.

이 토큰은 다시 확인 할 수 없으니 어딘가에 꼭 메모 해주세요 !

 

다시 Jenkins로 넘어와 Token에 Gitea에서 얻은 Token 값을 복사하여 넣어줍시다.

ID = 등록할 이 Credential 를 지칭할 이름

Description = 등록할 이 Credential 에 대한 설명

모두 입력을 하였다면 create를 해줍시다.

그럼 이와 같이 Credential이 만들어진 것을 확인 할 수 있습니다 =)

 

이렇게 생성한 Credential은 Gitea 서버 등록을 할 때 사용해주면 됩니다.

 


이제 Jenkins 서버에 프로젝트 구성을 해보도록 하겠습니다.

Multibranch Pipeline 프로젝트를 예시로 사용할거기 때문에

프로젝트를 생성하기전 Multibranch Scan Webhook Trigger 플러그인을 설치하도록 합시다!

 

Jenkins 서버에서 새로운 아이템 또는 New item 을 클릭하여 프로젝트를 생성합시다.

다음과 같은 창이 있을 텐데 필자는 예시로 Multibranch Pipeline을 만들어보도록 하겠습니다.

이제 프로젝트에 대한 설정을 해볼 것인데 이번 글은 Gitea와 Jenkins의 Webhook에 관한 내용을 중점으로 다룰 것 이기에 다른 설정들은 건드리지 않도록 하겠습니다.

 

우선 Branch Sources 에서 Gitea 를 선택해줍시다.

그럼 다음과 같은 창이 생길 겁니다.

 

Server = 처음 Gitea plugin을 설치하고 Jenkins 시스템 설정에서  Gitea server를 등록해주었기에 바로 설정이 잡혀 있을 겁니다. 만약 Gitea이외에 Gihub, Gitlab등 Jenkins 시스템 설정에 다른 설정도 등록 되어있다면 처음에 등록해준 Gitea를 선택해주세요.

 

Credentials = 만약 Gitea에 생성한 Repo 가 Public 이라면 넣지 않아도 됩니다. 만약 Private으로 repo 를 만들었다면 Credential를 넣어야지 아래 Repository 선택창에서 해당 Repo를 선택할 수 있을 겁니다.

 

Owner =연결하고자 하는 Repo의 주인 Username 을 넣어주면 됩니다.

 

위와 같이 모두 입력을 하였다면 Repository에서 자신이 생성한 Repository를 확인할 수 있을 겁니다. 필자는 test라는 private Repo 를 Gitea에 생성해두었고 해당 Repo 와 연결을 하기 위해 test를 선택해주었습니다. =)

 

Discover brach = 탐색할 branch를 선택

Filter by name(with regular expression) = Discover 에서 선택한 branch 전략 중 정규표현식을 사용해 대상에 포함할

branch 를 재선별하는 과정

 

자세한 내용은 아래 블로그를 참고해주세요 =)

 

Jenkins Multibranch Pipeline 활용

서론 Jenkins Job 중 Multibranch Pipeline을 활용하면 여러 Branch를 통합하여 하나의 Job 처럼 관리할 수 있다. 특히 Git flow와 같은 Branch 전략을 활용하기에 적합한 Job이라 할 수 있다. Feature Branch와..

waspro.tistory.com

 

 다음은 Build 설정과 관련하여 default로 되어 있는 Jenkinsfile을 그대로 설정하였습니다.

 

 처음부터 잘 따라오셨다면 Multibranch Scan Webhook Trigger 플러그인이 설치되어 있으실겁니다.

그럼 위와 같이 Scan by webhook을 설정하실 수 있어요. =)

 

token 이름은 Gitea에서 webhook 설정을 할 때 header에 담을 token을 지정해주는 거기 때문에

자신이 원하는 이름으로 지정해주면 됩니다.

 

위와 같이 설정을 모두 끝냈다면 Save를 누르고 나와줍니다!

 


저장을 하고 나오면 다음과 같이 Scan을 진행하게 되는데 아직 Jenkinsfile을 만들지 않아 'Jenkinsfile not found'가 뜬 것을 확인 할 수 있습니다.

 

간단한 테스트를 위해 Jenkinsfile을 만들어보도록 하죠.

pipeline {
    agent any
      stages {
          stage('stage 1'){
              steps {
                  echo "Hello world"
              }
          }
      }
}

test용 jenkinsFile을 생성한 뒤 push를 해주도록 합시다.

이제 다시 Jenkins Sever로 가서 Scan을 다시 돌려보면 Jenkisfile이 확인이 되었네요!

 

이제 Gitea로 가서 Webhook 설정을 해보도록 하겠습니다.

설정 - 웹훅 - Webhook 추가

Webhook 설정은 다음과 같이 진행해줍니다.

http://젠킨스주소/multibranch-webhook-trigger/invoke?token=test

(여기서 token값의 test는 아까 jenkins 프로젝트 설정의 Scan by webhook에서 입력한 token 값 입니다. 이 값이 일치해야 웹훅 요청이 정상적으로 수행됩니다!)

 

필자는 우선 Push event가 발생하였을 때만 Webhook이 trigger 되도록 하였습니다. 만약 다른 상태에서도 이 trigger가 발동되게 하여면 사용자 정의 이벤트에서 커스텀을 진행해주세요. =)

Branch filter를 통해 특정 branch에서만 이 webhook이 trigger 될 수 있도록 설정도 가능합니다.

 

다음과 같이 설정을 모두 마친 후 Webhook 갱신 을 눌러주세요.

 

만약 Jenkins에서 freeStyle  프로젝트로 생성을 하셨다면 Gitea Webhook은 아래와 같이 설정을 해주세요 =)

더보기

http://젠킨스주소/gitea-webhook/post

(전달테스트 결과)


이제 Gitea와 Jenkins의 Webhook을 위한 설정이 끝났습니다. Webhook 갱신 버튼 밑을 보면 webhook 전달시험 버튼을 통해 test를 진행할 수 있습니다.

 

진행을 해보도록 하죠!

다음과 같이 정상적으로  Webhook이 작동하는 것을 확인하였습니다 =).

 

만약 여기에서 다음과 같이 연결 실패가 뜬다면 필자가 겪은 트러블 슈팅 내용을 아래에 정리하였으니 참고 바랍니다.

(아래 test 에서 webhook 연결 주소가 http://젠킨스주소/gitea-webhook/post 로 되어 있어서 실패가 되는 것은 아닙니다!)

 

그럼이제 마지막으로 Gitea의 repo의 main branch에 push를 하였을 때 정말 webhook이 잘 작동되어 Jenkins에 만들어둔 multibrach pipeline 프로젝트가 잘 작동되는지 확인해보도록 하겠습니다!

main에 push를 하니 Jenkins 서버에 만든 프로젝트의 trigger가 잘 작동되는 것을 확인 할 수 있습니다  =)


 

Gitea Jenkins Webhook Trouble Shooting

 

 

우선 필자의 경우 현재 사설망에 구축되어진 Gitea서버를 사용하고 있고 Jenkins 서버의 경우 AWS EC2를 사용하고 있습니다. 필자는 위와 같이 Webhook test에서 계속되는 실패를 하였고 이에 대한 원인을 찾기 위해 공식문서와 Stackoverflow를 참고해보았으나 대부분 위와 같은 과정을 설명하는게 다였고, 처음에는 Gitea plugin이 잘 작동하지 않는 문제로 생각하여 다른 webhook trigger를 사용해보기도 하였습니다.

결과는 마찬가지였고 계속해서 구글링을 하던 중 한 글을 발견하였습니다. 최근 사설망과 공중망에 대한 공부를 해보았었는데 현재 Gitea는 사설망에 구축되어있고 Jenkins는 AWS EC2를 사용하고 있어 Gitea가 구축되어진 서버에서 Webhook 과 관련된 설정을 해주어야지 Jenkins 서버와 통신을 할 수 있는 상태였던거죠...

(참고한 글)

 

New Blog Config

As promised, on this post I’m going to explain how I’ve configured this blog using hugo, asciidoctor and the papermod theme, how I publish it using nginx, how I’ve integrated the remark42 comment system and how I’ve automated its publication using

blogops.mixinet.net

우선 Gitea 서버의 설정에 있어 ALLOWED_HOST_LIST = 를 설정해주어야 통신이 가능합니다.

Gitea의 공식문서에 따르면 Webhook 은 허용된 Hosts에서만 가능하다고 나와있습니다.

(Gitea 공식문서)

 

Config Cheat Sheet - Docs

 

docs.gitea.io

필자의 경우 AWS EC2 서버에 있는 Jenkins와 Webhook을 하기위해선

ALLOWED_HOST_LIST = *

or

ALLOWED_HOST_LIST = external

로 설정을 해주어야 Gitea와 Jenkins의 Webhook이 정상 작동 되는 상태였습니다.

 

사실 응답에 대한 에러로그를 무심코 지나친 불찰이 크지만 아래와 같이 응답에 대한 에러로그에는

ALLOWED_HOST_LIST setting을 확인해보라는 로그가 있었는데....

이상한 곳에서 답을 찾으려 했던게 부끄럽네요.... =(

 

위와 같이 Gitea 서버에 설정을 해주었고 다음과 같이 Webhook이 정상작동하는 것을 확인할 수 있었습니다.


 

 

더보기

 

 

728x90
반응형
복사했습니다!