IOS/iOS

Tuist 프로젝트 Xcode Cloud 적용(feat. Environment Variable, Tuist, cocoaPods, dSYM upload, App Distribution)

# 프로젝트 기본 구조

본론에 들어가기전에 레저에빠지다 프로젝트 구조에 대해서 간단히 말씀드리면, 현재 저희는 Tuist를 이용해 프로젝트파일을 관리하고 있고, SPMCarthage를 쓰면 module을 찾을수 없다는 에러를 계속 마주하게되어 온몸을 비틀고 에러를 해결해보다가 일단은 cocoaPods를 이용해 외부의존성을 컨트롤 하고있습니다

따라서 프로젝트파일을 구성하게 되는 순서는

1. tuist generate -n
2. pod install

 

위와 같이 터미널에서 진행되고, 하나하나씩 기다렸다가 실행하기는 번거롭기 때문에 makefile을 이용해서 make generate라는 명령어를 통해

tuist generate -n
pod install
open appName.xcworkspace

위와같이 실행하고 있습니다

 

# Xcode Cloud Work Flow & Environment Variable

현재 사용중인 워크플로우는 두가지 입니다.
심사전 TestFlight에 올릴용도 한개, 테스트 진행시 App Distribution으로 배포되는 용도로 한개
Workflow생성시 환경변수를 설정하는 곳이 있는데 자료들을 찾아보면 firebase app distribution업로드시 token을 발급받아야 하기 때문에 거기에 tokensecret으로 설정해서 넣어라 하는데 저는 그렇게 하니까 script에서 Warning Deprecate 메시지가 떠서 검색 후 다르게 진행했습니다.
Environment Variable 설정은 간단하기 때문에 사진과 함께 간단히 말씀드리고 넘어가겠습니다

위와같이 원하는 변수를 넣고 로그에 노출되지 않아야 하는 값이면 Secret을 체크합니다 
script에서 사용시 $TESTER_GROUP 이런식으로 작성하면 해당값을 가져옵니다

 

# Xcode Cloud Custom Script(ci_post_clone.sh, ci_post_xcodebuild.sh)

먼저 프로젝트 root 디렉토리에 ci_scripts 폴더를 생성합니다

# ci_post_clone.sh

#!/bin/sh

//코코아팟 설치를 진행합니다
echo ">>> INSTALL DEPENDENCIES"
brew install cocoapods
 
//상위폴더로 가는 명령어 입니다 빼먹으시면 에러납니다
cd ..

echo "tuist... start"
// 이 명령어는 xcode cloud에서 실행되기전에 사용자의 맥에서 tuist bundle명령어를 통해
// .tuist-bin 파일이 생성되고 깃에 올라가 있어야 사용가능합니다
// 이렇게하면 tuist install 없이 generate 명령어를 사용가능합니다
tuist bundle

echo "tuist generate..."
.tuist-bin/tuist generate

echo "pod install..."
pod install

위의 스크립트에서 가장 중요한 부분은 로컬에서 tuist bundle 명령어를 실행하고 깃에 올려 ci에서 돌아갈때도 tuist install 없이 명령이 동작하도록 환경을 조성해주어야 한다는 부분입니다

 

# ci_post_xcodebuild.sh 

#!/bin/sh
//이 부분은 workflow 분기하는 부분입니다 주의할점은 ==이 아니라 = 이라는 점 입니다
if [ "$CI_WORKFLOW" = "AutoAppDistribution" ]; then
    echo "Develop Version: #$CI_BUILD_NUMBER"
    echo "Uploading Firebase App Distribution"
    //아래 세줄은 변수에 이름과 아이디를 담는 부분입니다 안담고 바로 사용하셔도 무방합니다
    appname="myAppName.ipa"
    appid="myAppFirebaseAppID"

	//이 부분은 따로 아래에서 설명하겠습니다
    unzip firebase-tools-macos.zip
    chmod +x ./firebase-tools-macos
    
    //아까 잠깐 Token Deprecate경고 메시지에서 이야기한게 이 부분입니다
    export GOOGLE_APPLICATION_CREDENTIALS="service-account-key.json"  # 서비스 계정 키 파일 경로 설정

    chmod +x "$CI_AD_HOC_SIGNED_APP_PATH/$appname"
    ./firebase-tools-macos appdistribution:distribute "$CI_AD_HOC_SIGNED_APP_PATH/$appname" --app $appid --release-notes "Develop Version: #$CI_BUILD_NUMBER" --groups $TESTER_GROUP
fi

echo "dSYM 파일 업로드"
cd ..
./Pods/FirebaseCrashlytics/upload-symbols -gsp ./reference/GoogleService-Info-Develop.plist -p ios $CI_ARCHIVE_PATH/dSYMs

# firebase-tools-macos

  • 하면서 가장 이해가 안됫던 부분입니다.
  • 여기서 --token관련해서 firebase cli를 통해 발급받는 부분이 원래 있는데 위에 언급한것처럼 다르게 해결해서 그냥 cli파일받고 압축하기만 하면 됩니다 GOOGLE_APPLICATION_CREDENTIALS 부분을 참고해주세요
  • 해당 부분은 https://dy-yb.github.io/2023/AppDistribution/ 이분의 글을 많이 참고했습니다
  • 압축하고 용량이 대략 40MB 50MB정되 되는데 위에서 보여드린 사진과 같이 압축하고 ci_scripts 폴더안에 넣어주시면 됩니다

 

# firebase appid & App Distribution & Tester 설정

1. 녹색으로 표시된 부분 바로 아래에 나와있는 앱 ID 부분이 ID 입니다

2. Distribution은 별거 없이 위에 코드를 잘 붙여넣으셨으면 잘 작동하게 되어있습니다

  • 유의하실점은 ipa추출되고 앱 이름이 어떻게 되어있는지 꼭! 확인하시고 해야합니다. 
  • 그리고만약 ipa가 한글을 포함하고 있다면 upload가 되지 않으니 영어로 바꾸시고 진행해야합니다
    • 이거때문에 아스키코드변환 utf8인코딩 등등 시도해보았으나 결과적으로 시간만 날리고 실패했습니다
    • 저는 그래서 ipa추출을 TargetName으로 전환하였고 info.plist에 CFBundleDisplayName을 설정해서 한글이름이 앱설치시 적용되도록 하였습니다

3. Tester 설정은 한가지 유의하실 점이 있는데 이미지에 나와있는데로 물음표 옆에 나와있는 이름을 사용하셔야 오류가 나지 않습니다

  • --release-notes "Develop Version: #$CI_BUILD_NUMBER" 이부분은 출시노트에 추가되는 부분인데 자유롭게 수정하셔도 괜찮습니다

 

# GOOGLE_APPLICATION_CREDENTIALS

1. 링크 이동후에 오른쪽위에 콘솔 버튼을 클릭합니다

2. 이동하고 가운데 상단 검색을 활성화 시키면 3번째에 IAM 및 관리자가 나옵니다 안나오면 검색하셔야 되요

3. 왼쪽 상단에서 서비스 계정을 탭합니다

4. + 서비스계정 만들기 버튼을 탭합니다

5. 크게 의미 없기때문에 원하시는 걸로 아무렇게나 해도 상관없습니다

6. 역할에 다음의 역할을 추가하고 확인을 누릅니다 2개 모두 추가해주세요
추가하시고 완료를 누르시면 됩니다

7. 생성된 계정 오른쪽을 보시면 작업항목을 누르시고 키 관리 를 누르세요

8. 키 추가 버튼을 활성화 시키면 새 키 만들기 항목이 보이는데 탭하시면 됩니다

9. JSON 파일로 받으시면 됩니다

10. 받으신 파일을 ci_scripts 폴더에 넣으시고 파일이름을 service-account-key.json 라고 설정하시면 됩니다

 

참고한 링크는 다음과 같습니다

- xcode cloud에서 프로젝트 의존성 구성
https://developer.apple.com/documentation/xcode/making-dependencies-available-to-xcode-cloud
- xcode cloud custom script에서 사용가능한 환경변수 목록 및 설명
https://developer.apple.com/documentation/xcode/environment-variable-reference
- Custom Build Script를 작성하는 방법 소개
https://developer.apple.com/documentation/xcode/writing-custom-build-scripts
- firebase cli 파일관련 참고
https://dy-yb.github.io/2023/AppDistribution/