Diferença entre Xcode e git para resolver pacotes rápidos

9

Então, o pano de fundo é o seguinte: eu tenho um projeto Xcode que depende de um pacote rápido que está em um repositório privado no github. Obviamente, isso requer uma chave para acessar. Até o momento, eu consegui configurar o IC para que eu possa ssh na instância e git cloneno repositório necessário para o pacote swift. Infelizmente, ao executá-lo xcbuildcomo o CI, ele não funciona e recebo esta mensagem:

static:ios distiller$ xcodebuild -showBuildSettings -workspace ./Project.xcworkspace \
    -scheme App\ Prod
Resolve Package Graph
Fetching git@github.com:company-uk/ProjectDependency.git
xcodebuild: error: Could not resolve package dependencies:
  Authentication failed because the credentials were rejected

Por outro lado, git clonebuscará com prazer esse repositório, como visto aqui:

static:ios distiller$ git clone git@github.com:company-uk/ProjectDependency.git
Cloning into 'ProjectDependency'...
Warning: Permanently added the RSA host key for IP address '11.22.33.44' to the list of known hosts.
remote: Enumerating objects: 263, done.
remote: Counting objects: 100% (263/263), done.
remote: Compressing objects: 100% (171/171), done.
remote: Total 1335 (delta 165), reused 174 (delta 86), pack-reused 1072
Receiving objects: 100% (1335/1335), 1.11 MiB | 5.67 MiB/s, done.
Resolving deltas: 100% (681/681), done.

Para um pouco mais de contexto, isso está sendo executado no CircleCI, configurado com uma chave Deploy no GitHub, que foi adicionada ao Job on CI.

Qualquer sugestão sobre o que pode ser diferente entre a maneira como o Xcode tenta buscar dependências e a maneira como o vanilla git o faz seria ótimo. Obrigado.

ratbum
fonte
No momento, estou tendo o mesmo problema com as ações do GitHub que meu IC
bscothern
Não é uma resposta, mas, às vezes, no passado (especialmente no Xcode 10), os detalhes da autenticação git tendem a desaparecer sem nenhuma razão (ok na inicialização e depois em falsificação). O Xcode 11 resolve isso.
Alex

Respostas:

5

Isso parece ser um bug no Xcode 11 com SSH. A mudança para HTTPS para resolver os pacotes Swift corrige o problema:

Então a partir disso:

E29801192303068A00018344 /* XCRemoteSwiftPackageReference "ProjectDependency" */ = {
        isa = XCRemoteSwiftPackageReference;
        repositoryURL = "[email protected]:company-uk/ProjectDependency.git";
        requirement = {
                branch = "debug";
                kind = branch;
        };
};

para:

E29801192303068A00018344 /* XCRemoteSwiftPackageReference "ProjectDependency" */ = {
        isa = XCRemoteSwiftPackageReference;
        repositoryURL = "https://github.com/company-uk/ProjectDependency.git";
        requirement = {
                branch = "debug";
                kind = branch;
        };
};
ratbum
fonte
Isso funciona para compilações locais, mas não para máquinas de CI nas quais você não pode assinar o Xcode em nada. Isso sempre resulta nesse erro do Xcode: xcodebuild: error: Não foi possível resolver as dependências do pacote: A autenticação falhou porque nenhuma credencial foi fornecida. Minha experiência foi que a versão SSH funcionará se sua chave ssh estiver configurada corretamente no ~ / .ssh e no GitHub. Desde que você também esteja conectado ao GitHub no Xcode.
bscothern
Isso está funcionando para mim no CI; Eu não estou no escritório até segunda-feira, então não posso investigar como, mas definitivamente está fazendo o trabalho.
Ratdev4
3

Para pipelines de CI em que você não pode entrar no GitHub ou em outros hosts de repositório, esta é a solução que descobri que ignora as restrições / bugs do Xcode nos pacotes Swift privados.

Use URLs https para as dependências particulares, porque a configuração do ssh atualmente é ignorada pelo xcodebuild, mesmo que a documentação diga o contrário.

Depois de criar localmente com https, vá para o host do repositório e crie um PAT (token de acesso pessoal). Para instruções do GitHub, consulte aqui .

Com seu sistema de IC, adicione esse PAT como uma variável de ambiente secreta. No script abaixo, é referido como GITHUB_PAT.

Em seguida, no pipeline do IC antes de executar, xcodebuildcertifique-se de executar uma versão modificada adequadamente deste script bash:

for FILE in $(grep -Ril "https://github.com/[org_name]" .); do
    sed -i '' "s/https:\/\/github.com\/[org_name]/https:\/\/${GITHUB_PAT}@github.com\/[org_name]/g" ${FILE}
done

Este script encontrará todas as referências https e injeta o PAT nele, para que possa ser usado sem uma senha.

Não esqueça:

  • Substitua [org_name]pelo nome da sua organização.
  • Substitua ${GITHUB_PAT}pelo nome do seu segredo de IC, se você o nomeou de maneira diferente.
  • Configure o grepcomando para ignorar os caminhos que você não deseja modificar pelo script.
bscothern
fonte