- 회사생활을 오래 하다 보니 어느덧 몇개 프로젝트의 배포 담당자가 되었다.
- 우리 회사에서 사용하는 프로젝트의 배포 구조는 대충 featuer-develop-staging-master의 4단계의 구조를 가지고 있다.
- 이 중에 featuer브랜치에서 develop로 온MR(=PR)을 리뷰 및 승인하고 젠킨스에서 배포하는게 내 역할이다.
- 다만 여기저기서 연락이 오다 보면 정작 MR을 승인하고 배포를 까먹는 경우가 빈번했고 귀찮기도 해서 머지리퀘스트를 승인하면 자동배포가 되도록 설정해보려고 한다.
할일 (예상)
- 우선 내 컴퓨터에서 테스트하기위해 할일을 리스트업 해봤다.(컴퓨터를 바꿔서 아무것도 설치가 안되어있다.)
- 자바설치(21)
- 젠킨스설치 (윈도우용)
- 깃랩 플러그인 설치
- 트리거 셋팅
- 깃랩
- 웹훅 셋팅
- 테스트
- featuer->develop MR
- develop->master MR
실제로 한일
- 예상했던것에 추가됐던 일은 ❗ 를 붙혀 표기함.
- 자바설치(21)
- 젠킨스설치 (윈도우용)
- ❗ 젠킨스 서버 포트포워딩(깃랩[외부서버]에서 로컬서버로 접근하기 위한 포트포워딩)
- 검색어 : U+ 포트포워딩 (U+ 인터넷을 사용하고 있음)
- ❗ 깃랩-젠킨스 소스코드 연동
- 깃 설치(젠킨스가 설치된 서버 = 윈도우)
- 깃이 설치되어있지 않으면 젠킨스와 깃 연동을 위한 깃 명령어를 사용할 수가 없다.
- SSH 키 발급, 깃랩 SSH 등록 및 젠킨스 credential 등록
- 깃 설치(젠킨스가 설치된 서버 = 윈도우)
- 깃랩 플러그인 설치
- jenkins관리 > plugins > available plugins > gitlab 검색 후 나오는 플러그인 install
- 트리거 셋팅
- Accepted Merge Request Events
- Filter branches by name : develop(include),master(exclude - 급조한 깃랩프로젝트라 main 브랜치임)
- 깃랩-젠킨스 소스코드가 연동되야 오류가 안난다.
- 깃랩-젠킨스 소스코드가 연동되야 오류가 안난다.
- 깃랩
- 웹훅 셋팅
- 웹 훅 트리거는 Merge request events
- Error 403 anonymous is missing the Job/Build permission 오류
- 2.젠킨스설치 중 깃-젠킨스 연동이 안된경우에는 anonymous로 웹훅을 주는데, 이걸 해결하려면 젠킨스에서 anonymous에 빌드 권한을 주면 되긴하나 이건좀 그럼
- 테스트
- 잘 된다 !
- 젠킨스 빌드 히스토리
- 깃랩 웹훅 히스토리
- 젠킨스 빌드 히스토리
결론
- 이로써 다음 초록색박스를 자동화했다. 내일 회사가서 요청해봐야겠다.(우리회사 깃,젠킨스관리는 다른부서에서 한다)
- 물론 젠킨스 빌드가 실패하는 경우에 대해서 고려해봐야 한다.
- 내부망이고 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?
반응형