트러블 슈팅 - bos-fe 배포 자동화 및 알리미 개발
0. 문제 정의
젠킨스 CI/CD 설정 개선 내용은 젠킨스 ci-cd 개선 참고.
-
현재 배포 프로세스
- Jenkins에 접속해 수동으로 빌드를 실행해야 하며, 빌드 완료 후 ArgoCD에서 직접 Sync 버튼을 눌러야 함.
- 빌드 상태를 확인하기 위해 지속적으로 VDI에 접속해야 함.
- 이 과정에서 PC 사양 문제로 IDE가 강제 종료되는 등 개발 환경이 불안정해짐.
- 인텔리제이 웹서버 2개 + vdi 1개 시 자주 튕김
- 로컬 서버 끄고 vdi 접속해야함
-
문제점
- 빌드 완료 여부를 계속 확인해야 하므로 다른 업무에 집중하기 어려움.
- 배포 작업 과정이 번거롭고 비효율적임.
-
개선 방향
develop브랜치에 머지되면 자동으로 배포가 이루어지도록 프로세스를 개선.- 단, 권한 제한으로 인해 Webhook 사용은 불가능.
- 다만 기존 Jenkins에 스케줄링 스크립트가 존재하고, 여기에 SCM Polling을 추가하는 방식은 활용 가능.
1. SCM Polling 문제
-
현상
* * * * *(매 1분) Polling은 정상적으로 동작.- 그러나 변경 내역을 감지하지 못하고
No changes메시지 출력.- 이것저것 다 바꿔봤는데도 계속 No changes 나옴
-
원인
- Polling이 브랜치/리비전 동기화를 제대로 인식하지 못함.
- 뭔가 꼬인듯
- Polling이 브랜치/리비전 동기화를 제대로 인식하지 못함.
-
조치
- 수동 빌드 후 정상 동작 확인 → 워크스페이스 초기화 및 레퍼런스 동기화 문제였음.
- 추후 Refspec 커스텀 불가(Jenkins 2.2426.3 환경) 확인.
- 일반적으로 젠킨스 커스터마이징 하는 방법은 사용하기 어려움
2. 배포 완료 알림 필요
-
내가 생각한 아이디어들
- Jenkins
Manage Credentials- 권한 없어서 불가
- GitLab 메일 알림
- 권한 없어서 불가
- Datadog Log Monitor
- 권한 없어서 불가
- GitLab Push 이벤트로는 Jira/메일 알림이 오지 않음.
- MR 생성 & 티켓 언급시에만 Jira 알림 발송됨.
- MR을 자동으로 생성하는건 너무 복잡함.
- MR 생성 & 티켓 언급시에만 Jira 알림 발송됨.
- Jenkins
-
대안 시도
- Jira API Token 발급 불가 → 직접 알림 연동 불가.
- 권한 이슈
- GitLab RSS/Atom Feed 확인
- 슬랙 플러그인 문법이 서로 안맞음
- Jira API Token 발급 불가 → 직접 알림 연동 불가.
-
해결책
- Slack Incoming Webhook 사용.
- Jenkinsfile 내에서 배포 완료 후
curl -X POST로 Slack 메시지 발송하도록 수정.
3. Slack Webhook 연동
-
초기 구현
if (ZONE_NAME == "develop") { sh """ curl -sS -X POST -H 'Content-type: application/json' \ --data '{"text":"✅ Deploy 완료 (develop): ${appSystem}.${appRole} | tag=${buildTag}"}' \ https://hooks.slack.com/services/XXXX/XXXX/XXXX """ } -
보완점
- Webhook URL 하드코딩은 보안 리스크 → 환경변수(
SLACK_URL) 또는 Build Parameter로 대체 권장. || true추가하여 Slack 네트워크 오류로 Jenkins 빌드 실패 방지.
- Webhook URL 하드코딩은 보안 리스크 → 환경변수(
4. Jenkinsfile 개선 사항
-
변경
yq결과.trim()처리 (개행 제거).- 실패 시
currentBuild.result = 'FAILURE'권장 (원본은ABORTED). build/폴더 존재 여부 체크 추가.
-
Slack 성공/실패 알림
revision스테이지 성공 시: ✅ 메시지.catch(e)블록 실패 시: ❌ 메시지.
5. Git 브랜치/커밋 정보 추가
-
목표
Slack 알림 메시지에 머지된 브랜치명과 커밋 링크 포함. -
구현
def branchName = sh(returnStdout: true, script: "git rev-parse --abbrev-ref HEAD").trim() def commitId = sh(returnStdout: true, script: "git rev-parse HEAD").trim() def gitlabUrl = "https://gitlab.com/mygroup/myrepo" // 실제 Repo URL sh """ curl -sS -X POST -H 'Content-type: application/json' \ --data '{ "text": "✅ Deploy 완료 (dev): ${appSystem}.${appRole}\\n브랜치: <${gitlabUrl}/-/tree/${branchName}|${branchName}>\\n커밋: <${gitlabUrl}/-/commit/${commitId}|${commitId.take(8)}>" }' \ ${SLACK_URL} || true """ -
결과
Slack 메시지에 GitLab 브랜치/커밋 링크 삽입 → 배포 추적성 강화.
최종 결론
- Jenkins Polling 문제는 워크스페이스 초기화 후 정상화됨.
- 배포 알림은 GitLab/Jira 제약으로 불가 → Slack Webhook으로 해결.
- Jenkinsfile 개선으로 안정성/보안/가시성 확보:
.trim()처리- Slack URL 환경변수화
- 성공/실패 알림 분리
- 브랜치/커밋 링크 포함
- 추후 다른 repo에도 스크립트 동일하게 사용 가능함
남은 문제
- jenkins 에서 curl을 통해 slack으로 알림 보내는 중인데 이부분도 허가 필요한지 확인 필요
- 현재 slack app 사용중인데 추가적으로 허가 받아야 하는지 확인 필요
- scm polling을 1분마다 확인하도록 해두었는데 서버에 부담이 되는지 확인 필요
- 추후 리소스 최적화를 위한 다양한 옵션이 있긴 함(Lightweight checkout, Shallow clone)
댓글
첫 번째 댓글을 남겨보세요.