포스트

GitLab CI × Slack Webhook | 가이드- MR 알림·Draft 토글·충돌 감지

GitLab CI × Slack Webhook | 가이드- MR 알림·Draft 토글·충돌 감지

📌 이 글은 GitLab CI × Slack Webhook 중 4편입니다.
1편: Freeze-Free MR Pipeline 설계
2편: Freeze-Window 차단·MR 알림·외부 Include 자동화
3편: 사용자별 프로필 이모지 맞춤 적용


1. 주요 기능 요약

Slack Incoming Webhook (mr_machine job)

  • MR 생성 시 자동으로 슬랙 메시지 전송
  • 대상 그룹 호출(@here, @fsd_display, @fsd_search)
  • Draft: 제목으로 알림 비활성화
  • MR 충돌 감지 및 알림

2. 사용법

2-1. MR 알림 on/off 설정

MR 생성 시 기본적으로 슬랙 알림이 전송됩니다. 알림을 비활성화하려면 MR 제목을 Draft:로 시작하세요. 다시 활성화하려면 Mark as ready를 클릭하거나, 커밋 추가/파이프라인 실행을 하면 됩니다. (우측 상단 점 3개 [ ⋮ ] 메뉴에서 Draft/Ready 토글 가능)

MR 알림 on/off MR 알림 Draft 예시 MR 알림 Ready 예시

2-2. 대상 그룹 호출

MR 생성 시 labels에서 @here, @fsd_display, @fsd_search 등 원하는 그룹을 선택하면 해당 그룹이 슬랙 메시지에서 호출됩니다. 대상 그룹 호출 예시2


3. 자주 발생하는 문제와 해결법

  1. slack 알림이 오지 않음
    → SLACK_URL 변수가 누락된 경우입니다. Settings > CI/CD > Variables에서 SLACK_URL을 등록하세요.

  2. 프로필 사진 대신 글자만 나옴
    → GitLab 사용자 이름을 규칙에 맞게 변경하거나, Slack에 해당 이모지를 추가하세요.

  3. 프리징 기간에 긴급 배포 필요
    → Settings > CI/CD > Variables에서 프리징 기간 변수(F_S_DATE, F_E_DATE)를 임시로 변경 후, 배포가 끝나면 원래 값으로 복구하세요.


4. 주요 코드 및 해설

.gitlab-ci.yml

1
2
3
4
5
6
variables:
  TB: ${CI_MERGE_REQUEST_TARGET_BRANCH_NAME}
  SB: ${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME}
  MR_URL: ${CI_MERGE_REQUEST_PROJECT_URL}/-/merge_requests/${CI_MERGE_REQUEST_IID}
  CHN: channel # Slack 채널명 (# prefix 제외)
  PROFILE: "${GITLAB_USER_NAME%%(*}" # (홍길동(foobar) → 홍길동)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
stages: [build]

──────────────────────────
Slack 알림 Job
──────────────────────────
mr_machine:
stage: build
script: |
  # 1. Webhook 전송 함수 ────────────────────
    send_slack_message() {
      username="$1"
      text="$2"
      icon_emoji="$3"
      curl -X POST -H "Content-type: application/json" --data "{\"channel\": \"#${CHN}\", \"username\": \"${username}\", \"text\":\"${text}\", \"icon_emoji\": \":${icon_emoji}:\" }" $SLACK_URL
    }


  # 2. MR 공통 메시지 래퍼 ───────────────────
    mr_message() {
      text="$1"
      txt="${ALARM}\n :gitlab: ${text} MR 리뷰 & 승인 부탁드립니다! \n:branch: ${SB} → ${TB} ( <${MR_URL}|MR 링크 - ${CI_PROJECT_NAME}> )"
      send_slack_message "${GITLAB_USER_NAME}" "$txt" "${PROFILE}"
    }

  # 3. 알림 대상 그룹 매핑 ───────────────────
    case "$CI_MERGE_REQUEST_LABELS" in
      *here*) ALARM="<!here>" ;;
      *display*) ALARM="<!subteam^id>" ;;
      *search*) ALARM="<!subteam^id>" ;;
    esac

  # 4. Draft 제목이면 조용히 종료 ─────────────
  [[ "$CI_MERGE_REQUEST_TITLE" == Draft:* ]] && exit 0

  # 5. 충돌 사전 점검(필요 시) ────────────────
  if [ "$TB" != "master" ] || [[ "${SB:0:7}" != "feature" ]]; then
    git config --global --replace-all user.email  "$GITLAB_USER_EMAIL"
    git config --global --replace-all user.name   "$GITLAB_USER_NAME"
    git fetch origin "$SB" && git fetch origin "$TB"
    git checkout "origin/$SB"
    git merge    "origin/$TB"
  fi

  # 6. 브랜치 유형별 알림 분기 ────────────────
  if   [ "$TB" = "develop" ];                  then mr_message "dev"
  elif [[ "${TB:0:7}" = "release" ]];          then mr_message "release"
  elif [ "$TB" = "master" ] && [[ "${SB:0:6}" = "hotfix" ]]; then
      mr_message "hotfix"
  elif [ "$TB" = "master" ] && [[ "${SB:0:7}" != "release" ]]; then
      send_slack_message "마스터수호자" \
        "<!here>\n :crossed_swords: master merge 발견 :crossed_swords: \
  \n:${PROFILE}: ${GITLAB_USER_NAME}
  \n:gitlab: ${SB} → ${TB} ( <${MR_URL}|MR 링크 - ${CI_PROJECT_NAME}> )"
  "judge"
  echo "Master MR FAIL" > .job_status
  exit 93
  fi


  after_script:
  # 실패 시 충돌 알림
  - |
    if [ !$(cat .job_status) ] && [ ${CI_JOB_STATUS} == "failed" ] ; then
      curl -X POST -H "Content-type: application/json" --data "{\"channel\": \"#channel\", \"username\": \"${GITLAB_USER_NAME}\", \"text\":\" :branch: 충돌 발생 :broken_branch:\n:폭발: ${SB} → ${TB} ( <${MR_URL}|MR 링크 - ${CI_PROJECT_NAME}> ) \", \"icon_emoji\": \":${GITLAB_USER_NAME%%(*}:\" }" $SLACK_URL
    fi

  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'

🗓️ 업데이트 내역

  • 2024-07-31:
    • 그룹 호출 기능 추가
    • 개발 기간: 24.07.31
  • 2023-10-12:
    • MR 충돌 감지 기능 추가
    • 개발 기간: 23.10.10 - 23.10.12
  • 2023-08-22:
    • Draft: 키워드로 알림 제어 기능 추가
    • 개발 기간: 23.08.17 - 23.08.22

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.