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으로 알림을 받을 수 있게 되었습니다!
반응형