생산성 200% 올려주는 스타트업 자동화 (3)
실수를 방지하는 가장 쉬운 방법을 뭘까요? 제 생각에는 반복 확인이에요. 코드가 오류 없이 잘 작동하도록 하기 위해서는 다양한 케이스에 대한 반복 확인이 필요하죠. CI/CD가 필요한 이유 중 하나라고 생각합니다. 지속적 통합(CI) 과 지속적 배포(CD)를 통해 자주 테스트 하고 오류를 빠르게 발견 할 수 있겠죠. 이 글에도 언급 했었지만 기존에는 자동화된 CI/CD가 동작하지 않고 있었는데요. Fastlane 을 이용해서 각자 필요한 경우에 각자의 맥북에서 배포를 진행하고 있었죠. 배포 환경이 제각각이었고 배포 시간도 오래 걸리고 결과 공유도 쉽지 않았습니다. 자동화할 타이밍 이었어요.
인지부하 — 펠리너 헤르만스의 저서 “프로그래머의 뇌"에는 인지과학에 기반한 여러 개념과 방법론들을 설명합니다. 인지부하는 개발자가 작업을 진행할 때 작업 기억에 가해지는 정신적 노동의 양을 의미합니다. 내재적 부하, 외재적 부하 그리고 본유적 부하가 있습니다. 인지부하가 발생하는 이유는 작업 기억이 처리할 수 있는 양이 제한되어 있기 때문이에요.
자동화가 대체 왜 필요할까요?? — 반복적이고 수동적인 작업들로 인해 발생하는 인지부하를 줄이고 개발자들이 핵심로직과 중요한 문제해결에 집중하도록 하기 위함입니다. 작업 기억에 가해지는 불필요한 정신적 부담을 줄여 인지 부하를 감소시키고, 개발 효율성과 코드 품질을 향상시킬 수 있습니다.
Fastlane + GitHub Actions + Slack API
Fastlane은 iOS 빌드/배포 자동화를 위해 필요했습니다. Firebase Deploy 부터 Testing, AppStore 배포까지 거의 모든 툴킷이 제공되고 사용하기도 쉽습니다. 깃헙액션만 사용해도 Fastlane 에서 사용하는 대부분의 기능을 구현할 수 있지만 개인적으로는 가독성이나 생산성이 만족스럽지 않았습니다. 스크립트를 호출하는 방식도 있지만 저는 Fastlane 사용을 더 선호합니다. Fastlane은 커뮤니티가 활발해 이슈가 발생 했을 때 빠르게 업데이트 됩니다. 최근에 Xcode16의 Buidable Folder 를 사용하면 앱스토어 배포가 실패하는 경우가 있었는데요. 커뮤니티에서 이슈 레이징이 되고 빠르게 해결이 되더라고요.
Slack
자동화에서 가장 중요한 포인트는 커뮤니케이션 툴이죠. 개발자가 아니더라도 배포과정을 모니터링 할 수 있도록 하는게 중요했어요. 심지어 배포도 할 수 있도록 했습니다. 보다 효율적인 커뮤니케이션을 위해 Slack app을 개발했습니다. 참고로 하나의 슬랙앱에서 슬래시 커맨드는 5개 까지만 만들 수 있습니다.
Fastlane
Fastlane 에서 슬랙으로 메시지를 보내기 위해 slack-ruby-client 를 사용했습니다. 슬랙 포스트 API에 Thread Ts 파라미터를 추가하면 해당 슬랙 메시지의 쓰레드로 메시지가 전송됩니다. 배포과정을 하나의 쓰레드에서 관리하도록 합니다. 샘플 Fastfile을 여기서 확인하 실 수 있어요. 중복된 내용도 많고 개선할 포인트도 많지만 참고해서 더 나은 파일 만들기에는 충분할 거라 생각됩니다. 아래 처럼 현재 빌드 상태를 슬랙으로 전송 할 수 있습니다.
...
desc "Deploy a new version to the App Store"
lane :release do |options|
begin
api_key = sign_app(adhoc: false)
increase_build_number(api_key: api_key)
build_number = get_build_number(
xcodeproj: "./Modules/APP_NAME/APP_NAME.xcodeproj"
)
version_number = get_version_number(
xcodeproj: "./Modules/APP_NAME/APP_NAME.xcodeproj",
target: "APP_NAME"
)
options[:text] = "🏁 *빌드 시작! Version: #{version_number}(#{build_number})*"
send_text_slack_message(options)
...
Github Actions
Github Action은 슬랙으로 부터 받은 요청과 파라미터를 이용해 Fastlane 으로 전달하는 역할을 합니다. 슬래시 커맨드를 실행하면 slack_channel, thread_ts, release_note 등의 파라미터를 fastlane 실행시 전달해 줍니다. github action 에서 실패/성공한 경우 슬랙으로 결과를 전달합니다. 샘플 코드
name: Deploy to AppStore
on:
workflow_dispatch:
inputs:
slack_channel:
description: "Slack Channel"
required: false
default: "group_ios_notifications"
type: string
slack_thread_ts:
description: "Slack Thread TS"
required: false
default: null
type: string
release_notes:
description: "Release Notes"
required: false
default: null
type: string
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
build:
runs-on: [self-hosted, m5-mac-pro]
...
Slack Block Kit
Slack BlockKit 을 사용하면 모듈화된 방식으로 다양한 요소를 사용해 원하는 UI 를 쉽게 구성할 수 있습니다. 아래와 같은 UI 를 를 쉽게 생성할 수 있습니다.
전체 구조는 아래와 같습니다. 슬랙 커맨드로 깃헙액션을 트리거 하고 깃헙액션은 정의되어있는 Fastlane 을 실행합니다. 이때 슬랙 채널, 쓰레드 정보, 릴리즈 노트, 브랜치 이름 등을 파라미터로 전달 할 수 있고 실패 했을 때 재시도 로직 등을 구현할 수 있어요. 마지막으로 성공했을 경우 결과 메시지를, 실패 했을 경우 에러 메시지를 슬랙으로 전달하도록 했습니다.
마무리
Fastlane, GitHub Actions, 그리고 Slack을 활용한 iOS 배포 자동화의 흐름을 설명드렸습니다. 자동화를 통해 반복적인 작업에서 벗어나 보다 중요한 개발 업무에 집중할 수 있고, 배포 프로세스를 팀 전체가 투명하게 공유할 수도 있습니다. 특히, Slack을 활용한 배포 트리거 및 모니터링 시스템은 개발자뿐만 아니라 PM, QA 직군도 배포 상황을 실시간으로 파악할 수 있도록 도와줍니다. 배포 실패 시 즉각적인 대응이 가능하고, 필요하면 재시도도 쉽게 할 수 있는것이 좋더라고요. 자동화는 단순한 편의 기능이 아니라, 팀의 생산성을 극대화하고 개발 문화를 한 단계 성장시키는 중요한 요소입니다. 앞으로도 자동화를 활용한 최적의 개발 환경을 만들기 위해 다양한 시도를 해보는 것도 좋을 것 같습니다.
혹시 더 궁금한 점이나 개선 아이디어가 있다면 언제든지 알려주세요! 🚀
생산성 시리즈
Fastlane + Github Actions + Slack App for iOS
⏰ 딜라이트룸에서 알라미와 함께 아침을 바꿀 분들을 모십니다 🙌
- 딜라이트룸 채용 공고 살펴보기 ⏰
(+ 여기서 지원하면 입사 축하금 100만원💸)