top of page

Github action, Slack API, AWS Lambda를 활용한 iOS 배포 자동화

최종 수정일: 7월 23일

안녕하세요! iOS 개발팀의 Zeus 입니다.


FLO iOS 개발팀에서는 개발 생산성을 향상 시키기 위해 많은 노력과 고민을 하고 있습니다. 다른 개발팀들과 마찬가지로 CI / CD에 대한 고민도 많고 생산성을 향상시키는 여러 방안들을 논의하고 있습니다. 그러한 하나의 일환으로 진행한 Github action과 Slack API, AWS Lambda를 활용하여 iOS 배포 자동화를 진행한 부분을 공유드리려고 합니다.


배포 자동화?


개발자에게 있어 배포는 매우 중요한 과정입니다. 개발의 궁극적인 목적은 대부분의 경우 개발을 통해 만든 프로덕트(Product)가 사용자와 만나도록 하는 것이며, 그 사용자를 만나는 거의 최종 단계가 바로 배포이기 때문입니다.


iOS 개발 과정에서는 최종적으로 App Store Connect에 올려 앱스토어 배포를 위한 심사를 받는 과정 외에도, 다양한 상황에서 배포가 필요합니다.


예를 들어,

  • 개발자 간 실기기 테스트가 필요한 경우 (직접 빌드도 가능하지만 반복적인 테스트를 위해 배포가 편리함)

  • QA를 위한 배포

  • 새로운 기획이나 시도를 기술적으로 어느 정도 구현할 수 있는지 확인하기 위한 배포

  • 기획자나 디자이너의 요청에 따른 배포

등등 생각보다 자주 배포가 필요합니다.


또한, iOS 앱을 배포하는 과정은 종종 번거롭고 반복적인 작업으로 가득 차 있습니다.


그렇기 때문에, 배포를 간편하고 빠르게 할 수 있도록 시스템화하고, 배포 자동화를 잘 구성하는 것은 개발 생산성 향상에 있어 매우 중요하고 반복적인 배포 작업에 시간을 많이 쓰지 않고 개발에 집중할 수 있는 환경을 만드는 것이 핵심입니다.


따라서 PR을 올릴 때 자주 수행되는 테스트 자동화뿐만 아니라, 보다 간편하고 빠르게 이루어지는 배포 자동화고도화하면 할수록 개발 생산성 향상에 크게 기여할 수 있습니다. 


기존 배포 진행 방식


기존의 배포 진행 방식도 Github Action 등으로 구성하여 나름의 자동화를 구성한 상황이었습니다.

ree

프로젝트에 fastlane을 구성하여 command 명령어로 배포는 가능한 상황이었고 Github action의 특정 branch 네이밍 commit 트리거로 빌드 머신을 통해 배포가 이뤄지는 구조로 되어있었습니다.


QA에 초점을 맞춘 방식이라서 배포를 위해서 불필요하게 branch를 생성해야 하고 commit을 해야만 배포를 할 수 있는 단점이 있었고, 이는 간편한 배포 방식이라고 보기에는 한계가 있었습니다.


Github action과 Slack API, AWS Lambda를 활용한 iOS 배포 자동화


기본적인 목표는 빌드 → 테스트 → TestFlight 업로드 → 팀에게 슬랙 알림까지의 과정을 GitHub Actions와 Slack API, AWS Lambda를 활용하여 iOS 앱의 배포를 자동화하고, 배포 상태를 Slack 채널로 실시간 알림 받는 자동화 파이프라인을 구축하는 것입니다.


그래서 기존의 불편함을 해소하고 Github action과 Slack API, AWS Lambda를 활용하여 간편하게 슬랙 API를 통해 슬랙에 메시지를 전달하는 것만으로 배포가 쉽게 이뤄질 수 있도록 구성하여 배포를 보다 편리하고 간편하게 할 수 있도록 작업하였습니다.


전체적인 배포 자동화 구조는 아래 이미지와 같습니다. Slack에서 이벤트를 보내면 AWS Lambda 서버가 해당 이벤트에 맞게 처리하여 필요한 경우 맞는 Github Action을 호출하는 구조로 구성되어 있습니다. 그럼 Slack App 구성부터 진행한 부분을 설명해 보도록 하겠습니다.

ree

1. Slack App 구성하기


먼저 iOS 배포 자동화를 위한 Slack Bot이 필요하여 Slack App을 추가해야 합니다.


1-1. https://api.slack.com/apps 에서 Create New App을 통해 새로운 슬랙앱을 추가하고 Slack Bot 이름과 슬랙 봇을 사용할 workspace를 설정

ree

1-2. Slack Bot 정보 추가 및 사용하는데 필요한 관련 권한 추가

ree
ree

FLO 앱 배포 Bot의 경우 Slack에 message를 적는 권한, Slash Command를 사용하는 권한, Webhook 사용을 위한 권한 등을 추가하였습니다.

ree
ree
ree

1-3. Slash Command 구성


Slash Command는 슬랙에서 /로 시작하여 특정 Command를 실행할 수 있는 간판한 API입니다. Slash Command로 /distribute Command를 구성하여 아래와 같은 앱 배포 선택을 가능하게 하는 메시지가 나오도록 구성하고자 합니다.

ree

 

뒷부분에서 설명할 AWS Lambda 구성에서 slash command를 전달 받아 아래 메시지가 나타나도록 슬랙에 메시지를 전달합니다. (배포 자동화 방식의 시작을 메시지를 전달하여 버튼으로 선택하게 한 부분은 다른 앱이 추가되는 경우를 대비한 것과 향후 고도화가 이뤄지면 선택지를 추가할 수 있도록 하기 위함입니다.)

ree

Slash Command 정보 중 Request URL 항목의 경우 Slash Command 호출 시 연결되도록 구성한 endpoint를 입력하면 됩니다 (여기서는 AWS Lambda로 구성한 URL 입력)

ree

1-4. Interactivity 구성

ree

슬랙에서 제공하는 여러 메시지 타입에는 유저가 interaction 할 수 있는 버튼 등이 포함된 메세지가 존재합니다. 이러한 interaction이 발생하였을 때 동작을 정의하고 원하는 동작이 발생하도록 구성할 수 있습니다. 이 때 물론 슬랙에서 이미 제공하는 동작을 연결하는 것이라면 따로 서버를 구성하고 연결할 필요가 없지만 특별한 동작을 해야 하는 경우 버튼 등interaction이 발생하였을 때 연결할 서버 URL을 명시해줘야 합니다. 해당 URL은 Interactivity Request URL로 Interactivity & Shortcuts 항목에서 설정할 수 있습니다. 단순 버튼 외에도 shortcut, modal, interactive component(버튼 등)와 소통하기 위해서도Interactivity 설정이 필요합니다. (Interactivity Request URL로 연결할 서버는 해당 포스트 뒷 부분에서 AWS Lambda를 통해 구성할 예정입니다.)

ree

2. Slack API로 소통할 AWS Lambda 구성하기


2-1. AWS 계정으로 로그인하여 Lambda 함수를 추가

ree

2-2. Lambda 함수 서버 언어 및 기본적인 인프라 구성


서버를 구성하는 언어의 경우 서버 구현 시 개인적으로 좀 더 친숙한 Javascript로 선택하였고 인프라 구성 방향은 정보보안팀과 인프라팀, 클라우드팀과 소통하여 구성하였으며 보안 측면의 이슈로 해당 블로그에서 자세한 내용은 생략하겠습니다.


AWS Lambda의 기본적인 인프라 구성이 완료되면 위에서 설명드린 Interactivity 설정에 Request URL을 구성한 AWS Lambda URL로 입력하면 됩니다.

ree

2-3. iOS 배포 자동화 역할을 하는 Lambda 함수 서버 코드 구성


AWS Lambda를 통해 구성할 서버는 주로 Slack 메시지와 소통하는 역할을 하게 될텐데 이 때 슬랙에 나타나는 버튼 등 유저와 interaction이 가능한 특별한 형식의 메시지를 보내기 위해서는 슬랙에서 정의한 형식에 맞게 response를 전달해야 합니다. 이 때 다양한 슬랙메시지 형식에 맞는 Response 구조를 Slack Block Kit이라고 부르는 구조로 전달하게 됩니다.


Slack Block kit

ree

슬랙에서 제공하는 Block Kit은 메세지 UI 구성을 위해 제공하는 것으로 다양한 interaction 및 여러 형식 구성이 가능하고 Block Kit (https://api.slack.com/block-kit) 문서 페이지에서 다양한 메시지를 직접 구성하면서 테스트 해볼 수 있습니다.

ree

예를 들면 위와 같은 버튼을 포함한 메시지를 구성하여 전달하기 위해 아래와 같이 Block Kit 형식에 맞춰 메시지를 구성하여 전달하였습니다.

ree

Slack Bolt

ree

Slack Bolt는 슬랙에서 제공하는 framework로 Slack App을 구성하여 Slack API를 손쉽게 활용할 수 있도록 Javascript, python 등 여러 언어별로 framework를 구성하여 API를 제공하고 있습니다. 쉽게 말해 Slack 앱을 만들 때, 슬래시 커맨드, 이벤트 리스닝, 인터랙티브 메시지 처리, OAuth 인증, 모달 등을 쉽게 구현할 수 있게 도와주는 도구 모음입니다. 어떻게 Slack API를 사용해야 하는지에 대한 설명이 문서에 자세히 나와 있어서 어렵지 않게 사용할 수 있습니다.


배포 자동화 구현에서도 AWS Lambda 서버를 구성하여 Slack API를 활용하여 소통하기 위해 Bolt를 사용하였고 주요 서버 구성은 아래와 같이 구성하였습니다.


기본적인 Bolt 활용한 서버 구성


npm install @slack/bolt

먼저 Slack Bolt를 설치하고 문서에 나온 대로 Slack API와 소통할 수 있도록 AwsLambdaReceiver, App 객체로 서버를 구성합니다. Node.js Express를 사용해 보신 분이라면 익숙하게 사용가능한 Express 스타일의 handler 구조 (app.message, app.command 등)로 Slack API와 소통할 수 있습니다.

ree

위와 같이 구성하고 서버 구동을 위한 handler를 구성하고 awsLambdaReceiver를 start 합니다.

ree

이제 기본적인 서버 구동 코드는 구성되었고 FLO iOS 배포를 진행하기 위한 각각 이벤트에 맞는 handler 코드를 구성해야 합니다.


초기 Slash Command 소통 구현


FLO iOS 배포를 위한 interactive 메시지를 보여주는 /distribute Slash Command listener를 다음과 같이 구성합니다.

ree
ree

배포 버튼 이벤트를 받아 배포 정보 입력 받는 Modal 보여주는 부분 구현


Interactive 메시지에서 FLO 배포 버튼을 누르면 배포를 위한 정보를 받는 Modal을 보여주도록 처리합니다. (배포 관련 정보는 정보보안팀과 논의하여 일단은 iOS 개발팀에서만 배포를 진행할 수 있도록 구성하는 방향으로 하여 개발팀에서 알 수 있는 branch, type 등의 정보를 기준으로 구성하여 배포를 진행합니다.)

ree
ree

최종적으로 배포 정보를 받아 Github Action으로 정보를 전달하여 배포가 진행되도록 trigger 처리 구현


뒤에서 설명할 구성한 Github Action의 외부 trigger가 가능한 workflow_dispatch trigger 사용하여 서버에서 post로 호출하여 원하는 action trigger 하여 배포 진행합니다.

ree
ree

3. AWS Lambda에서 trigger 요청할 Github Action 구성하기


서버에서 Rest API로 원하는 Github Action을 호출하기 위해 workflow_dispatch 로 Github Action을 구성하고 원하는 Input을 받아서 받은 Input 정보를 바탕으로 배포를 진행합니다.

ree
ree

workflow_dispatch 로 구성한 Github Action 구성은 아래와 같습니다. 구체적인 배포 Jobs 부분은 보안 이슈로 생략했습니다.

ree

4. 배포 성공 후 fastlane 통해 슬랙 메시지 전달


fastlane을 통해 구성된 배포 flow는 이번 작업에 포함된 부분이 아니고 기존에 구성된 fastlane을 사용하였으므로 자세한 설명은 하지 않겠지만 Github Action을 통해 결국 fastlane에 구성된 배포 lane을 실행하고 lane에 구성된 flow에 따라 배포가 완료되면 슬랙으로 메시지가 전달됩니다.

ree

마무리


 iOS 개발팀에서는 이전부터 배포가 좀 더 간편하게 이뤄져야 개발 생산성에 이바지할 수 있을 것 같다는 공감대가 있었습니다. 배포가 필요한 경우 심지어 퇴근 중에도 이제는 슬랙 메시지를 통해 쉽게 배포를 할 수 있게 되어서 현재까지는 크게 불편함 없이 배포 자동화를 사용하며 생산성 향상을 체감하고 있습니다.


앞으로 좀 더 고도화할 수 있는 부분이 있다면 고도화도 고려하고 있고 평소 크게 협업 접점이 없던 인프라, 클라우드팀과 협업하는 좋은 기회였고 보안으로 인한 여러 권한 프로세스나 AWS 구조에 대한 이해를 좀 더 넓힐 수 있는 작업이었습니다.


iOS 개발팀에서는 슬랙을 통한 배포 자동화 이후 이야기를 나눈 결과 수동 실수 방지, 반복 업무 절감, 커뮤니케이션 향상 등의 이점을 누리게 되었다고 평가하고 있고 앞으로도 개발 생산성을 위한 자동화 시스템 구축에 더욱 적극적으로 고려해 볼 예정입니다. 긴 글 읽어주셔서 감사합니다.

 
 
 

© DREAMUS COMPANY ALL RIGHTS RESERVED.

(주)드림어스컴퍼니 | 대표이사 김동훈 | 사업자등록번호 214-86-29288

서울특별시 서초구 강남대로 311, 드림플러스 15F

bottom of page