GitHub Actions 워크플로우에서 배포 성공·실패를 Slack과 Telegram으로 자동 알림하는 파이프라인을 구성하면, 팀원 모두가 배포 상태를 실시간으로 파악할 수 있습니다. CI/CD 자동화의 마지막 퍼즐 조각이라고 할 수 있는 알림 시스템, 지금 바로 설정해봅시다.

왜 배포 알림이 필요한가?
코드를 GitHub에 푸시하고 배포가 완료됐는지 확인하기 위해 매번 Actions 탭을 열어보는 건 비효율적입니다. 특히 팀 규모가 커지거나 배포 빈도가 높아질수록, 실패한 배포를 빠르게 인지하지 못해 서비스 장애로 이어지는 경우가 생깁니다. Slack·Telegram 알림을 자동화하면 다음이 가능해집니다:
- 배포 성공/실패를 수초 내 팀에게 공유
- 실패 원인(에러 로그 링크)까지 알림에 포함
- 야간 자동 배포 중 이상 감지 즉시 대응
Slack 알림 연동하기
Slack 알림은 Incoming Webhook을 이용합니다. Slack 앱 관리 페이지에서 워크스페이스에 “Incoming Webhooks” 앱을 추가하고 Webhook URL을 발급받은 뒤, GitHub Secrets에 SLACK_WEBHOOK_URL로 등록해두세요.
# .github/workflows/deploy.yml
name: Deploy & Notify
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Deploy to Server
id: deploy
run: |
ssh ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} "cd /app && git pull && systemctl restart myapp"
- name: Notify Slack on Success
if: success()
run: |
curl -s -X POST "${{ secrets.SLACK_WEBHOOK_URL }}" -H "Content-Type: application/json" -d '{
"text": "✅ *배포 성공*",
"attachments": [{
"color": "#36a64f",
"fields": [
{"title": "브랜치", "value": "'"${{ github.ref_name }}"'", "short": true},
{"title": "커밋", "value": "'"${{ github.sha }}"'", "short": true},
{"title": "작성자", "value": "'"${{ github.actor }}"'", "short": true},
{"title": "링크", "value": "'"${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"'", "short": false}
]
}]
}'
- name: Notify Slack on Failure
if: failure()
run: |
curl -s -X POST "${{ secrets.SLACK_WEBHOOK_URL }}" -H "Content-Type: application/json" -d '{
"text": "❌ *배포 실패*",
"attachments": [{
"color": "#ff0000",
"fields": [
{"title": "브랜치", "value": "'"${{ github.ref_name }}"'", "short": true},
{"title": "작성자", "value": "'"${{ github.actor }}"'", "short": true},
{"title": "로그 확인", "value": "'"${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"'", "short": false}
]
}]
}'
위 워크플로우의 핵심은 if: success()와 if: failure() 조건입니다. 이 두 스텝을 모두 정의해두면 배포 성공·실패 어느 경우에도 알림이 전송됩니다. Slack Attachment의 color 필드로 초록(성공)과 빨강(실패)을 시각적으로 구분할 수 있어 메시지를 한눈에 파악하기 편합니다.
Telegram 알림 연동하기
Telegram 알림은 Bot API를 사용합니다. @BotFather에서 봇을 생성하고 토큰을 발급받은 뒤, 알림 받을 채팅방의 Chat ID를 확인하세요. 두 값을 각각 TELEGRAM_BOT_TOKEN과 TELEGRAM_CHAT_ID로 GitHub Secrets에 등록합니다.
# Telegram 알림 스텝 (deploy.yml에 추가)
- name: Notify Telegram on Success
if: success()
run: |
MESSAGE="✅ *배포 성공*%0A%0A브랜치: \`${{ github.ref_name }}\`%0A커밋: \`${{ github.sha }}\`%0A작성자: ${{ github.actor }}%0A%0A🔗 [Actions 로그](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})"
curl -s "https://api.telegram.org/bot${{ secrets.TELEGRAM_BOT_TOKEN }}/sendMessage" -d "chat_id=${{ secrets.TELEGRAM_CHAT_ID }}" -d "text=$MESSAGE" -d "parse_mode=Markdown"
- name: Notify Telegram on Failure
if: failure()
run: |
MESSAGE="❌ *배포 실패*%0A%0A브랜치: \`${{ github.ref_name }}\`%0A작성자: ${{ github.actor }}%0A%0A⚠️ [로그 확인](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})"
curl -s "https://api.telegram.org/bot${{ secrets.TELEGRAM_BOT_TOKEN }}/sendMessage" -d "chat_id=${{ secrets.TELEGRAM_CHAT_ID }}" -d "text=$MESSAGE" -d "parse_mode=Markdown"
Telegram API는 URL 인코딩된 텍스트를 그대로 전달할 수 있기 때문에, 줄바꿈을 %0A로 표현합니다. parse_mode=Markdown을 지정하면 굵은 글씨와 링크도 지원됩니다.
Slack + Telegram 동시 알림 — Composite Action 패턴
여러 레포지토리에서 같은 알림 로직을 재사용하고 싶다면 Composite Action으로 묶어두는 것이 좋습니다. 레포 내에 .github/actions/notify/action.yml을 만들고 아래처럼 정의합니다.
# .github/actions/notify/action.yml
name: "Deploy Notify"
description: "Slack + Telegram 배포 알림"
inputs:
status:
description: "success or failure"
required: true
slack_webhook:
required: true
telegram_token:
required: true
telegram_chat_id:
required: true
run_url:
required: true
runs:
using: "composite"
steps:
- name: Slack 알림
shell: bash
run: |
EMOJI=$([[ "${{ inputs.status }}" == "success" ]] && echo "✅" || echo "❌")
COLOR=$([[ "${{ inputs.status }}" == "success" ]] && echo "#36a64f" || echo "#ff0000")
curl -s -X POST "${{ inputs.slack_webhook }}" -H "Content-Type: application/json" -d "{"attachments":[{"color":"$COLOR","text":"$EMOJI 배포 ${{ inputs.status }}
🔗 ${{ inputs.run_url }}"}]}"
- name: Telegram 알림
shell: bash
run: |
EMOJI=$([[ "${{ inputs.status }}" == "success" ]] && echo "✅" || echo "❌")
curl -s "https://api.telegram.org/bot${{ inputs.telegram_token }}/sendMessage" -d "chat_id=${{ inputs.telegram_chat_id }}" -d "text=$EMOJI 배포 ${{ inputs.status }}%0A🔗 ${{ inputs.run_url }}" -d "parse_mode=Markdown"
# 사용 예시 (deploy.yml)
# - uses: ./.github/actions/notify
# if: always()
# with:
# status: ${{ job.status }}
# slack_webhook: ${{ secrets.SLACK_WEBHOOK_URL }}
# telegram_token: ${{ secrets.TELEGRAM_BOT_TOKEN }}
# telegram_chat_id: ${{ secrets.TELEGRAM_CHAT_ID }}
# run_url: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
if: always()로 한 스텝만 호출하면 성공·실패 모두 커버됩니다. job.status 값이 자동으로 success 또는 failure로 채워지기 때문에 조건 분기가 필요 없어 워크플로우 파일이 훨씬 깔끔해집니다.
실전 팁 — 알림 피로 줄이기
배포가 잦아지면 알림이 너무 많아져 오히려 무시하게 됩니다. 다음 패턴을 적용해 알림 피로를 줄여보세요:
- 실패만 알림:
if: failure()스텝만 남기고 성공 알림은 제거. 정상 배포는 노이즈. - 브랜치 필터:
on.push.branches: [main]으로 main 브랜치 배포만 알림. - Slack 채널 분리:
#deploy-success와#deploy-alert를 나눠 실패는 별도 채널로. - 스로틀링:
concurrency설정으로 동시 배포를 막아 중복 알림 방지.
자주 묻는 질문
Q. Telegram Chat ID를 모를 때?
봇을 채팅방에 초대한 뒤 https://api.telegram.org/bot{TOKEN}/getUpdates를 호출하면 chat.id 값이 반환됩니다.
Q. Slack Webhook URL이 노출될까 걱정된다면?
반드시 GitHub Secrets에 저장하고 워크플로우 파일에는 ${{ secrets.SLACK_WEBHOOK_URL }}로만 참조하세요. Secrets는 로그에도 마스킹됩니다.
Q. 모노레포에서 특정 서비스 배포만 알림하고 싶다면?paths 필터를 사용하세요. on.push.paths: ['services/api/**']처럼 설정하면 해당 경로 변경 시에만 워크플로우가 트리거됩니다.
코드벤터는 글로벌 협력 네트워크를 기반으로 다양한 프로젝트에서 GitOps와 CI/CD 자동화를 실전 적용해왔습니다. GitHub Actions 알림 자동화는 작은 설정이지만 팀 전체의 배포 가시성을 높이는 데 큰 효과가 있습니다. 위 예시 코드를 그대로 가져다 쓰셔도 되고, 프로젝트 상황에 맞게 커스터마이징하여 더 스마트한 배포 파이프라인을 구축해보세요.



