이번엔 Tuist에 이어서 CD를 위한 툴 fastlane에 대해서 다뤄보려고함다..!
제가 느끼기엔 최근 Ai 역량이 증가하면서 단순 기능 구현/개발이나 코딩적인 부분보다 CI/CD, Lint,Tuist 뭐 등등.. 서로 협업 과정에서 맞춰나가야하는 환경설정 같은 부분들은 완벽하게 Ai가 해주기엔 번거로운 감이 있어서, 이런 부분에 좀 더 리소스를 투입해야하는 것 같슴다..!
CD란?
CD(Continuous Deployment)를 의미함다. 귀찮은 배포 과정을 자동화한다고 이해하시면 좋을 것 같다.
그럼 여기서 같이 묶이는 CI는 또 무엇일까? CI/CD라고 묶이는 것을 종종 봐왔을 것이다.
CI란?
CI(Continuous Integration)를 의미함다. 개발자가 작업한 코드를 지속적으로 통합하면서, 빌드와 테스트를 자동으로 수행해 문제가 없는지 검증하는 과정임다.

그래서 이걸 묶어서 CI/CD 파이프라인이라고 부르는 것임다.
새로운 커밋이 올라오면 코드를 자동으로 통합하고, 빌드와 테스트를 거쳐 검증된 결과물을 실제 서비스 환경에 배포하는 전체 과정을 자동화한 흐름을 파이프라인이라고 하는 검다.
그럼 오늘의 주인공 fastlane에 대해서 알아보자..!

fastlane은 모바일 앱(iOS/Android)의 빌드, 테스트, 코드 서명, 배포까지 전 과정을 자동화해주는 오픈소스 도구임다.
반복적으로 수행해야 하는 배포 작업을 스크립트로 정의해, 한 번의 명령으로 처리할 수 있게 해주는 CD툴임다..!
사실 여기까지만 정보고 실제로 어떻게 사용하는지가 중요할 것 같은데, 설치부터 같이해보자..! 여기서는 안드로이드는 아니고 iOS기반으로 설명을 이어나갈 것임다.
brew install fastlane
어디서 설치하든 상관은없고, 잘 설치가 되었으면, 이제 내가 적용해주고싶은 프로젝트로 가서 진행해주면 됨다.
프로젝트로 가라는게 어디까지 가라는거야?
xcodeproj가 있는 디렉토리까지 접근을 하면됨다.
ls로 현재 파일들 불러왔을때 xcodeproj가 보이면 성공! 여기에서 이제 실행해주면된다.
fastlane init

여기서 선택을 하라고 나온다.
1. 자동 스크린샷
2. 자동 TestFlight 배포
3. 자동 App Store 배포
4. 수동으로 설정하기
저는 앱스토어에 배포를 할 예정이라 3번이 맞긴한데, 어떻게 돌아가는지도모르고 자동생성하는 것은 파악하기가 어렵슴다. 처음이기도하니까 일단은 4번으로 선택해서 여러가지 설정들을 훑어보면서 설정을 해주도록 하겠슴다.
글고 iOS배포가 code sigining , scheme, bundle, appstore connect, archive/export 설정 등 살짝만 어긋나도 애매해지는 경우가 있어서 초기설정에는 manual로 틀을 잡고 필요한 것만 직접 누르는 경우가 더 이상적이라고들 함다..!
4번을 선택하고 여러번의 엔터로 승인을 해주고나니, 다음처럼 파일이 3개가 더 생겼음을 알 수 있다.

2_1. gemfile.lock
Appfile
# app_identifier("[[APP_IDENTIFIER]]") # The bundle identifier of your app
# apple_id("[[APPLE_ID]]") # Your Apple Developer Portal username
# For more information about the Appfile, see:
# https://docs.fastlane.tools/advanced/#appfile
총 필요한게 3가지다.
1. app_identifier


그래서 그냥 정직하게 저부분에 잘 기입해주면된다.

자 이러면 일단 Appfile 초기세팅은 끝!!! 다음은 fastfile파일로가자
default_platform(:ios)
platform :ios do
desc "patch 버전 업 "
lane :patch do
increment_version_number(bump_type: "patch")
increment_build_number
build_and_upload
end
desc "minor 버전 업"
lane :minor do
increment_version_number(bump_type: "minor")
increment_build_number
build_and_upload
end
desc "major 버전 업"
lane :major do
increment_version_number(bump_type: "major")
increment_build_number
build_and_upload
end
private_lane :build_and_upload do
gym(
scheme: "Selectd",
export_method: "app-store",
clean: true
)
deliver(
submit_for_review: true,
automatic_release: true,
skip_screenshots: true,
skip_metadata: true
)
end
end
일단 기본설정을 해줬고.
하나하나 훑어보겠슴다..!
잠깐! ipa란?
- iOS App Archive — iOS 앱의 설치 파일 묶음임다. 안드로이드에서 .apk 와 같은 개념이라고 보시면 됨다.
testflight면 pilot을 해야하는데, 저는 바로 Appstore에 등록하려고 deliver를 써줬습니다!
submit_for_review: false - 업로드 후 심사까지 자동 제출automatic_release: false - 심사 통과 즉시 자동 출시skip_screenshots: true - 스크린샷 업로드 건너뜀skip_metadata: true - 앱 이름/설명 등 메타데이터 건너뜀일단 기본적인 설정은 다 끝난것도 같은데.. 하나 빼먹은게 있슴다.
fastlane에 대한 별도의 암호설정이 필요함다.
https://account.apple.com/account/manage 로 접속해서
앱 암호 선택

원하는 이름으로 생성 - 저의 경우는 fastlane으로 햇슴다.

생성된 암호 잘 저장하세요..!

FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD 등록
fastlane 폴더안에 .env를 만들어서 다음과 같이 저장을 해주면 됨다!

그래서 실행을 하려면
fastlane patch

한참을 기다리고 나니..

whatsNew 텍스트가 없단다..! 이제 이걸 잘 채워주면 될 것이다.
내가 지원하고 있는 언어별로 또 다 써줘야한다. 다음 포스팅엔 아마 이걸 Skills 같은거로 자동화해서 하면 괜찮지않을까? 싶다. 현재 브랜치의 최근 커밋을 읽어서 - 각국의 언어로 whats new를 추가하는... 그런 방향?
deliver(
submit_for_review: true,
automatic_release: true,
skip_screenshots: true,
skip_metadata: true,
release_notes: {
"ko" => "이제 설정 탭에서 햅틱 피드백을 켜거나 끌 수 있어요.",
"en-US" => "You can now turn haptic feedback on or off in the Settings tab.",
"en-GB" => "You can now turn haptic feedback on or off in the Settings tab.",
"en-AU" => "You can now turn haptic feedback on or off in the Settings tab.",
"en-CA" => "You can now turn haptic feedback on or off in the Settings tab.",
"ja" => "設定タブから触覚フィードバックのオン・オフを切り替えられるようになりました。",
"zh-Hans" => "现在可以在设置页面中开启或关闭触觉反馈。",
"zh-Hant" => "現在可以在設定頁面中開啟或關閉觸覺回饋。"
},
submission_information: {
export_compliance_uses_encryption: false
}
)
이렇게 했는데 왜 안되나해서보니까..제가 skip_metadata: true
설정을 켜놨어서 이게 스킵은 하라했는데, 스킵하니까 WhatsNew를 못읽어서 없다하는 희안한 상황이 이어졌고,, 결국 메타데이터 스킵 설정을 false로하고 돌려주니까 이제 심사에 등록이 되었다!!!


이렇게 AppStoreConnect에 접근하지않고도 배포를 할 수 있게 되었다.
근데 여전히 아쉬운 숙제는 남아있음다.
