Создание, тестирование и развертывание приложений Xcode
Azure DevOps Services | Azure DevOps Server 2022 — Azure DevOps Server 2019
Узнайте, как создавать и развертывать проекты Xcode с помощью Azure Pipelines.
Необходимые компоненты
- Проект Xcode 9+ в репозитории GitHub. Если у вас нет проекта, см. статью "Создание проекта Xcode для приложения"
Создание конвейера
Войдите в свою организацию Azure DevOps и откройте нужный проект.
Перейдите к конвейерам и выберите "Создать конвейер" или "Создать конвейер" при создании первого конвейера.
Выполните все шаги мастера, выбрав GitHub в качестве расположения исходного кода.
Возможно, вам придется выполнить вход в GitHub. Для этого введите учетные данные GitHub.
Когда появится список репозиториев, выберите свой.
Вы можете перенаправиться на GitHub, чтобы установить приложение Azure Pipelines. В этом случае выберите " Утвердить" и "Установить".
Когда откроется вкладка "Настройка" , выберите Xcode.
Когда появится новый конвейер, просмотрите YAML, чтобы узнать функциональность. Когда будете готовы, выберите Сохранить и запустить.
Вам будет предложено зафиксировать новый файл azure-pipelines.yml в репозитории. После того как вы будете довольны сообщением, нажмите кнопку "Сохранить и снова запустить ".
Если вы хотите посмотреть конвейер в действии, выберите задание сборки.
Вы только что создали и запустили конвейер, который мы автоматически создали для вас, так как код, как представляется, является хорошим совпадением для шаблона Xcode .
Теперь у вас есть рабочий конвейер YAML (
azure-pipelines.yml
) в репозитории, готовый к настройке!Когда вы будете готовы внести изменения в конвейер, выберите его на странице конвейеров и измените
azure-pipelines.yml
файл.
Дополнительные сведения о настройке конвейера см. в следующих разделах.
Совет
Чтобы внести изменения в файл YAML, как описано в этом разделе, выберите конвейер на странице конвейеров , а затем нажмите кнопку "Изменить ", чтобы открыть редактор файла azure-pipelines.yml
.
Среда сборки
Azure Pipelines можно использовать для создания приложений с помощью Xcode без необходимости настраивать собственную инфраструктуру. Xcode предварительно установлен в агентах macOS, размещенных в Майкрософт, в Azure Pipelines. Агенты macOS можно использовать для запуска сборок.
Для точных версий Xcode, предварительно установленных, обратитесь к агентам, размещенным корпорацией Майкрософт.
Создайте файл с именем azure-pipelines.yml в корне репозитория. Затем добавьте следующий фрагмент кода в azure-pipelines.yml
файл, чтобы выбрать соответствующий пул агентов:
# https://learn.microsoft.com/azure/devops/pipelines/ecosystems/xcode
pool:
vmImage: 'macOS-latest'
Создание приложения с помощью Xcode
Чтобы создать приложение с помощью Xcode, добавьте следующий фрагмент кода в azure-pipelines.yml
файл. Это минимальный фрагмент кода для создания проекта iOS с помощью своей схемы по умолчанию для симулятора и без упаковки. Измените значения в соответствии с конфигурацией проекта. Дополнительные сведения об этих параметрах см. в задаче Xcode .
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
Подписывание и подготовка
Приложение Xcode должно быть подписано и подготовлено для запуска на устройстве или публикации в App Store. Процесс подписывания и подготовки требует доступа к сертификату подписи P12 и одному или нескольким профилям подготовки. Задачи "Установка сертификата Apple" и "Установка профиля подготовки Apple" делают их доступными для Xcode во время сборки.
Дополнительные сведения см. в статье "Подписывать мобильное приложение ".
Carthage
Если в проекте используется Carthage с частным репозиторием Carthage, можно настроить проверку подлинности, задав переменную GITHUB_ACCESS_TOKEN
среды с именем с значением маркера, имеющего доступ к репозиторию.
Картадж автоматически обнаруживает и использует эту переменную среды.
Не добавляйте маркер секрета непосредственно в yamL конвейера. Вместо этого создайте новую переменную конвейера с включенным блокировкой на панели переменных, чтобы зашифровать это значение. См . секретные переменные.
Ниже приведен пример, использующий секретную переменную с именем myGitHubAccessToken
значения переменной GITHUB_ACCESS_TOKEN
среды.
- script: carthage update --platform iOS
env:
GITHUB_ACCESS_TOKEN: $(myGitHubAccessToken)
Тестирование на размещенных в Azure устройствах
Добавьте задачу тестирования Центра приложений для тестирования приложения в размещенной лаборатории устройств iOS и Android. Бесплатная пробная версия Центра приложений требуется, которая позже должна быть преобразована в платную.
Сначала зарегистрируйтесь в Центре приложений.
# 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.
Сохранение артефактов с помощью записи сборки
Добавьте задачи копирования файлов и публикации артефактов сборки для хранения IPA с записью сборки или тестом и разверните его в последующих конвейерах. См . артефакты.
- task: CopyFiles@2
inputs:
contents: '**/*.ipa'
targetFolder: '$(build.artifactStagingDirectory)'
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'drop'
publishLocation: 'Container'
Развернуть
Центр приложений
Добавьте задачу распространения приложения в группу тестировщиков или бета-версий, а также добавьте задачу распространения приложения в Intune или Apple App Store. Требуется бесплатная учетная запись Центра приложений (плата не требуется).
# 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
Установите расширение Apple App Store и используйте следующие задачи для автоматизации взаимодействия с App Store. По умолчанию эти задачи проходят проверку подлинности в Apple с помощью настраиваемого подключения к службе.
Выпуск
Добавьте задачу выпуска App Store, чтобы автоматизировать выпуск обновлений для существующих бета-приложений iOS TestFlight или рабочих приложений в App Store.
Ознакомьтесь с ограничениями использования этой задачи с двухфакторной проверкой подлинности Apple, так как проверка подлинности Apple зависит от региона, а маркеры сеанса fastlane истекают быстро и должны быть повторно созданы и перенастроены.
- 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
Продвижение
Добавьте задачу "Продвижение в App Store", чтобы автоматизировать продвижение ранее отправленного приложения из iTunes Подключение в 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
Связанные расширения
- Apple App Store (Майкрософт)
- Кодифицированная безопасность (кодифицированная безопасность )
- MacinCloud (Moboware Inc.)
- Задачи мобильного приложения для iOS и Android (Джеймс Монтемагно)
- Лаборатория мобильного тестирования (Perfecto Mobile)
- Рэйгун (Рэйгун )
- React Native (Майкрософт)
- Установка версий (Том Гилдер)
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по