Partilhar via


Compilar, testar e implementar aplicações Xcode

Serviços de DevOps do Azure | Azure DevOps Server | Azure DevOps Server 2022

Este artigo mostra-lhe como construir e implementar projetos Xcode com pipelines YAML no Azure Pipelines.

Pré-requisitos

  • Uma organização e um projeto do Azure DevOps onde você tem permissão para criar pipelines e implantar aplicativos.
  • Um projeto e aplicativo Xcode 9+ em um repositório GitHub. Para obter mais informações, consulte Criando um projeto Xcode para um aplicativo.

Criar a cadeia de processos

Importante

Durante os procedimentos do GitHub, você pode ser solicitado a criar uma conexão de serviço do GitHub ou ser redirecionado para o GitHub para entrar, instalar o Azure Pipelines ou autorizar o Azure Pipelines. Siga as instruções na tela para concluir o processo. Para obter mais informações, consulte Acesso a repositórios do GitHub.

  1. Em seu projeto de DevOps do Azure, selecione Pipelines>New pipeline ou Create pipeline se esse pipeline for o primeiro do projeto.
  2. Selecione GitHub como o local do seu código-fonte.
  3. Na tela Selecione um repositório, selecione o repositório para seu projeto Xcode.
  4. Na tela Configurar seu pipeline, selecione Xcode.

O Azure Pipelines oferece um pipeline inicial baseado no modelo Xcode. Revise o código no azure-pipelines.yml.

Ambiente de construção

O Xcode está pré-instalado nos agentes macOS hospedados pela Microsoft no Azure Pipelines, portanto, você não precisa configurar nenhuma infraestrutura. Para obter as versões exatas do Xcode que estão pré-instaladas, consulte Software de agentes hospedados pela Microsoft.

O pool nó na parte superior do ficheiro azure-pipelines.yml seleciona o pool de agentes apropriado.

pool:
  vmImage: 'macOS-latest'

Tarefa de compilação do Xcode

A tarefa Xcode constrói, testa ou arquiva um espaço de trabalho Xcode no macOS, podendo opcionalmente empacotar uma aplicação. A etapa Xcode no ficheiro de azure-pipelines.yml inicial constrói o projeto iOS usando o seu esquema padrão, para o Simulador, e sem empacotamento. Você pode alterar valores e adicionar parâmetros para corresponder à configuração do seu projeto.

Build de desenvolvimento:

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

Versão de produção para App Store:

Para versões de produção, especifique uma versão explícita do Xcode, o esquema da sua aplicação e a configuração de lançamento:

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'

Principais diferenças para a produção:

  • xcodeVersion: Especifique uma versão fixa (por exemplo, '14') em vez de 'default' para builds consistentes e reproduzíveis.
  • scheme: Substitua a string vazia pelo nome real do esquema da sua app.
  • sdk: Usar 'iphoneos' para builds de dispositivos; usar 'iphonesimulator' para builds de simulador.
  • configuração: Uso 'Release' para produção; uso 'Debug' para desenvolvimento.
  • packageApp: Defina para true para gerar um ficheiro .ipa para distribuição.
  • exportPath: Direciona a saída do pacote para o diretório de build staging para publicação de artefactos.

Salve e execute o pipeline

Quando terminar de revisar o código no azure-pipelines.yml, selecione Salvar e executar.

Captura de tela do botão Salvar e executar em um novo pipeline YAML.

Opcionalmente, edite a mensagem de confirmação e forneça uma descrição. Em seguida, selecione Salvar e executar novamente para confirmar o arquivo azure-pipelines.yml no repositório e iniciar uma compilação.

A página de execução da compilação mostra os detalhes e o progresso da compilação. Se quiser ver o seu pipeline em ação, selecione Job na parte de baixo da página.

Agora você tem um pipeline YAML em funcionamento, azure-pipelines.yml, em seu repositório que está pronto para personalizar.

Personalizar o fluxo de trabalho

Para fazer alterações no pipeline, selecione Editar na página do pipeline. As secções seguintes descrevem algumas formas comuns de personalizar o seu pipeline Xcode com base nas suas necessidades específicas:

  • Assinatura e aprovisionamento: É obrigatório implementar em dispositivos físicos ou na App Store.
  • Gestão de dependências: Configure a autenticação para repositórios privados.
  • Gestão de artefactos: Armazenar os outputs das builds para testes e implementação.
  • Distribuição: Automatize a libertação para a TestFlight ou para a App Store.

Adicionar tarefas de assinatura e provisionamento

Para executar a sua aplicação Xcode num dispositivo físico ou publicá-la na App Store, precisa de assinar e provisionar a aplicação. Este processo envolve a utilização de um certificado de assinatura P12 (uma credencial de segurança que verifica a identidade da sua aplicação) e o provisionamento de perfis (que autorizam a sua aplicação para dispositivos ou distribuição específicos). Para obter mais informações, consulte Assinar a sua aplicação móvel.

Para disponibilizar o certificado e o perfil para o Xcode durante uma compilação, adicione as tarefas Instalar Certificado Apple e Instalar Perfil de Provisionamento Apple ao seu pipeline.

Gerenciar dependências

O seu projeto Xcode pode usar gestores de dependências para gerir bibliotecas e frameworks de terceiros. As secções seguintes descrevem como configurar a autenticação para repositórios privados com diferentes gestores de dependências.

Gestor de Pacotes Swift

O Gestor de Pacotes Swift (SPM) é o gestor nativo de dependências da Apple e está integrado diretamente no Xcode. Para projetos que usam SPM com pacotes privados, é necessário configurar a autenticação Git.

Se os seus pacotes privados Swift estiverem alojados no GitHub, configure a autenticação usando uma variável de ambiente com GITHUB_ACCESS_TOKEN o valor de um token de acesso pessoal que tenha acesso ao repositório.

Não adicione o token secreto diretamente ao YAML do seu pipeline, pois esta ação expõe-o no seu código-fonte. Para obter mais informações, consulte Definir variáveis secretas.

O seguinte código de pipeline utiliza uma variável secreta nomeada myGitHubAccessToken para autenticação ao resolver dependências do Swift Package:

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

Para pacotes privados alojados em repositórios Azure ou outros fornecedores Git, configure as credenciais Git apropriadas antes da etapa de compilação.

CacauPods

Se o teu projeto usa CocoaPods, usa a tarefa CocoaPods para instalar dependências.

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

Cartago

Se o seu projeto usar o Carthage (um gestor de dependências para projetos iOS/macOS) com um repositório privado do Carthage, configure a autenticação usando uma variável de ambiente nomeada GITHUB_ACCESS_TOKEN com o valor de um token que tenha acesso ao repositório. Carthage deteta e usa automaticamente essa variável de ambiente.

Não adicione o token secreto diretamente ao YAML do seu pipeline, pois esta ação expõe-o no seu código-fonte. Para obter mais informações, consulte Definir variáveis secretas.

O código de pipeline a seguir usa uma variável secreta nomeada myGitHubAccessToken para o valor da variável de GITHUB_ACCESS_TOKEN ambiente.

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

Teste em dispositivos hospedados pelo Azure

O Visual Studio App Center foi retirado a 31 de março de 2025. Aprenda sobre as alternativas recomendadas.

Manter artefatos com o registo de processo de construção

Para armazenar o seu ficheiro do Pacote AppStore (IPA) para iOS com o registo de compilação ou teste e implementá-lo em pipelines subsequentes, adicione as tarefas Copiar Ficheiros e Publicar Artefactos do Pipeline ao seu pipeline.

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

Desdobrar para a Apple App Store ou o TestFlight

Para distribuir uma aplicação a testadores ou utilizadores beta, utilize o TestFlight da Apple ou implemente diretamente na App Store. Consulte a secção abaixo para a implementação da Apple App Store.

Para testes beta e feedback dos utilizadores, considere utilizar:

Instale a extensão Apple App Store e implante na Apple App Store

Para automatizar a interação com a Apple App Store, instale a extensão Apple App Store, e, em seguida, use as seguintes tarefas no seu pipeline. Por predefinição, estas tarefas são autenticadas na Apple utilizando uma ligação de serviço que tem de configurar.

Para automatizar o lançamento de atualizações para aplicativos beta do iOS TestFlight ou aplicativos de produção na App Store, adicione a tarefa Lançamento da App Store.

Existem limitações ao utilizar esta tarefa com autenticação de dois fatores da Apple. A autenticação Apple é específica por região, e os tokens de sessão fastlane (credenciais temporárias usadas para autenticar com a Apple) expiram rapidamente e têm de ser recriados e reconfigurados periodicamente.

- 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

Para automatizar a promoção de uma aplicação submetida anteriormente a partir do iTunes Connect para a App Store, adicione a tarefa App Store Promote.

- 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