[iOS]CI/CD Xcode Cloud 이슈 트래킹

힐링힐링·2024년 3월 28일
1

iOS

목록 보기
14/16
post-custom-banner

Xcode Cloud의 동작 원리

Xcode Cloud 빌드 방식은 해당 개발자가 git에 Push하면repo를 clone해서 사용자 설정에 따라 build 및 Archive하는 방식

이슈 트래킹

1. CI/CD Xcode Cloud에서 Pod 파일이 Build안되는 이슈

Pods파일을 확인 할수 없다고한다.

Unable to open base configuration reference file '/Volumes/workspace/repository/BookBridge/Pods/~~~'.

원인

Xcode Cloud 에서 외부 라이브러리인 Pod를 읽지 못하기에 따로 Cloud내에서 설치해줘야한다.

해결방법

Apple에서 제공하는 ci_post_clone.sh파일을 생성하여 brew로 pod를 설치해준다.
/ci_scripts/ci_post_clone.sh 경로가 완전 일치해야만 brew가 작동하니 주의하자

<.xcodeproj 경로>/ci_scripts/ci_post_clone.sh 생성

brew install cocoapods
pod install

참고문헌

https://forums.developer.apple.com/forums/thread/720137

https://developer.apple.com/documentation/xcode/making-dependencies-available-to-xcode-cloud#Use-a-custom-build-script-to-install-a-third-party-dependency-or-tool

https://stackoverflow.com/questions/74134200/xcode-cloud-unable-to-open-configuration-settings-file

2.CI/CD Xcode Cloud에서 Secrets.xcconfig 파일이 Build안되는 이슈

Secrets.xcconfig를 찾을수 없다고한다.

Unable to open base configuration reference file '/Volumes/workspace/reposit
okBridge/Secrets.xcconfig'

원인

원인은 Secrets.xcconfig 파일을 확인하지 못했다고 한다. 왜? 암호화때문에 ignore파일에 일부로 숨겼으니까 !

해결방법

그렇기 때문에 Secrets.xcconfig 파일 내용을 Xcode Cloude에 빌드하려는 workFlow 환경변수에 지정
ci_post_clone.sh 파일에서 해당 환경 변수를 토대로 루트를 지정
이렇게 되면 빌드할때 Secrets.xcconfig를 생성할것임

먼저, Secrets.xcconfig 파일 내용을 Xcode Cloude에 build하려는 workFlow 환경변수에 지정

ci_post_clone.sh 파일에서 해당 환경 변수를 토대로 루트를 지정 후 빌드

# Secrets.xcconfig 파일 생성
echo "환경변수 참조 Secrets.xcconfig file 생성시작"
# Secrets 경로 지정
cat <<EOF > "/Volumes/workspace/repository/BookBridge/Secrets.xcconfig"
// Naver API Keys
naverKeyId = $(naverKeyId)
naverKey = $(naverKey)

// Kakao API Key
KakaoAppKey = $(KakaoAppKey)

// Server URL
SERVER_URL = $(SERVER_URL)
EOF

echo "환경변수 참조 Secrets.xcconfig file 생성완료"

3.GoogleService-Info.plist 경로 못찾았다는 이슈

GoogleService-Info.plist 경로 못찾았다는 에러

 Build input file cannot be found: '/Volumes/workspace/repository/BookBridge/GoogleService-Info.plist'. Did you forget to declare this file as an output of a script phase or custom build rule which produces it?

원인

암호화해야되기에 ignore로 따로 관리하는 상태

해결방법

GoogleService-Info.plist 값들에대한 Environment추가 (VSCode로 열면 소스 코드 볼 수 있음)

ci_post_clone.sh 에 파일 GoogleService-Info.plist 생성문 작성

코드

# GoogleService-Info.plist 파일 생성
echo "환경변수 참조 GoogleService-Info.plist file 생성시작"

# Boolean 값 변환
convert_bool() {
    if [ "$1" == "true" ]; then
        echo "<true/>"
    else
        echo "<false/>"
    fi
}

cat <<EOF > "/Volumes/workspace/repository/BookBridge/GoogleService-Info.plist"
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CLIENT_ID</key>
    <string>$(CLIENT_ID)</string>
    <key>REVERSED_CLIENT_ID</key>
    <string>$(REVERSED_CLIENT_ID)</string>
    <key>API_KEY</key>
    <string>$(API_KEY)</string>
    <key>GCM_SENDER_ID</key>
    <string>$(GCM_SENDER_ID)</string>
    <key>PLIST_VERSION</key>
    <string>$(PLIST_VERSION)</string>
    <key>BUNDLE_ID</key>
    <string>$(BUNDLE_ID)</string>
    <key>PROJECT_ID</key>
    <string>$(PROJECT_ID)</string>
    <key>STORAGE_BUCKET</key>
    <string>$(STORAGE_BUCKET)</string>
    <key>IS_ADS_ENABLED</key>
    `convert_bool ${IS_ADS_ENABLED}`
    <key>IS_ANALYTICS_ENABLED</key>
    `convert_bool ${IS_ANALYTICS_ENABLED}`
    <key>IS_APPINVITE_ENABLED</key>
    `convert_bool ${IS_APPINVITE_ENABLED}`
    <key>IS_GCM_ENABLED</key>
    `convert_bool ${IS_GCM_ENABLED}`
    <key>IS_SIGNIN_ENABLED</key>
    `convert_bool ${IS_SIGNIN_ENABLED}`
    <key>GOOGLE_APP_ID</key>
    <string>$(GOOGLE_APP_ID)</string>
</dict>
</plist>
EOF
echo "환경변수 참조 GoogleService-Info.plist file 생성완료"

위에서 Value 값이 String이 아닌 bool타입은 따로 치환해서 연결해줘야한다.

4.이슈트래킹 전체 코드

  1. pod 파일 생성문
  2. Secrets.xcconfig 파일 생성문
  3. GoogleService-Info.plist 파일 생성문

#!/bin/sh

#  ci_post_clone.sh
#  BookBridge
#
#  Created by 김지훈 on 2024/03/28.

#  Xcode Cloud에 pod 파일 설치
brew install cocoapods
pod install

# Secrets.xcconfig 파일 생성
echo "환경변수 참조 Secrets.xcconfig file 생성시작"
# Secrets 경로 지정
cat <<EOF > "/Volumes/workspace/repository/BookBridge/Secrets.xcconfig"
// Naver API Keys
naverKeyId = $(naverKeyId)
naverKey = $(naverKey)

// Kakao API Key
KakaoAppKey = $(KakaoAppKey)

// Server URL
SERVER_URL = $(SERVER_URL)
EOF

echo "환경변수 참조 Secrets.xcconfig file 생성완료"

# GoogleService-Info.plist 파일 생성
echo "환경변수 참조 GoogleService-Info.plist file 생성시작"

# Boolean 값 변환
convert_bool() {
    if [ "$1" == "true" ]; then
        echo "<true/>"
    else
        echo "<false/>"
    fi
}

cat <<EOF > "/Volumes/workspace/repository/BookBridge/GoogleService-Info.plist"
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CLIENT_ID</key>
    <string>$(CLIENT_ID)</string>
    <key>REVERSED_CLIENT_ID</key>
    <string>$(REVERSED_CLIENT_ID)</string>
    <key>API_KEY</key>
    <string>$(API_KEY)</string>
    <key>GCM_SENDER_ID</key>
    <string>$(GCM_SENDER_ID)</string>
    <key>PLIST_VERSION</key>
    <string>$(PLIST_VERSION)</string>
    <key>BUNDLE_ID</key>
    <string>$(BUNDLE_ID)</string>
    <key>PROJECT_ID</key>
    <string>$(PROJECT_ID)</string>
    <key>STORAGE_BUCKET</key>
    <string>$(STORAGE_BUCKET)</string>
    <key>IS_ADS_ENABLED</key>
    `convert_bool ${IS_ADS_ENABLED}`
    <key>IS_ANALYTICS_ENABLED</key>
    `convert_bool ${IS_ANALYTICS_ENABLED}`
    <key>IS_APPINVITE_ENABLED</key>
    `convert_bool ${IS_APPINVITE_ENABLED}`
    <key>IS_GCM_ENABLED</key>
    `convert_bool ${IS_GCM_ENABLED}`
    <key>IS_SIGNIN_ENABLED</key>
    `convert_bool ${IS_SIGNIN_ENABLED}`
    <key>GOOGLE_APP_ID</key>
    <string>$(GOOGLE_APP_ID)</string>
</dict>
</plist>
EOF
echo "환경변수 참조 GoogleService-Info.plist file 생성완료"

마무리

git repo에 push하니 오류 없이 자동화 build모습이다.

보안상 암호화 xcconfig, .plist, .ignore 등을 이용했고,
CD과정에서 해당부분을 복호화 및 예외처리하지 못하여 오류가 난것이 핵심 원인다.
오늘도 한발자국 앞으로 나아간다.

profile
재밌겠네 ? 해봐야지 ~
post-custom-banner

0개의 댓글