Skip to main content

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

GitHub Actions 배포 알림 자동화

왜 배포 알림이 필요한가?

코드를 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_TOKENTELEGRAM_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 알림 자동화는 작은 설정이지만 팀 전체의 배포 가시성을 높이는 데 큰 효과가 있습니다. 위 예시 코드를 그대로 가져다 쓰셔도 되고, 프로젝트 상황에 맞게 커스터마이징하여 더 스마트한 배포 파이프라인을 구축해보세요.

코드픽 - 외주 전문 AI 바이브 코딩 글로벌 진출

댓글 남기기