목표
의식적인 배포
Production 마이그레이션을 “일상적이지 않은 별개의 태스크”로 인식
Force 옵션
승인 없이도 force 진행 가능 (단, 사유 기록)
중복 방지
동일 마이그레이션 조합에 대해 이미 승인이 있으면 재요청 없이 통과
장애 대응
슬랙 장애 시 설정 주석 처리로 기존 동작 복원
설정
sonamu.config.ts
환경변수
slackConfirm 블록을 주석 처리하면 기존 동작(승인 없이 바로 실행)으로 동작합니다.Slack App 생성
1. App 생성
- Slack API → Create New App
- “From scratch” 선택
- App Name: “Sonamu Migration” (또는 원하는 이름)
- Workspace 선택
2. Bot Token Scopes 추가
OAuth & Permissions → Scopes → Bot Token Scopes에서 다음 권한 추가:| Scope | 용도 |
|---|---|
chat:write | 메시지 발송, 스레드에 사유 남기기 |
reactions:read | 이모지 조회 |
reactions:write | force 시 본인이 ✅ 찍기 |
3. 설치 및 설정
- Install to Workspace 클릭
- Bot User OAuth Token 복사 (
xoxb-...) - 원하는 채널에서
/invite @봇이름 - 채널 ID 확인 (채널 이름 우클릭 → “링크 복사” → URL에서
C...부분)
승인 플로우
승인 요청 메시지
사용 방법
일반 승인
- Sonamu UI에서 Production 대상 마이그레이션 Apply 클릭
- 슬랙 채널에 승인 요청 메시지 발송됨
- 매니저가 ✅ 이모지 클릭
- 자동으로 마이그레이션 실행
Force 진행
승인을 기다리지 않고 진행해야 할 경우:- 대기 중 “Force 진행” 버튼 클릭
- 사유 입력
- 마이그레이션 실행 (슬랙에 force 사유 기록)
거절 처리
매니저가 ❌ 이모지를 클릭하면 마이그레이션이 거절됩니다.로컬 파일 저장
승인 요청 정보는 로컬 파일로 저장되어 동일 마이그레이션 조합에 대해 재요청을 방지합니다.저장 위치
파일명 규칙
{hash}= 마이그레이션 이름 목록을 정렬 후 MD5 해시 (12자)- 예:
.slack-confirm-a1b2c3d4e5f6
파일 내용
C01234567:1705412345.000100
Slack API 참고
사용하는 API
| API | 용도 |
|---|---|
chat.postMessage | 승인 요청 메시지 발송 |
reactions.get | 이모지 조회 (Tier 3, 분당 50+회) |
reactions.add | force 시 ✅ 추가 |
chat.postMessage (thread_ts) | 스레드에 로그 남기기 |
Rate Limit
reactions.get은 Tier 3 API로 분당 50회 이상 호출 가능- 제한 초과 시 호출이 막히지 않고 응답이 지연됨
- Polling 간격 2초로 설정되어 있어 안전
테스트 시나리오
| 시나리오 | 동작 |
|---|---|
| 정상 플로우 | Apply → 슬랙 메시지 → 대기 → ✅ → 실행 |
| 기존 승인 있음 | Apply → 기존 ts로 조회 → ✅ 있음 → 바로 실행 |
| 거절 | Apply → 대기 → ❌ → 거절 메시지 |
| Force | Apply → 대기 → Force → 사유 입력 → 실행 |
| 설정 없음 | 기존 동작과 동일 (바로 실행) |
| 대상 아닌 DB | targets에 없는 DB는 승인 없이 바로 실행 |