Xcode Cloud 빌드 방식은 해당 개발자가 git에 Push하면repo를 clone해서 사용자 설정에 따라 build 및 Archive하는 방식
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://stackoverflow.com/questions/74134200/xcode-cloud-unable-to-open-configuration-settings-file
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 생성완료"
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타입은 따로 치환해서 연결해줘야한다.
#!/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과정에서 해당부분을 복호화 및 예외처리하지 못하여 오류가 난것이 핵심 원인다.
오늘도 한발자국 앞으로 나아간다.