본문 바로가기

Programming/iOS

iOS 서버별 자동배포 환경 구축 방법

반응형

Xcode + Jenkins 설정을 통해 각 서버별로 자동배포 가능하도록 구축하는 방법입니다.

코드 수정 없이 각 서버 및 조건 별로 배포가능 하도록 환경설정 하는 방법에 대해서 기술합니다.
아래 내용에서는 QA용 배포 환경 설정을 추가하는 방법을 기준으로 설명하도록 하겠습니다.

Xcode설정

Xcode에서 각 서버별로 배포가능 하도록 환경 설정을 해줘야합니다.

Build Configurations 설정

Project > Info에 가면 Configurations 항목이 있습니다.
(기본 환경 설정은 Debug와 Release입니다.)

여기서 +버튼을 눌러 Duplicate 하면 되는데요, 어떤 환경설정을 Base로 생성할 것인지 선택하면 됩니다.
(Debug 기준으로 할지 Release기준으로 할지)

여기서는 Release기준으로 Duplicate하도록 하겠습니다.

아래와 같이 QA 환경이 생성된 걸 확인 하실 수 있습니다.

Target에의 Build Settings에 가보면 역시 QA 환경이 추가된 걸 확인 하실 수 있고요, 환경은 Release와 동일하게 구성돼 있는 것도 확인 가능합니다.

각 환경별로 서버 지정

Xcode > Targets의 Build Settings에 각 서버 도메인을 기록해 둡니다.
서버 도메인이라는 필드는 기존 설정값에는 존재하지 않는 값 이기 때문에,
환경설정을 새로 추가하도록 하겠습니다.

 

그러면 User-Defined 영역에 NEW_SETTING라는 이름으로 생성이 됩니다.

여기에 원하는 필드이름과 각 서버별로 지정할 도메인을 지정하면 됩니다.

Info.plist에 설정한 환경설정 값 연동

위의 Build Settings에서 각 서버별로 값을 입력했더라도, 바로 코드에서 이 값들을 불러올 수는 없습니다.
해당 값을 불러오기 위해서는 Info.plist에 연동해야 가능합니다.

Info.plist에서 환경설정 값을 설정합니다.

여기서는 AppDomain이라는 Dictionary를 만든 후 그 하위에 ServerURL을 추가했습니다.

이제 *.swift 코드에서 각 환경별로 서버 설정 값을 불러올 수 있게 됐습니다.

// 서버 도메인
var serverDomain: String {
    if let info = Bundle.main.infoDictionary,
      let debug = info["AppDomain"] as? [String: Any], let serverURL = debug["ServerURL"] as? String {
        return serverURL
    }
 
    return "https://product.test.co.kr"
}

 

예를 들어 아래처럼 코드를 작성 할 수 있습니다…

// MARK: - NetworkConfig
final class NetworkConfig {
    enum NetworkHost: String {
        case dev
        case qa
        case product
    }
     
    static let shared = NetworkConfig()
     
    private init() {}
     
    // MARK: - Instance Properties
    var host: NetworkHost {
        if serverDomain.contains(NetworkHost.dev.rawValue) {
            return NetworkHost.dev
        } else if serverDomain.contains(NetworkHost.qa.rawValue) {
            return NetworkHost.qa
        }
         
        return NetworkHost.product
    }
     
    // 서버 도메인
    var serverDomain: String {
        if let info = Bundle.main.infoDictionary,
          let debug = info["AppDomain"] as? [String: Any], let serverURL = debug["ServerURL"] as? String {
 
            return serverURL
        }
 
        return "https://product.test.co.kr"
    }
}

 

Jenkins설정

그럼 Xcode에서 설정한 값을 어떻게 Jenkins에서 활용 가능한지 확인 하도록 하겠습니다.

Command-line 빌드 시

command-line 빌드 시 어떤 환경에서 빌드 할지를 선택할 수가 있는데, 이때 위에 설정한 (Debug | QA | Release)등을 선택해서 빌드하면 됩니다.

-configuration ${BUILD_CONFIGURATION} // Debug|QA|Release 중 선택

...
xcodebuild clean -project XcodeNetworkConfigSample.xcodeproj -configuration ${BUILD_CONFIGURATION} -scheme XcodeNetworkConfigSample
xcodebuild archive -project XcodeNetworkConfigSample.xcodeproj -configuration ${BUILD_CONFIGURATION} -scheme XcodeNetworkConfigSample -archivePath /XcodeNetworkConfigSample.xcarchive
...

Jenkins 환경설정

Jenkins의 구성에서 매개변수 설정

Execute Sell에서 실행 Command에 매개변수 값을 인자로 전달

빌드

위의 매개변수 설정까지 마쳤으면 각 서버별 배포를 위한 모든 환경설정이 끝났습니다.
이제, 각 서버별로 배포 가능한 상태가 됐습니다.

서버 설정 뿐 아니라 앱에 필요한(예를 들어 출력 로그레벨, Debug모드 활성화 여부 등) 환경설정을 미리 설정 후 배포시에 이를 결정하는 방식으로 활용가능 합니다.

반응형

'Programming > iOS' 카테고리의 다른 글

iOS command build script  (0) 2019.12.10
Observer Pattern in Swift  (0) 2019.12.10
UICollectionView Custom Animation  (0) 2019.12.10
Visual Attributed String(UILabel에 색상 지정)  (0) 2016.06.09
Tomcat+Jenkins+SonarQube for OSX  (0) 2016.06.02