안녕하세요!! 개발하는 윤기사입니다!
저번 포스팅에서 fastlane을 이용해서 앱 배포 자동화를 구축을 했었는데,
이번 포스팅에서는 fastlane과 함께 자주 사용되는 (무료!) Jenkins을 이용한 CI/CD를 구축해보려고 합니다!
마지막에는 제가 겪었던 Trouble Shooting 내용도 공유해 드리니, 꼭 끝까지 읽어주셨으면 합니다!
아직 저번 포스팅을 안보신 분들이 계시다면 먼저 보고 와주세요. 😆
[iOS_Swift] Fastlane을 이용해 CI/CD를 구축해보자 - 1_42
안녕하세요! 개발하는 윤기사입니다! 이번 포스팅에서는 제가 Fastlane을 이용해 TestFlight와 FireBase-App-Distribution의 앱 배포 자동화를 구축을 했는데, 그 내용을 공유하고자 합니다! 여기서는 샘플
swiftyun.tistory.com
이번 Jenkins에 사용될 fastlane lane은 "upload" lane을 만들어 사용할 거고, 아래와 같이 fastfile이 생겼습니다!
저번 포스팅을 못 보신 분들을 위해서 위에 설명 주석까지 같이 남겨놨으니 가볍게 읽어보세요!! ^_^
# ✅ 기본 플랫폼을 ios 로 설정하여 fastlane [lane name] 으로 쉽게 실행가능.(원래 fastlane ios [lane name] 으로 실행해야 함)
default_platform(:ios)
platform :ios do
desc "Push a new beta build to TestFlight"
# ✅ lane 이름은 upload로 정의한다.
lane :upload do
# ✅ git에서 인증서를 관리하는 match 방식으로 인증할 때 사용하는 함수다.
# match(type: "appstore", force_for_new_devices: true)
# match(type: "appstore", readonly: true)
# ✅ Cert, Sigh 방식으로 인증할 때 사용하는 인증 함수다.
# ✅ get_certificates로 인증서를, get_provisioning_profile로 프로필을 가져온다.
get_certificates
get_provisioning_profile
# ✅ 자동으로 빌드 넘버를 증가
increment_build_number(
build_number: latest_testflight_build_number + 1
)
# ✅ 빌드할 프로젝트와 빌드 스키마 설정
build_app(
#workspace:
project: "InAppPurchase.xcodeproj",
scheme: "InAppPurchase",
)
# ✅ TestFlight 업로드
upload_to_testflight(
# ✅ 빌드를 업로드 후 처리 중인 상태를 기다리지 않겠다.
skip_waiting_for_build_processing: true
)
end
Jenkins이란 무엇인가...

- 오픈 소스 지속적 통합 서버를 의미합니다!
Jenkins는 가장 인기 있는 오픈 소스 CI/CD 도구 중 하나. > why? : 무료라서!!!
빌드, 테스트 및 배포 프로세스를 자동화할 수 있는 다양한 플러그인을 제공, 다양한 버전 제어 시스템, 빌드 도구 및 배포 플랫폼과의 통합을 지원합니다!
👀 Jenkins과 fastlane 통합 한눈에 보기
- Jenkins 서버 설정
- Jenkins 서버를 설치하고, 필요한 플러그인을 설치합니다.
- http://localhost:8080/에 접속합니다.
- Jenkins에서 Fastlane을 설치합니다.
- Fastlane 설정
- Fastlane을 설정합니다. fastlane init 명령어를 사용하여 Fastlane을 초기화하고, Fastfile을 생성합니다.
- Fastfile을 편집하여, Fastlane이 빌드, 테스트 및 배포를 자동화하는 방법을 정의합니다. (lane 정의)
- Jenkins와 Fastlane 연동
- Jenkins와 Fastlane을 연동합니다.
- Jenkins에서 빌드 및 배포 작업을 수행할 새로운 프로젝트를 생성합니다.
- Jenkins에서 Fastlane 스크립트를 실행하도록 빌드 및 배포 작업을 설정합니다.
- iOS 앱 빌드 및 배포
- Jenkins에서 빌드 및 배포 작업을 실행합니다.
- Jenkins는 Fastlane을 호출하여 iOS 앱을 빌드하고, 테스트하고, 배포합니다.
이렇게 크게 4가지 단계를 거치게 됩니다!
한 단계씩 차근차근 살펴보도록 할게요.
Jenkins 설치 & 서버 설정
- 터미널을 이용해서 Jenkins 설치와 실행을 해줍니다!
# Jenkins 설치
brew update && brew install jenkins-lts
# 실행
brew services start jenkins-lts
# 중지
brew services stop jenkins-lts
# 재시작
brew services restart jenkins-lts
# 삭제
brew remove jenkins-lts
성공적으로 설치와 실행을 마쳤다면, 플러그인들을 설치해 주고, 메인화면으로 넘어오게 됩니다.
좌측에 있는 "새로운 Item"을 클릭해줍니다!
그리곤 "Freestyle project"를 선택하고 프로젝트 명을 입력해 줍니다.

만들고 나면, General탭이 나올 텐데, 여기서 저희가 연결해주고 싶은 앱을 연결하면 됩니다!
저는 Github에서 프로젝트를 관리하고 있기 때문에, Github이랑 연결해 주겠습니다!
Github에 올라와있는 Repository 경로를 기입하면 됩니다.

살짝 밑으로 스크롤해서 내리시면, "소스 코드 관리" 탭이 보입니다.
Git을 선택해 주고, Repository URL과 Credentials를 추가해야 합니다.
Credentials 밑에 Add를 눌러줍니다!

Add Credentials에서 Username과 password를 이용한 추가를 할 건데, 아래와 같이 입력해 주면 됩니다.
- Username : Github userName
- Password : Github Access Token

여기까지가 완료입니다!!!
이제 마지막 Build Steps에서 맨 처음 작성했던 lane을 실행시켜 주면 됩니다! 😆

💣 Jenkins Trouble Shooting
1. fastlane: command not found

- DashBoard > Jenkins 관리 > System > Global properties > environment variables로 이동!!

- 터미널에서 echo $PATH 입력 > 경로 중에서 ~~/.fastlane/bin: 이후 경로를 복사.

- environment variables > 이름은 "PATH", 값은 "PATH=$PATH:복사한 경로"를 붙여 넣으면 완료!

2. userName을 찾을 수 없음. → 인증서를 git에서 관리하는 match 방식의 code signing 사용
3. invalid byte sequence in US-ASCII & fastlane requires your locale to be set to UTF-8

터미널에서 echo $SHELL 입력.
echo $SHELL
저 같은 경우는 /bin/zsh을 사용하고 있어 vi ~/. zshrc를 입력합니다.
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_CTYPE=en_US.UTF-8
그리고 위와 같이 입력합니다.

마지막으로, DashBoard > Jenkins 관리 > System > Global properties > environment variables에 아래와 같이 추가하면 완료가 됩니다!

이상 Fastlane & Jenkins을 이용한 CI/CD 구축에 대한 포스팅을 마치겠습니다 ^.^
'iOS_Swift 앱개발👍' 카테고리의 다른 글
[iOS_Swift] HealthKit - 헬스킷 : 운동 데이터 (With HKWorkout)_ 45 (0) | 2024.01.12 |
---|---|
[iOS_Swift] VIPER 디자인 패턴 _ 44 (2) | 2023.12.27 |
[iOS_Swift] Fastlane을 이용해 CI/CD를 구축해보자 - 1_42 (2) | 2023.11.22 |
[iOS_Swift] HealthKit - 헬스킷 : 수면 데이터 마스터 (With HKCategoryType)_ 41 (1) | 2023.11.13 |
[iOS_Swift] HealthKit - 헬스킷 : 걸음수, 칼로리, 심박수 다뤄보자! (With HKQuantityType)_ 40 (1) | 2023.11.08 |