React Native Fastlane Discord 알림 연동하기
1. 개요
앱 개발자로 일하면서 느낀 점은 개발하는 시간만큼이나 배포에 많은 시간이 투자된다는 점이었다.
iOS Internal Testing Deploy Process
앱은 웹과 달리 상당히 복잡한 프로세스(Android & iOS Deploy Process)를 거쳐 배포되기에, 앱 수동 배포를 몇 번만 해봐도 진절머리가 난다. 심지어 자동화 배포를 구축하는 과정도 빌드 넘버 관리부터 시작해서 인증서 관리까지 생각보다 복잡하다. 다행히도 관련 자료가 많아 fastlane을 이용해 비교적 빠르게 해결할 수 있었다.
근데 문제는 배포 자동화를 적용하여 복잡한 프로세스를 간편하게 처리할 수 있게 되었는데, 배포가 끝났다는 공지를 위해 15~20분가량을 매번 기다리고 있었다는 것이었다. (진짜…. 바본가? 🥲)
그래서 오늘은 알림 자동화 기능을 추가하여 잃어버린 시간을 되찾아 보려고 한다.
2. 알림 자동화
Fastlane
Android와 iOS 배포를 단순화하는 데 목적을 둔 Ruby기반의 오픈 소스 플랫폼
Fastlane은 기본적으로 slack plugin이 연동되어 있어 slack을 사용하고 있다면 손쉽게 추가할 수 있다. 하지만 우리 팀은 discord를 사용하고 있기 때문에 알림 자동화를 위해 discord_notifier 외부 플러그인을 추가해야 한다.
우선 androd와 iOS에 대한 fastlane 자동화가 적용되어 있다면, 다음과 같이 fastlane 폴더를 확인할 수 있을 것이다.
iOS는 ios 폴더로, android는 android 폴더로 이동한 후 아래 명령어를 통해 discord_notifier
플러그인을 추가해 주면 된다.
1
fastlane add_plugin discord_notifier
이렇게 하면 다음과 같이 설치가 완료되었다는 메시지와 함께 fastlane 폴더 내부에 PluginFile이 추가된 것을 확인할 수 있다.
1
2
3
4
5
# Autogenerated by fastlane
#
# Ensure this file is checked in to source control!
+ gem 'fastlane-plugin-discord_notifier'
만약 이미 외부 플러그인들을 적용한 상태라면 PluginFile 하단에 fastlane-plugin-discord_notifier
이 추가된 것을 확인할 수 있다.
이때 주의할 점이 있다. Gemfile에 plugins_path
가 PluginFile을 제대로 참조하고 있는지를 확인해야 한다.
1
2
3
4
5
6
7
source "https://rubygems.org"
gem "fastlane"
- plugins_path = File.join(File.dirname(__FILE__), '', 'Pluginfile') # 🚨
+ plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile') # ✅
eval_gemfile(plugins_path) if File.exist?(plugins_path)
Pluginfile은 fastlane 폴더 내부에 외부 플러그인을 가져올 때 생성되기 때문에, plugins_path
가 위와 같이 되어 있다면 fastlane을 포함한 경로로 수정해야 한다. (만약 올바른 경로를 설정해주지 않는다면 디스코드 알림 단계에서 외부 플러그인을 가져오지 못하고 에러가 발생하게 된다. 🤯)
이제 준비는 완료되었고 android에서는 upload_to_play_store
이후, iOS에서는 upload_to_testflight
이후 디스코드 알림을 추가해주면 된다.
Android와 iOS를 둘 다 큰 차이는 없어서, iOS를 기준으로 작성하겠다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
default_platform(:ios) # Fastlane 플랫폼 설정
platform :ios do
desc "Push a new build to TestFlight"
lane :internal do # 내부 테스팅 업로드를 진행하는 lane 블록
# ...
upload_to_testflight # Testflight로 앱 업로드
+ discord_notifier( # ✅ 업로드 성공 시 디스코드 알림 전송
+ webhook_url: webhook_url,
+ title: "🚀 테스트 플라이트 #{version} 버전 업로드 성공",
+ description: "현재 버전: #{version}\n빌드 번호: #{latest_build_number + 1}\nTestFlight를 확인해주세요.",
+ )
clean_build_artifacts # 빌드 과정에서 생성된 Artifacts 정리
end
end
여기서 webhook_url은 디스코드의 webhook_url을 추가해 주면 되는데, 정상적으로 추가하고 fastlane을 이용한 빌드를 실행해 보면 다음과 같이 알림이 정상적으로 오는 것을 확인할 수 있다. 🎉
근데 성공 알림만 오고 실패 알림이 오지 않는다면 에러가 발생한 경우 즉각 대응할 수 없으니, 에러가 발생할 경우에 대해서도 디스코드 알림을 추가해 줘야 한다.
이왕 추가해 주는 김에 에러 발생 원인을 메시지로 추가해 주자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
default_platform(:ios) # Fastlane 플랫폼 설정
platform :ios do
desc "Push a new build to TestFlight"
lane :internal do # 내부 테스팅 업로드를 진행하는 lane 블록
# ...
upload_to_testflight # Testflight로 앱 업로드
discord_notifier( # ✅ 업로드 성공 시 디스코드 알림 전송
webhook_url: webhook_url,
title: "🚀 테스트 플라이트 #{version} 버전 업로드 성공",
description: "현재 버전: #{version}\n빌드 번호: #{latest_build_number + 1}\nTestFlight를 확인해주세요.",
)
clean_build_artifacts # 빌드 과정에서 생성된 Artifacts 정리
end
+ error do |lane, exception| # lane 실행 중 예외가 발생했을 때 호출되는 블록
+ discord_notifier( # 🚨 업로드 실패 시 디스코드 알림 전송
+ webhook_url: webhook_url,
+ title: "❌ 테스트 플라이트 업로드 실패",
+ description: "에러: #{exception.message}",
+ )
+ end
end
위와 같이 lane 블록에서 에러가 발생했을 때 호출하는 error 블록을 추가해 주고, error 블록에서 디스코드 알림 전송을 추가해 주자. 그럼 fastlane이 동작하는 과정에서 에러가 발생하면 에러 메시지와 함께 디스코드 알림이 정상적으로 오게 된다. (discord는 외부 플러그인이라 그런지 slack 알림이 더 보기 좋은 것 같다. 🥲)
난이도가 높지 않은 작업이었지만, 알림 자동화 기능을 통해 배포 중 발생하던 불필요한 대기 시간을 없앨 수 있었고, 에러 발생 시 신속히 대응할 수 있는 환경을 구축할 수 있었다.
또, 불필요한 수작업을 자동화하면서 팀의 생산성이 확실히 개선될 수 있다는 걸 느꼈다. 앞으로도 이런 작은 자동화 아이디어들을 팀에 도입해 팀의 개발 환경과 생산성을 높여나가야겠다. 🚀