PARA/02_Areas/A006_회사 업무/BOS-FE/bos-fe 배포 자동화/트러블 슈팅 - bos-fe 배포 자동화 및 알리미 개발.md

트러블 슈팅 - 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이 브랜치/리비전 동기화를 제대로 인식하지 못함.
      • 뭔가 꼬인듯
  • 조치

    • 수동 빌드 후 정상 동작 확인 → 워크스페이스 초기화 및 레퍼런스 동기화 문제였음.
    • 추후 Refspec 커스텀 불가(Jenkins 2.2426.3 환경) 확인.
      • 일반적으로 젠킨스 커스터마이징 하는 방법은 사용하기 어려움

2. 배포 완료 알림 필요

  • 내가 생각한 아이디어들

    • Jenkins Manage Credentials
      • 권한 없어서 불가
    • GitLab 메일 알림
      • 권한 없어서 불가
    • Datadog Log Monitor
      • 권한 없어서 불가
    • GitLab Push 이벤트로는 Jira/메일 알림이 오지 않음.
      • MR 생성 & 티켓 언급시에만 Jira 알림 발송됨.
        • MR을 자동으로 생성하는건 너무 복잡함.
  • 대안 시도

    • Jira API Token 발급 불가 → 직접 알림 연동 불가.
      • 권한 이슈
    • GitLab RSS/Atom Feed 확인
      • 슬랙 플러그인 문법이 서로 안맞음
  • 해결책

    • 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 빌드 실패 방지.

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)

댓글

첫 번째 댓글을 남겨보세요.