Skip to main content
O Devin agora tem acesso a máquinas virtuais macOS. Isso significa que ele já pode compilar e testar aplicativos iOS e macOS.
Se você usa uma implantação Dedicated SaaS, entre em contato com seu account team para ativar as VMs macOS.

Como funciona

O suporte a macOS é construído sobre o mesmo sistema de configuração declarativa do Linux. O campo runs-on no seu blueprint indica ao Devin em qual plataforma fazer o build e a execução, e cada plataforma tem seu próprio snapshot. As principais diferenças em relação ao Linux são o shell, a organização do sistema de arquivos e o gerenciador de pacotes:

Iniciando uma sessão no macOS

Você pode escolher o macOS para cada sessão:
  • Blueprint: adicione runs-on: macos para que o snapshot do repositório seja criado para macOS (veja abaixo).
  • Slack: use o bang command !mac para iniciar uma sessão em uma VM macOS.
  • API: defina platform: "macos" ao criar uma sessão, um agendamento ou uma automação. Consulte a referência da API.

Escrevendo blueprints para macOS

Blueprint de plataforma única

Se o seu repositório tem como alvo apenas plataformas Apple, use runs-on: macos no nível superior:

Blueprint multiplataforma

Para fazer o build do mesmo repositório para mais de uma plataforma, escreva cada plataforma como um documento YAML separado, delimitado por ---. Cada documento declara seu próprio rótulo runs-on. Consulte o aviso YAML multidocumento no guia de blueprints para mais informações sobre esse formato.
Cada documento gera um build do snapshot separado para sua plataforma. As sessões são inicializadas a partir do snapshot específico de cada plataforma.
O YAML de nível superior deve ser um mapping, não uma sequência. Escrever o exemplo acima como uma única lista (- runs-on: default / - runs-on: macos) é rejeitado pelo backend. Use o separador --- mostrado acima.

O campo runs-on

O campo runs-on é mapeado para uma configuração de máquina registrada na sua conta: Você pode especificar runs-on como uma string ou uma lista:
A sintaxe de lista executa comandos idênticos em todas as plataformas da lista. Use-a apenas quando os comandos forem de fato multiplataforma (por exemplo, npm install). Para comandos específicos de cada plataforma (como apt-get no Linux ou brew no macOS), use o formato de múltiplos documentos.

Uso e custo

Sessões no macOS consomem o mesmo uso que sessões equivalentes no Linux ou no Windows. Não há sobretaxa para macOS. Para saber como o uso é medido, consulte Uso.

O que já vem instalado

As images de sessão do macOS já vêm com o toolchain da Apple instalado, então seu blueprint não precisa baixá-lo: As versões mudam conforme a Apple lança novas versões e a image é atualizada. Para saber exatamente o que uma sessão tem, peça ao Devin para executar:

Selecionando uma versão do Xcode

O Xcode padrão é aquele apontado pelo xcode-select. Para usar outra versão instalada em um único comando, defina DEVELOPER_DIR:
Use /usr/bin/xcodebuild (o shim que respeita DEVELOPER_DIR) em vez de um xcodebuild resolvido a partir do Contents/Developer/usr/bin de um Xcode específico no PATH, que reporta a própria versão independentemente de DEVELOPER_DIR. Ou altere o padrão para a sessão inteira:
Inclua no seu blueprint a versão de que você precisa para que toda sessão comece com a toolchain correta.

Comportamento da sessão no macOS

Shell

As sessões no macOS usam o zsh como shell padrão. A maioria dos comandos de shell POSIX funciona sem alterações em relação aos blueprints Linux, mas atenção ao userland BSD: o sed -i exige um argumento (sed -i ''), e ferramentas GNU como gsed, gdate e greadlink vêm da fórmula coreutils do Homebrew.

Caminhos

Os repositórios são clonados em /Users/devin/repos/<repo-name>, e os arquivos que você importa para uma sessão são gravados em /Users/devin/.files/.

Segredos

Os segredos ficam disponíveis como variáveis de ambiente durante as sessões ($SECRET_NAME), assim como no Linux. É assim que você fornece chaves de API do App Store Connect, credenciais de assinatura ou tokens de registro privado:

Sleep e wake da sessão

As sessões fazem um snapshot em disco ao entrar em sleep. Tudo o que está em disco sobrevive ao wake: ferramentas instaladas, repos clonados, caches de build, dados derivados. Processos em execução, não: servidores de desenvolvimento, simuladores e watchers precisam ser reiniciados depois que a sessão acorda.

Computer Use

O Computer Use funciona em sessões macOS: o Devin ganha um desktop macOS completo, com Chrome, mouse e teclado, podendo testar tanto apps nativos do macOS quanto web apps e gravar o que faz. O Devin usa a tecla Command para os atalhos do macOS (⌘C, ⌘V, ⌘Tab), e não a tecla Control.

iOS Simulator

O Devin pode iniciar e controlar o iOS Simulator diretamente:
A aba iOS Simulator no workspace da sessão transmite o simulador em execução, permitindo que você acompanhe em tempo real o Devin tocando pelas telas do seu app. É o equivalente da Apple ao suporte a emulador Android.

Dicas e truques

Caches de build aquecidos

Um build frio do Xcode resulta em uma experiência de desenvolvimento abaixo do ideal, com tempos de build mais longos. Use o campo maintenance no environment.yml para preaquecer o cache.
Os Swift packages resolvidos, os CocoaPods e o DerivedData permanecem no snapshot, de modo que novas sessões começam a partir de um build incremental.

Acesso à rede

Builds que buscam dependências no CocoaPods, no Swift Package Manager, no Firebase ou em um registro privado precisam que esses hosts estejam acessíveis. Se a sua organização opera com uma política de rede restrita, verifique se a lista de permissões do macOS cobre os mesmos registros usados pelos seus builds no Linux. As duas são configuradas separadamente, e uma entrada ausente geralmente se manifesta como uma falha de resolução de dependências ou de TLS no meio de um build.

Executando contêineres

VMs macOS não têm virtualização de hardware aninhada, portanto o runtime de contêineres precisa recorrer à emulação por software do QEMU (TCG). O Colima detecta isso e alterna para a emulação automaticamente:
A VM leva de dois a quatro minutos para ficar utilizável, e a primeira inicialização pode expirar esperando o SSH enquanto o guest emulado sobe a rede, então execute o colima start novamente se ele falhar. Depois disso, os contêineres rodam de 15 a 25x mais devagar na CPU do que nativamente, levando alguns segundos para iniciar cada um; os pulls acontecem na velocidade da rede do host. Isso é aceitável para um contêiner de linting ou empacotamento, mas sofrido para compilação. Para trabalhos que dependem muito de contêineres, use uma sessão Linux ou aponte a sessão macOS para um daemon Docker remoto.

Não instale o Xcode em um blueprint a menos que seja necessário

O Xcode é um download de vários gigabytes e a Apple exige um Apple ID para baixá-lo. Prefira as versões já disponíveis na image, selecionadas com DEVELOPER_DIR ou xcode-select. Se precisar de uma versão diferente ou de uma beta, você pode armazenar um Apple ID como segredo e fazer o blueprint baixar essa versão, ao custo de um build muito mais lento.

Limitações

Solução de problemas

Os builds ficam muito mais lentos na primeira sessão após um rebuild do snapshot. O DerivedData foi reconstruído do zero. Adicione uma etapa build-for-testing ao maintenance para que o snapshot já inclua um build aquecido. O xcodebuild escolhe a toolchain errada. Verifique xcode-select -p e defina DEVELOPER_DIR explicitamente na etapa do blueprint. Um destino não é encontrado. Execute xcrun simctl list devices available para ver o que os runtimes instalados realmente oferecem e ajuste o nome e o SO em -destination de acordo. A resolução de dependências trava ou falha com um erro de TLS. Provavelmente o host não está na lista de permissões de rede da sua organização para macOS. Consulte Acesso à rede.