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 토글 가능)
2-2. 대상 그룹 호출
MR 생성 시 labels에서 @here, @fsd_display, @fsd_search 등 원하는 그룹을 선택하면 해당 그룹이 슬랙 메시지에서 호출됩니다. 
3. 자주 발생하는 문제와 해결법
slack 알림이 오지 않음
→ SLACK_URL 변수가 누락된 경우입니다. Settings > CI/CD > Variables에서 SLACK_URL을 등록하세요.프로필 사진 대신 글자만 나옴
→ GitLab 사용자 이름을 규칙에 맞게 변경하거나, Slack에 해당 이모지를 추가하세요.프리징 기간에 긴급 배포 필요
→ 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 라이센스를 따릅니다.


