본문 바로가기
CI와CD

[iOS] CI/CD 도입 Fastlane + AzureDevOps [1]

by 최지철 2024. 3. 19.
728x90
반응형

왜? CI / CD 를 도입할려고 했어요?

기존 앱 배포하는게 너무 귀찮은 과정이 많아서...
주위에서 CI/CD에 대한 말을 많이 들어서...
그리고.. 멋있어 보여서 ㅎ.ㅎ


기존 프로세스는 얼마나 귀찮은 과정을 거친걸까? ⏳

기존 배포(심사 요청) 과정

  1. 버전과 빌드버전을 올린다.
  2. 3인 이상의 개발자가 동시에 개발할 경우, 1년에 한번씩 프로파일과 인증서를 - 발급받고 공유한다.
  3. 테스트 코드 실행 (테스트 코드가 사실상 없지만 ㅎ.ㅎ 이제부터 도입하고 열심히 하려고 합니다)
  4. Analyze를 실행 -> 기다림 -> 완료
  5. Archive 실행 -> 기다림 -> 완료
  6. 앱스토어 커넥트 들어가서 릴리즈 정보 등 입력하고 심사 요청
  7. 심사 통과하면 스토어 출시

 

💻 fastlane 설치하기

brew install fastlane 명령어로 fastlane을 다운받아 줍니다.

gem install bundler 명령어로 fastlane을 업데이트 시켜주는 bundler도 다운받아 줍시다.

🚀 fastlane 시작하기

fastlane init

 

여기서 1,2,3,4나오는데 초기fastfile이기 때문에 아무거나 하셔도 됩니다. 전 2번으로 시작했습니다.

 

App Store 인증: Match를 이용한 환경변수 설정

iOS 앱 개발 및 배포를 위해서는 Certificate  Provisioning profile 이 필요합니다.

Provisioning profile  AppID 는 모두 동일하지만, 인증서 퍼블릭키  디바이스 정보 는 팀원 마다 각각 다른 값을 가지고 있습니다.
그렇다고 모든 개발자가 각각 배포 인증서  provisioning profile 을 발급 받게되면, 관리가 굉장히 번거롭고 동작도 제대로 하지 않는 경우가 빈번히 발생합니다. 또한 배포 인증서 는 발급받을 수 있는 개수의 한계가 있습니다.

fastlane  match 를 사용하게 되면 원격저장소에서 Certificate  Provisioning profile 를 저장하여 환경에 영향을 받지 않고 인증 을 받을 수 있게 됩니다. 

 

1 Step: remote repository 만들기

fastlane match init

프로젝트 루트 폴더에서 match init을 해서 match파일을 생성합니다

 

[✔] 🚀 
[12:21:30]: fastlane match supports multiple storage modes, please select the one you want to use:
1. git
2. google_cloud
3. s3
?  1

저흰 git을 사용하기 때문에 1번을 선택합니다.

 

 

프로젝트 폴더에 매치 파일이 생성되었을 겁니다.

git_url("https://github.com/ParkGyurim99/FastlaneCert")

storage_mode("git")

type("development") # The default type, can be: appstore, adhoc, enterprise or development

# app_identifier(["tools.fastlane.app", "tools.fastlane.app2"]) // 📌
# username("user@fastlane.tools") # Your Apple Developer Portal username // 📌

# For all available options run `fastlane match --help`
# Remove the # in the beginning of the line to enable the other options

# The docs are available on https://docs.fastlane.tools/actions/match

해당 Match파일에 각 정보에 맞는걸 수정해주시면 됩니다.

 

이제 원격저장소에 인증서를 생성합시다.

match 에 사용할 인증서를 생성하기 전에 기존의 인증서를 삭제 하는 것을 권장하고 있습니다.
인증서가 많아지면 관리가 불편해지고, 인증서의 개수에도 한계가 있기때문에 권장하고 있습니다. 

fastlane match nuke development
fastlane match nuke distribution

위의 2개의 명령어로 매치 인증서를 삭제 할 수 있습니다.

2 Step: match 인증서 만들기

fastlane match appstore

match 인증서 생성

이제 match가 깃허브 저장소에 있는 인증서를 로컬의 키체인으로 가져옵니다.

그 후 Xcode상에서도 오토 사이닝을 해체하고 match인증서로 선택해주셔야합니다! 이거 안하면 안돼용! 이거 찾느라 내다버린 내 시간...🥹

요거처럼!

App Store Connect 연결 및 AppFile 설정

TestFlight, 실제 앱스토어 배포에는 App Store Connect에 접근해야하는 작업에는 로그인이 반드시 필요합니다.

 

  1. App Store Connect API Key (추천)
    API Key를 발급받아 사용하는 방법.
  2. 이중 인증(2FA)
    키체인에 저장해두고 로그인하는 방식으로 세션이 만료되면 이중 인증을 해줘야함. 보통 아무 설정도 안하셨다면 이 방식으로 쓰고 계실 거예요.
  3. Application-specific passwords(앱 암호)
    저는 이거 입력하라는 메세지가 떠서 우선 입력해두긴 했어요. 이 방법도 괜찮은거 같지만 Fastlane에서 추천하는걸 쓰는게 좋을 것 같아요.

공식문서에서도 API Key를 추천하고 있고, 그리고 무엇보다도.. CI환경에서는 1번 밖에 불가능합니당!

 

1 Step: App Store Connect API Key 사용하기

  1. 키 생성
    App Store Connect에서 API Key를 발급 받습니다. 
    https://appstoreconnect.apple.com/access/users
  2. 생성된 키 다운로드(.p8)
    새로 고침을 하면 키를 다운받을 수 없으니 주의하세요.
  3. 다운받은 키를 프로젝트 폴더에 잘 저장해두십쇼. 나중에 CI환경에서 꺼내써야합니다.

2 Step: AppFile 설정

Fastlane폴더안에있는 Appfile에 알맞은 정보를 넣어주세요.

app_identifier("앱번들") # The bundle identifier of your app
apple_id("앱스토어 커넥트ID") # Your Apple Developer Portal username

itc_team_id("앱스토어 커넥트 팀 ID") # App Store Connect Team ID
team_id("팀아이디") # Developer Portal Team ID

# For more information about the Appfile, see:
#     https://docs.fastlane.tools/advanced/#appfile

 

 

FastFile 작성

platform :ios do

	desc "인증서 및 프로비저닝 프로파일 설치"
  lane :certificates do
    app_store_connect_api_key(
      key_id: "key_id 앱스토어 커넥트에서 확인가능 ",
      issuer_id: "issuer_id 앱스토어 커넥트에서 확인가능 ",
      key_filepath: "키체인 경로",
      in_house: false, # true if you're part of the Apple Developer Enterprise Program
    )
   match(
	readonly:"true",
	type: "appstore",
        keychain_name: "키체인 이름", # 여기에 원하는 키체인 이름을 지정
        keychain_password: "비밀번호") # 다른 개발자들과 match 인증서를 공유해야할 수 도 있기 때문에 추천
  end
  
    desc "베타테스트 TestFlight 빌드"
  lane :beta do
    certificates
    current_version = get_version_number(xcodeproj: "프로젝트명.xcodeproj")
    increment_build_number(
        build_number: latest_testflight_build_number + 1
    )    
    ENV["FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT"] = "120"
    build_app(
     scheme: "스키마명",
     export_method: "app-store",
     clean: "true"
    )

    upload_to_testflight(
      skip_waiting_for_build_processing: true
    )
    slack(
      username: "TestFlight", # 메시지 보내는 이의 이름 설정
      icon_url: "" # 사용하고 싶은 이미지 URL
      message: "",
      slack_url: "슬랙 웹 후크 URL"
    )
    end
end



이제 다음편에서 CI환경인 Azure DevOps 를 통해 최종적으로 CI/CD를 구축한걸 적겠습니다. 

728x90
반응형

'CI와CD' 카테고리의 다른 글

[iOS] CI/CD 도입 Fastlane + AzureDevOps [2]  (1) 2024.03.20
CI/CD 란 무엇일까?  (0) 2024.03.18