Tworzenie, testowanie i wdrażanie aplikacji Xcode
Azure DevOps Services | Azure DevOps Server 2022 — Azure DevOps Server 2019
Dowiedz się, jak kompilować i wdrażać projekty Xcode za pomocą usługi Azure Pipelines.
Wymagania wstępne
- Projekt Xcode 9+ w repozytorium GitHub. Jeśli nie masz projektu, zobacz Tworzenie projektu Xcode dla aplikacji
Tworzenie potoku
Zaloguj się do organizacji usługi Azure DevOps i przejdź do projektu.
Przejdź do obszaru Potoki, a następnie wybierz pozycję Nowy potok lub Utwórz potok , jeśli tworzysz pierwszy potok.
Wykonaj kroki kreatora, wybierając najpierw usługę GitHub jako lokalizację kodu źródłowego.
Być może nastąpi przekierowanie do usługi GitHub w celu zalogowania się. Jeśli tak, wprowadź poświadczenia usługi GitHub.
Po wyświetleniu listy repozytoriów wybierz repozytorium.
Możesz zostać przekierowany do usługi GitHub, aby zainstalować aplikację Azure Pipelines. Jeśli tak, wybierz pozycję Zatwierdź i zainstaluj.
Po wyświetleniu karty Konfigurowanie wybierz pozycję Xcode.
Gdy pojawi się nowy potok, przyjrzyj się kodowi YAML, aby zobaczyć, co robi. Gdy wszystko będzie gotowe, wybierz pozycję Zapisz i uruchom.
Zostanie wyświetlony monit o zatwierdzenie nowego pliku azure-pipelines.yml do repozytorium. Po zapoznaniu się z komunikatem wybierz pozycję Zapisz i uruchom ponownie.
Jeśli chcesz obserwować działanie potoku, wybierz zadanie kompilacji.
Właśnie utworzono i uruchomiono potok, który automatycznie utworzyliśmy, ponieważ kod wydawał się być dobrym dopasowaniem szablonu Xcode .
Masz teraz działający potok YAML (
azure-pipelines.yml
) w repozytorium, który jest gotowy do dostosowania.Gdy wszystko będzie gotowe do wprowadzenia zmian w potoku, wybierz go na stronie Potoki , a następnie edytuj
azure-pipelines.yml
plik.
Zapoznaj się z poniższymi sekcjami, aby dowiedzieć się więcej o typowych sposobach dostosowywania potoku.
Napiwek
Aby wprowadzić zmiany w pliku YAML zgodnie z opisem w tym temacie, wybierz potok na stronie Potoki , a następnie wybierz pozycję Edytuj , aby otworzyć edytor dla azure-pipelines.yml
pliku.
Środowisko kompilacji
Za pomocą usługi Azure Pipelines możesz tworzyć aplikacje za pomocą środowiska Xcode bez konieczności konfigurowania własnej infrastruktury. Program Xcode jest wstępnie zainstalowany na agentach systemu macOS hostowanych przez firmę Microsoft w usłudze Azure Pipelines. Do uruchamiania kompilacji można użyć agentów systemu macOS.
Aby uzyskać dokładne wersje programu Xcode, które są wstępnie zainstalowane, zapoznaj się z agentami hostowanymi przez firmę Microsoft.
Utwórz plik o nazwie azure-pipelines.yml w katalogu głównym repozytorium. Następnie dodaj następujący fragment kodu do azure-pipelines.yml
pliku, aby wybrać odpowiednią pulę agentów:
# https://learn.microsoft.com/azure/devops/pipelines/ecosystems/xcode
pool:
vmImage: 'macOS-latest'
Tworzenie aplikacji za pomocą środowiska Xcode
Aby utworzyć aplikację za pomocą środowiska Xcode, dodaj następujący fragment kodu do azure-pipelines.yml
pliku. Jest to minimalny fragment kodu do kompilowania projektu systemu iOS przy użyciu schematu domyślnego dla symulatora i bez tworzenia pakietów. Zmień wartości tak, aby odpowiadały konfiguracji projektu. Aby uzyskać więcej informacji na temat tych opcji, zobacz zadanie 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
Podpisywanie i aprowizowanie
Aplikacja Xcode musi być podpisana i aprowizowana w celu uruchomienia na urządzeniu lub opublikowania w sklepie App Store. Proces podpisywania i aprowizacji wymaga dostępu do certyfikatu podpisywania P12 i co najmniej jednego profilu aprowizacji. Zadania Install Apple Certificate and Install Apple Provisioning Profile (Instalowanie certyfikatu firmy Apple i Instalowanie profilu aprowizacji firmy Apple) udostępniają je programowi Xcode podczas kompilacji.
Aby dowiedzieć się więcej, zobacz Podpisywanie aplikacji mobilnej.
Kartagina
Jeśli projekt używa carthage z prywatnym repozytorium Carthage, możesz skonfigurować uwierzytelnianie, ustawiając zmienną środowiskową o nazwie GITHUB_ACCESS_TOKEN
z wartością tokenu, który ma dostęp do repozytorium.
Carthage automatycznie wykryje i użyje tej zmiennej środowiskowej.
Nie należy dodawać tokenu tajnego bezpośrednio do potoku YAML. Zamiast tego utwórz nową zmienną potoku z włączoną blokadą w okienku Zmienne, aby zaszyfrować tę wartość. Zobacz zmienne tajne.
Oto przykład, który używa zmiennej tajnej o nazwie myGitHubAccessToken
dla wartości zmiennej środowiskowej GITHUB_ACCESS_TOKEN
.
- script: carthage update --platform iOS
env:
GITHUB_ACCESS_TOKEN: $(myGitHubAccessToken)
Testowanie na urządzeniach hostowanych na platformie Azure
Dodaj zadanie Test usługi App Center, aby przetestować aplikację w hostowanym laboratorium urządzeń z systemami iOS i Android. Wymagana jest bezpłatna wersja próbna usługi App Center , która musi zostać później przekonwertowana na płatną.
Najpierw zarejestruj się w usłudze App Center .
# 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.
Zachowywanie artefaktów przy użyciu rekordu kompilacji
Dodaj zadania Copy Files (Kopiowanie plików) i Publish Build Artifacts (Publikuj artefakty kompilacji) w celu przechowywania rekordu kompilacji lub testowania i wdrażania ich w kolejnych potokach. Zobacz Artefakty.
- task: CopyFiles@2
inputs:
contents: '**/*.ipa'
targetFolder: '$(build.artifactStagingDirectory)'
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'drop'
publishLocation: 'Container'
Wdróż
App Center
Dodaj zadanie Dystrybucji centrum aplikacji, aby rozpowszechnić aplikację w grupie testerów lub użytkowników wersji beta albo podwyższyć poziom aplikacji do usługi Intune lub sklepu Apple App Store. Bezpłatne konto centrum aplikacji jest wymagane (nie jest wymagana żadna płatność).
# 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
Zainstaluj rozszerzenie sklepu Apple App Store i użyj następujących zadań, aby zautomatyzować interakcję ze sklepem App Store. Domyślnie te zadania uwierzytelniają się w usłudze Apple przy użyciu skonfigurowanego połączenia usługi.
Zwolnij
Dodaj zadanie Wydanie ze sklepu App Store, aby zautomatyzować wydawanie aktualizacji istniejących aplikacji wersji beta systemu iOS TestFlight lub aplikacji produkcyjnych w sklepie App Store.
Zobacz ograniczenia korzystania z tego zadania z uwierzytelnianiem dwuskładnikowym firmy Apple, ponieważ uwierzytelnianie firmy Apple jest specyficzne dla regionu i tokeny sesji fastlane wygasają szybko i muszą zostać ponownie skonfigurowane.
- 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
Promocja
Dodaj zadanie Podwyższanie poziomu sklepu App Store, aby zautomatyzować podwyższenie poziomu wcześniej przesłanej aplikacji z witryny iTunes Połączenie do sklepu 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
Powiązane rozszerzenia
- Apple App Store (Microsoft)
- Zabezpieczenia skodyfikowane (zabezpieczeń skodyfikowanych)
- MacinCloud (Moboware Inc.)
- Zadania aplikacji mobilnych dla systemów iOS i Android (James Montemagno)
- Laboratorium do testowania mobilnego (Perfecto Mobile)
- Raygun (Raygun)
- React Native (Microsoft)
- Version Setter (Tom Gilder)
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla