다음을 통해 공유


Xcode 앱 빌드, 테스트 및 배포

Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022 | Azure DevOps Server 2020

이 문서에서는 Azure Pipelines에서 YAML 파이프라인을 사용하여 Xcode 프로젝트를 빌드하고 배포하는 방법을 보여 줍니다.

필수 조건

  • 파이프라인을 만들고 앱을 배포할 수 있는 권한이 있는 Azure DevOps 조직 및 프로젝트입니다.
  • GitHub 리포지토리의 Xcode 9+ 프로젝트 및 앱입니다. 자세한 내용은 앱에 대한 Xcode 프로젝트 만들기를 참조 하세요.

파이프라인 만들기

중요

GitHub 프로시저 중에 GitHub 서비스 연결을 만들거나 GitHub로 리디렉션되어 로그인, Azure Pipelines 설치 또는 Azure Pipelines 권한을 부여하라는 메시지가 표시될 수 있습니다. 화면의 지침에 따라 프로세스를 완료합니다. 자세한 내용은 GitHub 리포지토리에 대한 액세스를 참조 하세요.

  1. Azure DevOps 프로젝트에서 파이프라인 새 파이프라인을선택하거나>이 프로젝트의 첫 번째 파이프라인인 경우 파이프라인 만들기를 선택합니다.
  2. 소스 코드의 위치로 GitHub를 선택합니다.
  3. 리포지토리 선택 화면에서 Xcode 프로젝트의 리포지토리를 선택합니다.
  4. 파이프라인 구성 화면에서 Xcode를 선택합니다.

Azure Pipelines는 Xcode 템플릿을 기반으로 하는 시작 파이프라인을 제공합니다. azure-pipelines.yml 코드를 검토합니다.

빌드 환경

Xcode는 Azure PipelinesMicrosoft 호스팅 macOS 에이전트에 미리 설치되므로 인프라를 설정할 필요가 없습니다. 사전 설치된 정확한 Xcode 버전은 Microsoft 호스팅 에이전트 소프트웨어를 참조하세요.

pool azure-pipelines.yml 파일의 맨 위에 있는 노드가 적절한 에이전트 풀을 선택합니다.

pool:
  vmImage: 'macOS-latest'

Xcode 빌드 작업

Xcode 작업은 macOS에서 Xcode 작업 영역을 빌드, 테스트 또는 보관하며 필요에 따라 앱을 패키지할 수 있습니다. 시작용 azure-pipelines.yml 파일의 Xcode 단계는 기본 구성표를 이용하여, 시뮬레이터용으로, 패키징 없이 iOS 프로젝트를 빌드합니다. 값을 변경하고 프로젝트 구성과 일치하도록 매개 변수를 추가할 수 있습니다.

개발 빌드:

steps:
- task: Xcode@5
  inputs:
    actions: 'build'
    scheme: ''
    sdk: 'iphonesimulator'
    configuration: 'Debug'
    xcWorkspacePath: '**/*.xcodeproj/project.xcworkspace'
    xcodeVersion: 'default' # Options: 10, 11, 12, 13, 14, default, specifyPath

App Store용 프로덕션 빌드:

프로덕션 릴리스의 경우 명시적 Xcode 버전, 앱의 스키마 및 릴리스 구성을 지정합니다.

steps:
- task: Xcode@5
  inputs:
    actions: 'build'
    scheme: 'YourAppScheme'
    sdk: 'iphoneos'
    configuration: 'Release'
    xcWorkspacePath: '**/*.xcodeproj/project.xcworkspace'
    xcodeVersion: '14'
    packageApp: true
    exportPath: '$(build.artifactStagingDirectory)'
    exportOptions: 'automatic'

프로덕션의 주요 차이점:

  • xcodeVersion: 일관되고 재현 가능한 빌드 대신 '14' 고정 버전(예: 'default')을 지정합니다.
  • scheme: 빈 문자열을 앱의 실제 스키마 이름으로 바꿉니다.
  • sdk: 디바이스 빌드에 사용 'iphoneos' 되며 시뮬레이터 빌드에 사용합니다 'iphonesimulator' .
  • 구성: 프로덕션에 사용 'Release' , 개발에 사용합니다 'Debug' .
  • packageApp: 배포할 파일을 생성 true 하도록 .ipa 설정합니다.
  • exportPath: 아티팩트 게시를 위해 패키지 출력을 빌드 준비 디렉터리로 전달합니다.

파이프라인 저장 및 실행

azure-pipelines.yml 코드 검토를 마치면 저장을 선택하고 실행합니다.

새 YAML 파이프라인의 저장 및 실행 단추 스크린샷

필요에 따라 커밋 메시지를 편집하고 설명을 제공합니다. 그런 다음 저장을 선택하고 다시 실행하여 azure-pipelines.yml 파일을 리포지토리에 커밋하고 빌드를 시작합니다.

빌드 실행 페이지에는 빌드 세부 정보 및 진행률이 표시됩니다. 파이프라인의 작동을 확인하려면 페이지 아래쪽에서 작업을 선택합니다.

이제 사용자 지정할 준비가 된 리포지토리에 작동하는 YAML 파이프라인 (azure-pipelines.yml)이 있습니다.

파이프라인 사용자 지정

파이프라인을 변경하려면 파이프라인 페이지에서 편집을 선택합니다. 다음 섹션에서는 특정 요구 사항에 따라 Xcode 파이프라인을 사용자 지정하는 몇 가지 일반적인 방법을 설명합니다.

  • 서명 및 프로비전: 물리적 디바이스 또는 App Store에 배포하는 데 필요합니다.
  • 종속성 관리: 프라이빗 리포지토리에 대한 인증을 구성합니다.
  • 아티팩트 관리: 테스트 및 배포를 위한 빌드 출력을 저장합니다.
  • 분포: TestFlight 또는 App Store에 대한 릴리스를 자동화합니다.

서명 및 프로비저닝 작업 추가

물리적 디바이스에서 Xcode 앱을 실행하거나 앱 스토어에 게시하려면 앱에 서명하고 프로비전해야 합니다. 이 프로세스에는 P12 서명 인증서(앱의 ID를 확인하는 보안 자격 증명) 및 프로비전 프로필(특정 디바이스 또는 배포에 대해 앱에 권한을 부여)을 사용하는 작업이 포함됩니다. 자세한 내용은 모바일 앱 서명을 참조하세요.

빌드하는 동안 Xcode에서 인증서 및 프로필을 사용할 수 있도록 하려면 Apple 인증서 설치 및 Apple 프로비저닝 프로필 설치 작업을 파이프라인에 추가합니다.

종속성 관리

Xcode 프로젝트는 종속성 관리자를 사용하여 타사 라이브러리 및 프레임워크를 처리할 수 있습니다. 다음 섹션에서는 다른 종속성 관리자를 사용하여 프라이빗 리포지토리에 대한 인증을 구성하는 방법을 설명합니다.

Swift 패키지 관리자

SPM(Swift Package Manager)은 Apple의 기본 종속성 관리자이며 Xcode에 직접 통합됩니다. 프라이빗 패키지와 함께 SPM을 사용하는 프로젝트의 경우 Git 인증을 구성해야 합니다.

프라이빗 Swift 패키지가 GitHub에서 호스트되는 경우 리포지토리에 대한 액세스 권한이 있는 개인 액세스 토큰 값으로 명명된 GITHUB_ACCESS_TOKEN 환경 변수를 사용하여 인증을 설정합니다.

이 작업은 소스 코드에 노출되므로 비밀 토큰을 파이프라인 YAML에 직접 추가하지 마세요. 자세한 내용은 비밀 변수 설정을 참조 하세요.

다음 파이프라인 코드는 Swift 패키지 종속성을 확인할 때 인증에 명명된 myGitHubAccessToken 비밀 변수를 사용합니다.

- task: Xcode@5
  inputs:
    actions: 'build'
    scheme: ''
    sdk: 'iphoneos'
    configuration: 'Release'
    xcWorkspacePath: '**/*.xcodeproj/project.xcworkspace'
  env:
    GITHUB_ACCESS_TOKEN: $(myGitHubAccessToken)

Azure Repos 또는 다른 Git 공급자에서 호스트되는 프라이빗 패키지의 경우 빌드 단계 전에 적절한 Git 자격 증명을 구성합니다.

코코아팟

프로젝트에서 CocoaPods를 사용하는 경우 CocoaPods 작업을 사용하여 종속성을 설치합니다.

- task: CocoaPods@0
  inputs:
    workingDirectory: '$(System.DefaultWorkingDirectory)'
    forceRepo: false

카르타고

프로젝트에서 프라이빗 Carthage 리포지토리와 함께 Carthage(iOS/macOS 프로젝트의 종속성 관리자)를 사용하는 경우 리포지토리에 액세스할 수 있는 토큰 값으로 명명된 GITHUB_ACCESS_TOKEN 환경 변수를 사용하여 인증을 설정합니다. Carthage는 이 환경 변수를 자동으로 감지하고 사용합니다.

이 작업은 소스 코드에 노출되므로 비밀 토큰을 파이프라인 YAML에 직접 추가하지 마세요. 자세한 내용은 비밀 변수 설정을 참조 하세요.

다음 파이프라인 코드는 환경 변수의 값에 명명된 myGitHubAccessToken 비밀 변수를 GITHUB_ACCESS_TOKEN 사용합니다.

- script: carthage update --platform iOS
  displayName: 'Update Carthage dependencies'
  env:
    GITHUB_ACCESS_TOKEN: $(myGitHubAccessToken)

Azure 호스팅 디바이스에서 테스트

Visual Studio App Center는 2025년 3월 31일에 사용 중지되었습니다. 권장되는 대안에 대해 알아봅니다.

빌드 레코드를 사용하여 아티팩트 유지

iOS AppStore 패키지(IPA) 파일을 빌드 레코드와 함께 저장하거나 테스트하여 후속 파이프라인에 배포하려면 파일 복사파이프라인 아티팩트 게시 작업을 파이프라인에 추가합니다.

- task: CopyFiles@2
  inputs:
    contents: '**/*.ipa'
    targetFolder: '$(build.artifactStagingDirectory)'
- task: PublishPipelineArtifact@1
  inputs:
    targetPath: '$(build.artifactStagingDirectory)'
    artifact: 'drop'

Apple App Store 또는 TestFlight에 배포

테스터 또는 베타 사용자에게 앱을 배포하려면 Apple의 TestFlight를 사용하거나 App Store에 직접 배포합니다. Apple App Store 배포는 아래 섹션을 참조하세요.

베타 테스트 및 사용자 피드백의 경우 다음을 사용하는 것이 좋습니다.

Apple App Store 확장 설치 및 Apple App Store에 배포

Apple App Store와의 상호 작용을 자동화하려면 Apple App Store 확장을 설치한 다음 파이프라인에서 다음 작업을 사용합니다. 기본적으로 이러한 작업은 구성해야 하는 서비스 연결을 사용하여 Apple에 인증됩니다.

App Store에서 기존 iOS TestFlight 베타 앱 또는 프로덕션 앱에 대한 업데이트 릴리스를 자동화하려면 App Store 릴리스 작업을 추가합니다.

Apple 2단계 인증에서 이 작업을 사용할 때는 제한 사항이 있습니다. Apple 인증은 지역별 인증이며, Fastlane 세션 토큰(Apple 인증에 사용되는 임시 자격 증명)은 빠르게 만료되며 정기적으로 다시 만들고 다시 구성해야 합니다.

- task: AppStoreRelease@1
  displayName: 'Publish to the App Store TestFlight track'
  inputs:
    serviceEndpoint: 'My Apple App Store service connection' 
    appIdentifier: com.yourorganization.testapplication.etc
    ipaPath: '$(build.artifactstagingdirectory)/**/*.ipa'
    shouldSkipWaitingForProcessing: true
    shouldSkipSubmission: true

iTunes Connect에서 App Store로 이전에 제출된 앱의 승격을 자동화하려면 App Store 승격 작업을 추가합니다.

- task: AppStorePromote@1
  displayName: 'Submit to the App Store for review'
  inputs:
    serviceEndpoint: 'My Apple App Store service connection'
    appIdentifier: com.yourorganization.testapplication.etc
    shouldAutoRelease: false