본문 바로가기

Android/CI CD

[Github Actions] Github Actions를 사용해보자 - 4. Slack 연동

728x90

본 게시글은 이전 게시글에 이어서 작성된 부분입니다.

2022.03.23 - [Android/CI CD] - [Github Actions] Github Actions를 사용해보자 - 1. 기본 개념 정리

2022.03.24 - [Android/CI CD] - [Github Actions] Github Actions를 사용해보자 - 2. 기본 Setting

2022.03.26 - [Android/CI CD] - [Github Actions] Github Actions를 사용해보자 - 3. APK 생성 및 업로드

 

apk를 생성하고 Github actions에 apk를 업로드해보았으니,

이번에는 회사에서 많이 사용하는 Slack에서 제공하는 Slack API를 사용하여 Slack에 빌드 시 Noti를 던지고 APK를 Upload 하는 방법에 대하여 알아볼 예정이다.


Slack에 연동하기 위해서는 우선,

Slack에 새로운 App을 생성해 주어야 하니, App을 생성해보도록 하자.

 

Slack에 App을 생성하기 위해서는 Slack API 페이지에서 진행하면 된다.

 

 

이곳에서 Create New App을 눌러서 App을 생성해준다.

 

 

App Name을 작성하고 workspace를 설정해주면 되는데,

App Name은 추후에 Slack에서 Notification을 보내고, apk를 업로드해줄 이름이라고 생각하면 되고,

workspace는 해당 기능을 사용할 슬랙의 workspace로 선택해주면 된다.

필자는 회사에서 사용하는 workspace에 비공개로 채널을 만들어서 사용했다.

 

 

Create App을 하고 나면 다음과 같은 화면을 볼 수 있는데, 이곳에서 우리가 사용할 부분은 Incoming Webhooks이다.

하단에 나와있는 설명만 보아도 알 수 있듯이 message를 Slack으로 보내기 위해 필요한 부분이다.

 

 

해당 영역을 누르게 되면 다음과 같은 화면이 나온다.

딱 보면 알 수 있듯이 해당 옵션이 off 되어있기 때문에 on으로 변경하여 사용할 수 있도록 해준다.

 

 

그 후, 확인할 수 있는 화면에서 Add New Webhook to Workspace를 통해 Webhook을 만들어주면 된다.

 

 

비공개 채널을 생성하여 테스트를 진행할 예정이기 때문에, 임시로 생성한 채널을 설정해주도록 한다.

 

 

생성이 완료되면 다음과 같은 URL을 확인할 수 있는데, 이것은 Slack에 연동할 때 사용할 값이다.

 

해당 값을 소스코드에 넣어서 사용하는 방법도 있지만,

노출이 되면 안 되는 값이기도 하기 때문에 필자는 Github의 Secrets에 값을 저장하여 사용하도록 하였다.

 

Github의 Secrets에 값을 Key-Value 형태로 저장하게 되면, yml파일에서 변수명으로 해당 값을 호출할 수 있으며, workflow에서 해당 값을 사용할 때 평문 노출이 되는 것이 아니라, ***으로 표기되기 때문에 안전하다.

 

 

Secrtes는 Github에서 Setting 탭을 누르면 설정하는 부분을 찾을 수 있다.

Settings > 좌측 하단의 Secrets > Actions를 누르면 위와 같은 화면을 확인할 수 있다.

 

 

New repository secret를 누르면 다음과 같이 변수를 설정할 수 있는 화면이 나오고, 위에 Webhook URL을 Value로 넣어주면 된다.

name으로 선언하는 부분은 사용자가 마음대로 작성해도 되는 부분이며, 필자는 Slack에서 message를 보내는 action의 가이드와 동일한 이름을 사용하였다.

 

여기까지 진행했으면, Slack에 빌드에 대한 Noti를 생성할 기본적인 세팅은 끝났다.

 

다음은 YML에 Slack에 대한 Action을 추가할 차례이다.

Github Action에서 제공하는 Marketplace에서 slack-send를 검색해서 문서를 확인해보자.

 

steps:
  - uses: 8398a7/action-slack@v3
    with:
       status: ${{ job.status }}
       fields: repo,message,commit,author,action,eventName,ref,workflow,job,took,pullRequest  # selectable (default: repo,message)

    env:
       SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} # required
    if: always() # Pick up events even if the job fails or is canceled.

 

라고 가이드가 나와있다.

fields에 선언되는 값들은 빌드 결과를 Slack 메시지로 보냈을 때 나오는 항목들을 말하는 것이다.

따라서, 모든 값들을 포함해서 보내본 후, 필요한 값들로만 다시 설정하는 것이 좋을 것 같다.

 

가이드에 따라서 yml에 코드를 추가해주도록 한다.

 

- name: Slack - Send Msg
  uses: 8398a7/action-slack@v3
  with:
     status: ${{ job.status }}
     fields: workflow,job,commit,repo,author,took,ref
     author_name: Heeg
  env:
     SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
  if: always()

 

SLACK_WEBHOOK_URL에 들어가는 부분이 아까 Github Secrets에서 작성해둔 변수 값이다.

따라서, 필자와 다른 이름으로 설정했다면, SLACK_WEBHOOK_URL 부분을 설정한 이름으로 변경해주면 된다.

 

 

이렇게 추가하고 빌드를 하면, 다행스럽게도 한 번에 정상적으로 빌드가 되는 것을 확인할 수 있다.

 

 

몇 가지 필드를 줄였음에도 불구하고 많은 값들이 메시지로 확인되는 것을 볼 수 있었다.

여기서 필요한 정보만 나오도록 수정해서 사용하면 될 것으로 보인다.


자, 빌드 시 Noti를 보내는 작업까지 끝냈으니 다음에는 

빌드한 APK 파일을 업로드하는 작업을 진행해보자.

 

파일을 업로드 하기 위해서는 다시 Slack API 페이지에서 추가적으로 세팅을 해주어야 한다.

 

 

OAuth & Permission 탭으로 들어가서, 하단으로 스크롤을 조금 내려보자.

 

 

Scopes라고 적혀있는 탭에서 처음에 메시지를 보내기 위해 생성했던 webhook에 대한 값이 이미 등록되어 있는 것을 볼 수 있다.

이곳에서 우리는 파일 upload를 위하여 files:write scope를 추가해주면 된다.

Add an OAuth Scope 버튼을 누르고, files를 검색하면 위의 이미지와 동일하게 나오니 선택해주면 된다.

 

해당 스코프를 설정해주면, 상단에 노란색 탭으로 reinstall your app이라는 문구가 뜨는데, 해당 문구를 클릭하여 reinstall을 진행해 주도록 한다.

 

 

그 후, 해당 탭을 보면 Bot user OAuth Token이 생성되어 있음을 확인할 수 있다.

위에서 했던 것처럼, 해당 토큰 또한 yml에 입력하여 사용해야 하며 노출되서는 안 되기 때문에 Github의 Secrets에 등록하여 사용하도록 한다.

 

 

다시 등록을 해주고 난 후에,

Marketplace에서 slack upload를 검색해보자.

2가지 종류의 file upload에 대한 항목이 나오는데, 필자는 해당 항목을 사용하도록 하였다.

 

Example로 올라와 있는 코드를 확인해보도록 하자.

 

steps:
   - run: 'echo ${{ github.event.inputs.message }} > message.txt'
   - uses: MeilCli/slack-upload-file@v1
      with:
        slack_token: ${{ secrets.SLACK_TOKEN }}
        channels: ${{ secrets.SLACK_CHANNELS }}
        file_path: 'message.txt'
        file_name: 'message.txt'
        file_type: 'text'
        initial_comment: 'post by slack-upload-file'

 

예시를 확인해보니, message.txt 파일을 직접 만들어서 해당 파일을 올리도록 되어있다.

설명을 보니 Channels값은 선택적으로 넣는 부분이고 해당 예제에서는 뭔가 값을 사용하고 있으니 해당 값은 빼보도록 하자.

일단 테스트용으로 channels 값만 빼고 그대로 넣어서 정상적으로 동작하는지 확인하도록 하자.

 

 

이번에도 뭔가 경로에 문제가 있는 것일까?

어떠한 문제인지 찾아보기에는 시간이 아깝기 때문에, 이전 게시글에서 사용했던 경로를 사용하도록 하였다.

이전 게시글에서 문제없이 업로드가 되는 것을 확인했으니 해당 경로를 넣었을 때 문제가 발생하면 경로 문제가 아니게 되는 것이기 때문이다.

 

- name: Slack - Upload APK
   uses: MeilCli/slack-upload-file@v1.0.0
   with:
      slack_token: ${{ secrets.SLACK_TOKEN }}  
      initial_comment: 'APK File Upload'
      file_type: 'apk'
      file_name: 'presentaion-debug.apk'
      file_path: './presentaion/build/outputs/apk/debug/presentaion-debug.apk'

 

이렇게 yml을 수정한 후에 Commit을 해보았다.

 

성공적으로 빌드가 되었지만, 슬랙에 업로드된 파일이 존재하지 않는다.

Slack Upload 관련하여 조금 더 확인해 보니까 Slack에 앱 등록을 해두고 채널 설정을 해줘야 한다고 한다.

 

 

Slack에서 앱을 누르고 확인해보면 Slack API에서 만들었던 App을 확인할 수 있다. 해당 앱을 클릭하여 추가해주도록 한다.

위의 사진에서 CI_TEST라고 되어있는 게 필자가 만들었던  App이다.

(이 이전의 사진에서는 Test_Dummy 였는데, 이것 저것 확인해보다가 앱을 지우고 다시 생성하였다.)

 

앱을 추가하게 되면 좌측 하단에 앱이 추가되게 되는데, 추가된 앱을 채널에 추가해주어야 한다.

 

앱을 우클릭하고 앱 세부 정보 열기를 누르면

 

 

다음과 같은 화면이 나오게 되는데 여기서 이 앱을 채널에 추가를 눌러 APK를 업로드할 채널을 설정해주도록 한다.

그 후, 해당 채널에 들어가면 앱이 추가되었다는 메시지를 확인하면 정상적으로 추가가 된 것이다.

 

그다음, 채널 설정을 위하여 Secret에 채널 변수를 추가해 주도록 하자.

 

 

Value에 들어갈 값은 Slack에 존재하는 채널의 이름이다.

 

해당 값을 넣고, yml을 수정해주도록 하자.

 

- name: Slack - Upload APK 
   uses: MeilCli/slack-upload-file@v1.0.0 
   with: 
      slack_token: ${{ secrets.SLACK_TOKEN }} 
      channels: ${{ secrets.SLACK_CHANNEL }}
      initial_comment: 'APK File Upload' 
      file_type: 'apk' 
      file_name: 'presentaion-debug.apk' 
      file_path: './presentaion/build/outputs/apk/debug/presentaion-debug.apk'

 

해당 속성 값을 추가하고, Commit을 하여 workflow가 수행되도록 하자.

 

정상적으로 빌드가 되고,

 

 

APK 파일이 업로드된 것을 확인할 수 있다.


이렇게 까지 적용을 한다면,

Slack을 사용하여 Commit 시마다 빌드에 대한 정보를 알 수 있고, 해당 Commit에 해당하는 APK 파일을 자동으로 전달하여 줄 수 있게 된다.

 

현재 yml에 설정된 옵션은 main에 push 하거나 PR을 요청할 때마다 해당 작업들이 수행되게 되어있는데,

조건을 추가 수정하여 실제 회사에서 업무를 진행할 때 사용할 수 있을 것이다.

 

필자도 다음 프로젝트부터, 아니면 현재 유지보수가 들어가는 프로젝트에서 주기적인 빌드가 필요한 게 있으면 해당 옵션을 조금 더 수정하여 넣어보려고 한다.

 

그렇기 때문에, 다음 글은 조금 더 확장할 수 있는 옵션에 대하여 스터디를 진행하고 작성해보고자 한다.

728x90