GitLab CI × Slack Webhook | 2. Freeze-Window 차단·MR 알림·외부 Include 자동화
📌 이 글은 GitLab CI × Slack Webhook 중 2편입니다.
1편: Freeze-Free MR Pipeline 설계
3편: 사용자별 프로필 이모지 맞춤 적용
4편: 가이드- MR 알림·Draft 토글·충돌 감지
도입 및 배경
여러 프로젝트에서 GitLab CI를 운영하다 보면, 배포 안정성을 위해 프리징 기간 동안 release 브랜치로의 머지를 막거나, master 브랜치로의 실수 머지를 방지해야 할 때가 많습니다. 또한 MR 생성 시 팀원들에게 슬랙 알림을 자동으로 보내고, 여러 프로젝트의 CI를 효율적으로 관리하기 위해 외부 참조 방식도 필요합니다.
적용 방법 및 프로세스
- GitLab 레포지토리 > Settings > CI/CD > Variables에서 변수를 선언합니다. (SLACK_URL, F_S_DATE, F_E_DATE)
- 날짜 형식은 브랜치 날짜 형식과 맞춥니다. (yymmdd)
- feature-**과 같은 피처 브랜치를 생성합니다.
- 생성한 브랜치의 .gitlab-ci.yml에 아래 예시 코드를 작성합니다.
- 커밋 후 release 브랜치에 머지합니다.
- release 브랜치가 상용 배포된 후 master 브랜치에 머지하면 완료됩니다.
참고: 이 프로세스는 MR 생성 시, 타겟 브랜치(release)가 아닌 소스 브랜치(feature)에 작성된 .
gitlab-ci.yml을 기준으로 파이프라인이 작동합니다.
프리징 기간 예시: 07/18(화) 운영 배포 이후 ~ 07/28(금)
배포예정: 08/01(화)
→ 230718, 230728 등으로 변수 세팅. 배포 브랜치가 release-230801-1이면, 프리징 기간 내의 다른 release 브랜치(ex. release-230720-1)는 Merge 방지 프로세스가 동작합니다.
MR 생성 알림 & master 브랜치 Merge 방지 기능
프리징 방지 프로세스를 도입한 후, 실수로 feature → master MR이 생성되는 사례가 있어 master merge 차단 기능을 추가했습니다. 또한 MR 승인 요청을 슬랙으로 자동 알림하는 기능도 함께 구현했습니다.
외부참조 설정 및 리팩토링
여러 프로젝트에서 하나의 공통 CI 소스를 외부참조 방식으로 관리하면, 유지보수와 관리가 훨씬 용이해집니다.
여러 job을 하나로 리팩토링하면서 동작 순서와 중복 로직을 최적화해 성능도 향상됩니다.
기능별 코드 예시
1. 외부 참조 설정 코드
1
2
3
4
include:
- project: "공통관리프로젝트명"
ref: master
file: ".gitlab-ci.yml"
2. 공통 변수 선언
1
2
3
variables:
TB: ${CI_MERGE_REQUEST_TARGET_BRANCH_NAME}
SB: ${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME}
3. MR 생성 알림
1
2
3
4
5
6
7
8
9
10
mr_machine:
stage: build
script: |
if [ ${TB} == "develop" ]; then
curl -X POST -H "Content-type: application/json" --data "{\"username\": \"${GITLAB_USER_NAME}\", \"text\":\"dev MR 승인 부탁드립니다! ${CI_MERGE_REQUEST_PROJECT_URL}/-/merge_requests/${CI_MERGE_REQUEST_IID}\", \"icon_emoji\": \":bust_in_silhouette:\"}" $SLACK_URL
elif [ ${TB:0:7} == "release" ]; then
curl -X POST -H "Content-type: application/json" --data "{\"username\": \"${GITLAB_USER_NAME}\", \"text\":\"release MR 승인 부탁드립니다! ${CI_MERGE_REQUEST_PROJECT_URL}/-/merge_requests/${CI_MERGE_REQUEST_IID}\", \"icon_emoji\": \":bust_in_silhouette:\"}" $SLACK_URL
fi
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
4. 프리징 기간 Merge 차단
1
2
3
4
5
6
7
8
9
freezing_alarm:
stage: build
script: |
if [ ${TB:0:7} == "release" ] && [ ${TB:8:6} \> $F_S_DATE ] && [ ${TB:8:6} \< $F_E_DATE ]; then
curl -X POST -H "Content-type: application/json" --data "{\"channel\": \"#channel\", \"username\": \"프리징방범대\", \"text\":\"<!here> 프리징 기간 위반! ${SB} -> ${TB}\", \"icon_emoji\": \":ice_cube:\"}" $SLACK_URL
exit -1
fi
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
5. master 브랜치 Merge 차단
1
2
3
4
5
6
7
8
9
master_merge_inspector:
stage: build
script: |
if [ ${TB} == "master" ] && [ ${SB:0:7} == "feature" ]; then
curl -X POST -H "Content-type: application/json" --data "{\"username\": \"마스터수호자\", \"text\":\"<!here> master merge 발견! ${SB} -> ${TB}\", \"icon_emoji\": \":judge:\"}" $SLACK_URL
exit -1
fi
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'

