공부/기타

웹훅이란 ? 깃랩🦊 머지(푸시)후 젠킨스 자동 배포 설정

JangGiraffe 2024. 3. 25. 00:14

  • 회사생활을 오래 하다 보니 어느덧 몇개 프로젝트의 배포 담당자가 되었다.
  • 우리 회사에서 사용하는 프로젝트의 배포 구조는 대충 featuer-develop-staging-master의 4단계의 구조를 가지고 있다.
  • 이 중에 featuer브랜치에서 develop로 온MR(=PR)을 리뷰 및 승인하고 젠킨스에서 배포하는게 내 역할이다.

 

  • 다만 여기저기서 연락이 오다 보면 정작 MR을 승인하고 배포를 까먹는 경우가 빈번했고 귀찮기도 해서 머지리퀘스트를 승인하면 자동배포가 되도록 설정해보려고 한다.

할일 (예상)

  • 우선 내 컴퓨터에서 테스트하기위해 할일을 리스트업 해봤다.(컴퓨터를 바꿔서 아무것도 설치가 안되어있다.)
  1. 자바설치(21)
  2. 젠킨스설치 (윈도우용)
  • 깃랩 플러그인 설치
  • 트리거 셋팅
  1. 깃랩
  • 웹훅 셋팅
  1. 테스트
  • featuer->develop MR
  • develop->master MR

실제로 한일

  • 예상했던것에 추가됐던 일은 ❗ 를 붙혀 표기함.
  1. 자바설치(21)
  2. 젠킨스설치 (윈도우용)
  • ❗ 젠킨스 서버 포트포워딩(깃랩[외부서버]에서 로컬서버로 접근하기 위한 포트포워딩)
    • 검색어 : U+ 포트포워딩 (U+ 인터넷을 사용하고 있음)
  • ❗ 깃랩-젠킨스 소스코드 연동
    • 깃 설치(젠킨스가 설치된 서버 = 윈도우)
      • 깃이 설치되어있지 않으면 젠킨스와 깃 연동을 위한 깃 명령어를 사용할 수가 없다.
    • SSH 키 발급, 깃랩 SSH 등록 및 젠킨스 credential 등록
  • 깃랩 플러그인 설치
    • jenkins관리 > plugins > available plugins > gitlab 검색 후 나오는 플러그인 install
  • 트리거 셋팅
    • Accepted Merge Request Events
    • Filter branches by name : develop(include),master(exclude - 급조한 깃랩프로젝트라 main 브랜치임)
      • 깃랩-젠킨스 소스코드가 연동되야 오류가 안난다.

 
 

  1. 깃랩
  • 웹훅 셋팅

    • 웹 훅 트리거는 Merge request events
    • Error 403 anonymous is missing the Job/Build permission 오류
      • 2.젠킨스설치 중 깃-젠킨스 연동이 안된경우에는 anonymous로 웹훅을 주는데, 이걸 해결하려면 젠킨스에서 anonymous에 빌드 권한을 주면 되긴하나 이건좀 그럼

 

  1. 테스트
  • 잘 된다 !
    • 젠킨스 빌드 히스토리
    • 깃랩 웹훅 히스토리

 

결론

  • 이로써 다음 초록색박스를 자동화했다. 내일 회사가서 요청해봐야겠다.(우리회사 깃,젠킨스관리는 다른부서에서 한다)

    • 물론 젠킨스 빌드가 실패하는 경우에 대해서 고려해봐야 한다.
      • 내부망이고 slack도 안쓰는 회사라서 SMTP서버를 통한 메일 발송정도가 무난할 것 같다.
  • 올해 목표는 테스트 자동화인데 관련해서 파이프라인을 만들면 재미있을 것 같다. (갈길은 멈)

 

TMI

웹훅(WEBHOOK)이란?

- 특정 행동이 발생했을 때 해당 이벤트를 전달하는 HTTP 기반 콜백함수다.
    - ex) 깃랩의 머지리퀘스트 이벤트가 발생하면 젠킨스로 이벤트를 전달한다.

- 활용처 : 알람(결제,메일,메시지(슬랙) 등) ,특정 이벤트 실행(젠킨스 빌드 등)
- API Polling : 클라이언트가 서버에 정기적으로 요청을 보내 최신 상태를 확인하는 프로세스
    - 웹훅과의 차이점 
        - API풀링은 서버에 주기적으로 이벤트 확인, 웹훅은 발생시 보내주는 차이가 있음.
        - 웹훅은 풀링에 비해 구현이 복잡함(이벤트 감지, 적절한 데이터준비, 엔드포인트로 데이터를 보내는 로직 구현 등)
        - 웹훅 실패처리 로직 구현 필요, 풀링은 단순 조회기 때문에 구현 불필요

웹훅 예제로 살펴보기

  • 아래는 스프링부트에서 웹훅 받는쪽을 구현한 예제이다. 보시다시피 일반 rest api와 차이가 없다.
@RestController // @Controller + @ResponseBody
public class WebhookController {

    @PostMapping("웹훅받는쪽URL")
    public ResponseEntity<?> receiveWebhook(@RequestBody String payload) {

        /*
        * 웹훅 RQ를 받았을 때 처리 구현부
        */

        return ResponseEntity.ok().body("Webhook received successfully"); // HTTP 200 OK + 잘받았다는 메시지로 응답
    }
}
  • 웹훅 보내는쪽 구현 - 웹훅을 콜백인터페이스로 구현해서 특정 메서드 실행 시 콜백 실행 할 수 있음
  • AOP에 @After 어노테이션으로도 구현할 수 있을듯(포인트컷 잘 해서)
1. 콜백 인터페이스 정의
@FunctionalInterface
public interface WebhookCallback {
    void execute(T 전달할요청이담긴 객체);
}

2. sendWebhook 메서드 만들기

    public void sendWebhook(String url, T 전달할요청이담긴 객체) {

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);

        HttpEntity<T> request = new HttpEntity<>(전달할요청이담긴 객체, headers);

        restTemplate.postForObject(url, request, String.class);

    }
3. 구현부

    public void mergeRequest(String 파라미터, WebhookCallback callback) {
        /*
          머지리퀘스트 구현부
        */
        callback.execute(전달할요청이담긴 객체);

        System.out.println("Merge request 처리 및 콜백 실행 완료");
    }

4. 머지리퀘스트에 콜백

  mergeRequest(파라미터, 전달할요청이담긴 객체 -> {
      sendWebhook(url,전달할요청이담긴 객체);
  });

 

깃랩의 웹훅

  • 깃랩 웹훅을 쏠 수 있는 이벤트는 다양하니 이를 활용해서 재미있는것들을 개발해 볼 수 있을듯 하다.
  • Push events
  • Tag push events
    • A new tag is pushed to the repository.
  • Comments
    • A comment is added to an issue or merge request.
  • Confidential comments
    • A comment is added to a confidential issue.
  • Issues events
    • An issue is created, updated, closed, or reopened.
  • Confidential issues events
    • A confidential issue is created, updated, closed, or reopened.
  • Merge request events
    • A merge request is created, updated, or merged.
  • Job events
    • A job's status changes.
  • Pipeline events
    • A pipeline's status changes.
  • Wiki page events
    • A wiki page is created or updated.
  • Deployment events
    • A deployment starts, finishes, fails, or is canceled.
  • Feature flag events
    • A feature flag is turned on or off.
  • Releases events
    • A release is created, updated, or deleted.
  • Emoji events
    • An emoji is awarded or revoked. Which emoji events trigger webhooks?
반응형