Compartilhar via


Compilar, testar e implantar aplicativos Xcode

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

Este artigo mostra como criar e implantar projetos Xcode com pipelines YAML no Azure Pipelines.

Pré-requisitos

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

Criar o pipeline

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 efetuar o processo. Para obter mais informações, confira Acesso ao repositórios do GitHub.

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

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

Ambiente de build

O Xcode é pré-instalado nos agentes macOS hospedados pela Microsoft no Azure Pipelines, para que você não precise configurar nenhuma infraestrutura. Para obter as versões exatas do Xcode pré-instaladas, confira software de agentes hospedados pela Microsoft.

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

pool:
  vmImage: 'macOS-latest'

Tarefa build do Xcode

A tarefa Xcode cria, testa ou arquiva um workspace do Xcode no macOS e, opcionalmente, pode empacotar um aplicativo. A etapa Xcode no arquivo azure-pipelines.yml inicial cria o projeto iOS usando 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

Build de produção para App Store:

Para versões de produção, especifique uma versão explícita do Xcode, o esquema do aplicativo e a configuração de versão:

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') ao invés de 'default' para compilações consistentes e reproduzíveis.
  • esquema: substitua a cadeia de caracteres vazia pelo nome real do esquema do aplicativo.
  • sdk: usar 'iphoneos' para builds de dispositivo; use 'iphonesimulator' para builds de simulador.
  • configuração: Use 'Release' para produção; use 'Debug' para desenvolvimento.
  • packageApp: defina para true gerar um .ipa arquivo para distribuição.
  • exportPath: direciona a saída do pacote para o diretório de preparo de build para publicação de artefatos.

Salvar e executar 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 de compilação mostra detalhes e progresso da compilação. Se quiser ver o seu pipeline em ação, selecione Trabalho na parte inferior da página.

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

Personalizar o pipeline

Para fazer alterações no seu pipeline, selecione Editar na página do pipeline. As seções a seguir descrevem algumas maneiras comuns de personalizar o pipeline do Xcode com base em suas necessidades específicas:

  • Assinatura e provisionamento: Necessário para implantar em dispositivos físicos ou na App Store.
  • Gerenciamento de dependências: Configure a autenticação para repositórios privados.
  • Gerenciamento de artefatos: Armazene saídas de build para teste e implantação.
  • Distribuição: Automatize a versão no TestFlight ou na App Store.

Adicionar tarefas de assinatura e provisionamento

Para executar seu aplicativo Xcode em um dispositivo físico ou publicá-lo na App Store, você precisa assinar e provisionar o aplicativo. Esse processo envolve o uso de um certificado de assinatura P12 (uma credencial de segurança que verifica a identidade do aplicativo) e perfis de provisionamento (que autorizam seu aplicativo para dispositivos ou distribuição específicos). Para obter mais informações, consulte cadastre seu aplicativo móvel.

Para disponibilizar o certificado e o perfil para o Xcode durante um build, adicione as tarefas Instalar Certificado Apple e Instalar Perfil de Provisionamento da Apple ao seu pipeline.

Gerenciar dependências

Seu projeto Xcode pode usar gerenciadores de dependência para lidar com estruturas e bibliotecas de terceiros. As seções a seguir descrevem como configurar a autenticação para repositórios privados com diferentes gerenciadores de dependência.

Gerenciador de Pacotes Swift

O SPM (Gerenciador de Pacotes Swift) é o gerenciador de dependências nativo da Apple e é integrado diretamente ao Xcode. Para projetos que usam o SPM com pacotes privados, você precisa configurar a autenticação do Git.

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

Não adicione o token secreto diretamente ao YAML do pipeline, pois essa ação o expõe no 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 autenticação ao resolver dependências do Pacote Swift:

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

Para pacotes privados hospedados no Azure Repos ou em outros provedores Git, configure as credenciais apropriadas do Git antes da etapa de build.

Cacau

Se o projeto usar CocoaPods, use a tarefa CocoaPods para instalar dependências.

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

Carthage

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

Não adicione o token secreto diretamente ao YAML do pipeline, pois essa ação o expõe no 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)

Testar em dispositivos hospedados no Azure

O Visual Studio App Center foi desativado em 31 de março de 2025. Saiba mais sobre as alternativas recomendadas.

Manter artefatos com o registro de build

Para armazenar o arquivo IPA (Pacote AppStore) do iOS com o histórico do build ou testá-lo e implantá-lo em pipelines subsequentes, adicione as tarefas Copiar Arquivos e Publicar Artefatos de Pipeline à sua pipeline.

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

Implantar na Apple App Store ou TestFlight

Para distribuir um aplicativo para testadores ou usuários beta, use o TestFlight da Apple ou implante diretamente na App Store. Consulte a seção abaixo para a implantação da Apple App Store.

Para testes beta e comentários do usuário, considere usar:

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

Instale a extensão da Apple App Store e use as tarefas a seguir para automatizar a interação com a Apple App Store no pipeline. Por padrão, essas tarefas são autenticadas na Apple usando uma conexão de serviço que deve ser configurada.

Adicione a tarefa Versão da App Store para automatizar a versão das atualizações para aplicativos beta do iOS TestFlight ou aplicativos de produção existentes na App Store.

Há limitações ao usar essa tarefa com a autenticação de dois fatores da Apple. A autenticação da Apple é específica da região e os tokens de sessão fastlane (credenciais temporárias usadas para autenticar com a Apple) expiram rapidamente e devem 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

Adicione a tarefa Promover App Store para automatizar a divulgação de um aplicativo enviado anteriormente do iTunes Connect para a 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