Membangun, menguji, dan menyebarkan aplikasi Xcode

Layanan Azure DevOps | Azure DevOps Server 2022 - Azure DevOps Server 2019

Pelajari cara membangun dan menyebarkan proyek Xcode dengan Azure Pipelines.

Prasyarat

Membuat alur

  1. Masuk ke organisasi Azure DevOps Anda dan buka proyek Anda.

  2. Buka Alur, lalu pilih Alur baru atau Buat alur jika membuat alur pertama Anda.

  3. Lakukan langkah-langkah wizard dengan terlebih dahulu memilih GitHub sebagai lokasi kode sumber Anda.

  4. Anda dapat diarahkan ke GitHub untuk masuk. Jika demikian, masukkan informasi masuk GitHub Anda.

  5. Saat Anda melihat daftar repositori, pilih repositori Anda.

  6. Anda mungkin diarahkan ke GitHub untuk menginstal aplikasi Azure Pipelines. Jika demikian, pilih Setujui & instal.

Saat tab Konfigurasi muncul, pilih Xcode.

  1. Ketika alur baru Anda muncul, tinjau YAML untuk melihat tindakan yang dilakukannya. Saat Anda siap, pilih Simpan dan jalankan.

    Tombol Simpan dan jalankan di alur YAML baru

  2. Anda diminta untuk menerapkan file azure-pipelines.yml baru ke repositori Anda. Setelah Anda puas dengan pesan, pilih Simpan dan jalankan lagi.

    Jika Anda ingin menonton alur Anda beraksi, pilih pekerjaan build.

    Anda baru saja membuat dan menjalankan alur yang kami buat secara otomatis untuk Anda, karena kode Anda tampaknya cocok untuk templat Xcode .

    Anda sekarang memiliki alur YAML yang berfungsi (azure-pipelines.yml) di repositori Anda yang siap untuk Anda sesuaikan!

  3. Saat Anda siap untuk membuat perubahan pada alur Anda, pilih di halaman Alur , lalu Editazure-pipelines.yml file.

Lihat bagian di bawah ini untuk mempelajari beberapa cara yang lebih umum untuk menyesuaikan alur Anda.

Tip

Untuk membuat perubahan pada file YAML seperti yang dijelaskan dalam topik ini, pilih alur di halaman Alur , lalu pilih Edit untuk membuka editor file azure-pipelines.yml .

Membangun lingkungan

Anda dapat menggunakan Azure Pipelines untuk membangun aplikasi Anda dengan Xcode tanpa perlu menyiapkan infrastruktur anda sendiri. Xcode telah diinstal sebelumnya pada agen macOS yang dihosting Microsoft di Azure Pipelines. Anda dapat menggunakan agen macOS untuk menjalankan build Anda.

Untuk versi Xcode yang tepat yang telah diinstal sebelumnya, lihat agen yang dihosting Microsoft.

Buat file bernama azure-pipelines.yml di akar repositori Anda. Kemudian, tambahkan cuplikan berikut ke file Anda azure-pipelines.yml untuk memilih kumpulan agen yang sesuai:

# https://learn.microsoft.com/azure/devops/pipelines/ecosystems/xcode
pool:
  vmImage: 'macOS-latest'

Membuat aplikasi dengan Xcode

Untuk membuat aplikasi dengan Xcode, tambahkan cuplikan berikut ke file Anda azure-pipelines.yml . Ini adalah cuplikan minimal untuk membangun proyek iOS menggunakan skema defaultnya, untuk Simulator, dan tanpa kemasan. Ubah nilai agar sesuai dengan konfigurasi proyek Anda. Lihat tugas Xcode untuk informasi selengkapnya tentang opsi ini.

pool:
  vmImage: 'macos-latest'

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

Penandatanganan dan provisi

Aplikasi Xcode harus ditandatangani dan disediakan untuk dijalankan pada perangkat atau diterbitkan ke App Store. Proses penandatanganan dan provisi memerlukan akses ke sertifikat penandatanganan P12 Anda dan satu atau beberapa profil provisi. Tugas Instal Sertifikat Apple dan Instal Profil Provisi Apple membuatnya tersedia untuk Xcode selama build.

Lihat Menandatangani aplikasi seluler Anda untuk mempelajari selengkapnya.

Carthage

Jika proyek Anda menggunakan Carthage dengan repositori Carthage privat, Anda dapat menyiapkan autentikasi dengan mengatur variabel lingkungan bernama GITHUB_ACCESS_TOKEN dengan nilai token yang memiliki akses ke repositori. Carthage akan secara otomatis mendeteksi dan menggunakan variabel lingkungan ini.

Jangan tambahkan token rahasia langsung ke YAML alur Anda. Sebagai gantinya, buat variabel alur baru dengan kuncinya diaktifkan pada panel Variabel untuk mengenkripsi nilai ini. Lihat variabel rahasia.

Berikut adalah contoh yang menggunakan variabel rahasia bernama myGitHubAccessToken untuk nilai GITHUB_ACCESS_TOKEN variabel lingkungan.

- script: carthage update --platform iOS
  env:
    GITHUB_ACCESS_TOKEN: $(myGitHubAccessToken)

Pengujian pada perangkat yang dihosting Azure

Tambahkan tugas Uji App Center untuk menguji aplikasi di lab perangkat iOS dan Android yang dihosting. Uji coba gratis App Center diperlukan yang nantinya harus dikonversi menjadi berbayar.

Daftar dengan App Center terlebih dahulu.

# App Center test v1
# Test app packages with Visual Studio App Center.
- task: AppCenterTest@1
  inputs:
    appFile: # string. Alias: app. Required. Binary application file path. 
    artifactsDirectory: '$(Build.ArtifactStagingDirectory)/AppCenterTest' # string. Alias: artifactsDir. Required. Artifacts directory. Default: $(Build.ArtifactStagingDirectory)/AppCenterTest.
  # Prepare Tests
    #prepareTests: true # boolean. Alias: enablePrepare. Prepare tests. Default: true.
    frameworkOption: 'appium' # 'appium' | 'espresso' | 'calabash' | 'uitest' | 'xcuitest'. Alias: framework. Required when enablePrepare = true. Test framework. Default: appium.
    #appiumBuildDirectory: # string. Alias: appiumBuildDir. Required when enablePrepare = true && framework = appium. Build directory. 
    #espressoBuildDirectory: # string. Alias: espressoBuildDir. Optional. Use when enablePrepare = true && framework = espresso. Build directory. 
    #espressoTestApkFile: # string. Alias: espressoTestApkPath. Optional. Use when enablePrepare = true && framework = espresso. Test APK path. 
    #calabashProjectDirectory: # string. Alias: calabashProjectDir. Required when enablePrepare = true && framework = calabash. Project directory. 
    #calabashConfigFile: # string. Optional. Use when enablePrepare = true && framework = calabash. Cucumber config file. 
    #calabashProfile: # string. Optional. Use when enablePrepare = true && framework = calabash. Profile to run. 
    #calabashSkipConfigCheck: false # boolean. Optional. Use when enablePrepare = true && framework = calabash. Skip Configuration Check. Default: false.
    #uiTestBuildDirectory: # string. Alias: uitestBuildDir. Required when enablePrepare = true && framework = uitest. Build directory. 
    #uitestStorePath: # string. Optional. Use when enablePrepare = true && framework = uitest. Store file. 
    #uiTestStorePassword: # string. Alias: uitestStorePass. Optional. Use when enablePrepare = true && framework = uitest. Store password. 
    #uitestKeyAlias: # string. Optional. Use when enablePrepare = true && framework = uitest. Key alias. 
    #uiTestKeyPassword: # string. Alias: uitestKeyPass. Optional. Use when enablePrepare = true && framework = uitest. Key password. 
    #uiTestToolsDirectory: # string. Alias: uitestToolsDir. Optional. Use when enablePrepare = true && framework = uitest. Test tools directory. 
    #signInfo: # string. Optional. Use when framework = calabash || framework = uitest. Signing information. 
    #xcUITestBuildDirectory: # string. Alias: xcuitestBuildDir. Optional. Use when enablePrepare = true && framework = xcuitest. Build directory. 
    #xcUITestIpaFile: # string. Alias: xcuitestTestIpaPath. Optional. Use when enablePrepare = true && framework = xcuitest. Test IPA path. 
    #prepareOptions: # string. Alias: prepareOpts. Optional. Use when enablePrepare = true. Additional options. 
  # Run Tests
    #runTests: true # boolean. Alias: enableRun. Run tests. Default: true.
    credentialsOption: 'serviceEndpoint' # 'serviceEndpoint' | 'inputs'. Alias: credsType. Required when enableRun = true. Authentication method. Default: serviceEndpoint.
    #serverEndpoint: # string. Required when enableRun = true && credsType = serviceEndpoint. App Center service connection. 
    #username: # string. Required when enableRun = true && credsType = inputs. App Center username. 
    #password: # string. Required when enableRun = true && credsType = inputs. App Center password. 
    appSlug: # string. Required when enableRun = true. App slug. 
    devices: # string. Required when enableRun = true. Devices. 
    #series: 'master' # string. Optional. Use when enableRun = true. Test series. Default: master.
    #dsymDirectory: # string. Alias: dsymDir. Optional. Use when enableRun = true. dSYM directory. 
    localeOption: 'en_US' # 'da_DK' | 'nl_NL' | 'en_GB' | 'en_US' | 'fr_FR' | 'de_DE' | 'ja_JP' | 'ru_RU' | 'es_MX' | 'es_ES' | 'user'. Alias: locale. Required when enableRun = true. System language. Default: en_US.
    #userDefinedLocale: # string. Optional. Use when enableRun = true && locale = user. Other locale. 
    #loginOptions: # string. Alias: loginOpts. Optional. Use when enableRun = true && credsType = inputs. Additional options for login. 
    #runOptions: # string. Alias: runOpts. Optional. Use when enableRun = true. Additional options for run. 
    #skipWaitingForResults: false # boolean. Alias: async. Optional. Use when enableRun = true. Do not wait for test result. Default: false.
  # Advanced
    #cliFile: # string. Alias: cliLocationOverride. App Center CLI location. 
    #showDebugOutput: false # boolean. Alias: debug. Enable debug output. Default: false.

Pertahankan artefak dengan rekaman build

Tambahkan tugas Salin File dan Terbitkan Artefak Build untuk menyimpan IPA Anda dengan catatan build atau uji dan sebarkan di alur berikutnya. Lihat Artefak.

- task: CopyFiles@2
  inputs:
    contents: '**/*.ipa'
    targetFolder: '$(build.artifactStagingDirectory)'
- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)'
    ArtifactName: 'drop'
    publishLocation: 'Container'

Sebarkan

Pusat Aplikasi

Tambahkan tugas Distribusi App Center untuk mendistribusikan aplikasi ke sekelompok penguji atau pengguna beta, atau promosikan aplikasi ke Intune atau Apple App Store. Akun App Center gratis diperlukan (tidak diperlukan pembayaran).

# App Center distribute v3
# Distribute app builds to testers and users via Visual Studio App Center.
- task: AppCenterDistribute@3
  inputs:
    serverEndpoint: # string. Required. App Center service connection. 
    appSlug: # string. Required. App slug. 
    appFile: # string. Alias: app. Required. Binary file path. 
    #buildVersion: # string. Build version. 
    releaseNotesOption: 'input' # 'input' | 'file'. Alias: releaseNotesSelection. Required. Create release notes. Default: input.
    releaseNotesInput: # string. Required when releaseNotesSelection = input. Release notes. 
    #releaseNotesFile: # string. Required when releaseNotesSelection = file. Release notes file. 
    #isMandatory: false # boolean. Require users to update to this release. Default: false.
    destinationType: 'groups' # 'groups' | 'store'. Required. Release destination. Default: groups.
    #distributionGroupId: # string. Alias: destinationGroupIds. Optional. Use when destinationType = groups. Destination IDs. 
    #destinationStoreId: # string. Required when destinationType = store. Destination ID. 
    #isSilent: # boolean. Optional. Use when destinationType = groups. Do not notify testers. Release will still be available to install. 
  # Symbols
    #symbolsOption: 'Apple' # 'Apple' | 'Android' | 'UWP'. Alias: symbolsType. Symbols type. Default: Apple.
    #symbolsPath: # string. Optional. Use when symbolsType == AndroidNative || symbolsType = Windows. Symbols path. 
    #appxsymPath: # string. Optional. Use when symbolsType = UWP. Symbols path (*.appxsym). 
    #symbolsDsymFiles: # string. Alias: dsymPath. Optional. Use when symbolsType = Apple. dSYM path. 
    #symbolsMappingTxtFile: # string. Alias: mappingTxtPath. Optional. Use when symbolsType = Android. Mapping file. 
    #nativeLibrariesPath: # string. Optional. Use when symbolsType == Android. Native Library File Path. 
    #symbolsIncludeParentDirectory: # boolean. Alias: packParentFolder. Optional. Use when symbolsType = Apple. Include all items in parent folder.

Apple App Store

Instal ekstensi Apple App Store dan gunakan tugas berikut untuk mengotomatiskan interaksi dengan App Store. Secara default, tugas-tugas ini mengautentikasi ke Apple menggunakan koneksi layanan yang Anda konfigurasikan.

Lepaskan

Tambahkan tugas Rilis App Store untuk mengotomatiskan rilis pembaruan ke aplikasi beta TestFlight iOS atau aplikasi produksi yang ada di App Store.

Lihat batasan penggunaan tugas ini dengan autentikasi dua faktor Apple, karena autentikasi Apple khusus wilayah dan token sesi fastlane kedaluwarsa dengan cepat dan harus dibuat ulang dan dikonfigurasi ulang.

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

Promosikan

Tambahkan tugas Promosi App Store untuk mengotomatiskan promosi aplikasi yang dikirim sebelumnya dari iTunes Koneksi ke App Store.

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