DevOps

Github Actions 실패 시 Slack으로 알림 보내기

MoDoLEE 2022. 12. 22. 13:45
반응형

저는 CI/CD 파이프라인을 구축할 때 주로 Github Actions를 이용해서 구축합니다.

이 때 CI 실패 시 실패 여부를 Slack 알림으로 받고 싶었고, 그 구축 과정을 하나씩 살펴 보겠습니다.

 

CI를 위한 Workflow 생성

  • CI Test라는 이름으로 아래와 같이 Github Actions에서 수행 될 workflow 파일을 생성합니다.
  • npm 사용을 기준으로 작성되었으며, yarn을 사용하는 경우 아래 사항을 수정합니다.

yarn 사용 시 변경 사항 

  • cache 이용 시 package-lock.json을 yarn.lock으로 변경
  • 디펜던시 설치 시 테스트 실행 명령: yarn --frozen-lockfile && yarn test

workflow 실행 순서

  • main 브랜치 기준으로 PUSH 또는 PR이 생성되었을 때 실행 (테스트를 위한 수동 실행도 포함)
  • Github Actions에서 제공하는 Ubuntu 최신 버전을 사용
  • 소스코드 체크아웃
  • 설치 시간 단축을 위한 node_modules 캐싱
  • 디펜던시 설치 및 테스트 실행 (타임아웃 설정)
name: CI Test

on:
  workflow_dispatch: # 수동 실행
  push: # 아래 브랜치에 PUSH가 됐을 때 실행
    branches: [main]
  pull_request: # 아래 브랜치에 PR이 생성 됐을 때 실행
    branches: [main]

jobs:
  ci-test:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout source code # clone
        uses: actions/checkout@v3

      - name: Cache node modules # node modules 캐싱
        uses: actions/cache@v3
        with:
          path: node_modules
          key: ${{ runner.OS }}-build-${{ hashFiles('**/package-lock.json') }}
          restore-keys: |
            ${{ runner.OS }}-build-
            ${{ runner.OS }}-

      - name: Install dependencies & Run test # Dependency 설치하고 테스트 실행
        timeout-minutes: 5 # 타임아웃 5분 설정
        run: npm ci && npm run test

CD를 위한 Workflow 생성

  • 자세한 배포 과정은 각자 환경에 따라 다를 것이므로, 생략하였습니다.

workflow 실행 순서

  • main branch의 CI Test workflow가 완료되면 Deploy workflow가 실행됩니다.
  • if문을 통해서 github.event.workflow_run.conclusion의 성공, 실패 여부를 판단하고, 그에 따른 프로세스를 진행합니다.
  • CI Test 성공 시: 배포
  • CI Test 실패 시: Slack 메세지 전송

 

name: Deploy

on:
  workflow_dispatch: # 수동 배포
  workflow_run:
    workflows: ['CI Test']
    branches: [main]
    types: [completed]

jobs:
  deploy:
    if: ${{ github.event.workflow_run.conclusion == 'success' }}
    name: Deploy
    runs-on: ubuntu-latest # 실행 될 OS. Github Action에서 제공하는 우분투 최신 (22.04)

    steps:
      - name: Checkout
        uses: actions/checkout@v3 # Repository 체크아웃
    
    # 자세한 배포 과정은 생략

  slackNotify:
    if: ${{ github.event.workflow_run.conclusion == 'failure' }}
    runs-on: ubuntu-latest
    steps:
      - name: Notify message to slack
        uses: rtCamp/action-slack-notify@v2
        env:
          SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
          SLACK_CHANNEL: ${{ secrets.SLACK_CHANNEL }}
          SLACK_COLOR: ${{ job.status }} # 또는 'green', '#ff00ff' 처럼 직접 색상 지정
          SLACK_USERNAME: Github CI
          SLACK_ICON: https://st2.depositphotos.com/2274151/11073/v/950/depositphotos_110731914-stock-illustration-failed-red-grunge-round-vintage.jpg
          SLACK_TITLE: Message
          SLACK_MESSAGE: 'Main 브랜치 CI 테스트가 실패했습니다. :boom:'

 

rtCamp/action-slack-notify 사용법

  • 실행 시 환경변수로 원하는 값을 지정하면 됩니다.
  • 중요 환경변수
    • SLACK_WEBHOOK: 메세지를 받을 Slack 채널에 연결 된 Incoming Webhook URL (생성 방법 추후 설명)
    • SLACK_CHANNEL: 메세지 받을 Slack 채널 이름
    • SLACK_COLOR: 메세지 앞의 구분선 색상 (job.status를 하면 )
    • SLACK_USERNAME: Slack 메세지에 표시 될 사용자 이름
    • SLACK_ICON: Slack 메세지에 표시 될 아이콘 (이미지 URL)
    • SLACK_TITLE: 메세지 제목
    • SLACK_MESSAGE: 메세지 내용

보다 자세한 사용법은 링크를 참고하세요. https://github.com/rtCamp/action-slack-notify

Slack 채널에 Incoming Webhook 추가

  • 왼쪽 상단의 워크스페이스 이름 > 관리 >  앱 관리 선택

  • incoming webhook 검색 > 수신 웹후크 선택

  • Slack에 추가 선택

  • 메세지 수신할 채널 선택 후 수신 웹후크 통합 앱 추가 실행

정상적으로 추가 됐으면 해당 채널에 아래와 같은 메세지가 옵니다.

  • 앱 추가 완료 후 이동 한 페이지에서 웹후크 URL 확인

Github Actions Secrets 추가

  • Github Actions가 실행 될 저장소에 접속
  • Settings > Secrets > Actions로 이동
  • New repository secret을 눌러서 SLACK_WEBHOOK, SLACK_CHANNEL 정보를 입력

  • 정상적으로 추가됐다면 아래와 같이 나옵니다.

메세지 수신 테스트

  • 모든 준비가 완료되었으니, 테스트를 위해 일부러 실패하는 workflow를 만들고 (예: 일부러 실패하는 테스트 만들기) main 브랜치에 변경 된 내용을 push합니다.
  • 정상적으로 설정이 되었다면, CI Test가 실패한 후 Deploy workflow에서 slackNotify Job이 실행됩니다.

 

이제 CI 실패 시 Slack으로 알림을 받을 수 있게 되었습니다!

반응형