Sbt-github-packages: Pacotes do GitHub não parecem suportar sbt (ainda)

Criado em 1 ago. 2019  ·  23Comentários  ·  Fonte: djspiewak/sbt-github-packages

O modelo de publicação do Sbt simplesmente não parece funcionar com os pacotes do GitHub, por motivos que não são totalmente claros. Este tweet parece implicar que este é um problema conhecido, ou pelo menos algo que não é totalmente inesperado. Assim que o GitHub adicionar suporte para sbt, ou pelo menos parar de interrompê-lo, fecharemos esse problema e faremos um lançamento adequado do plugin em funcionamento.

Para o registro, o erro se parece com isso:

[info] [info] Set current project to sbt-github-packages-tests-publish (in build file:/private/var/folders/vm/h_lhw5wn573cw70qd6l0ljt80000gn/T/sbt_78381fbc/publish/)
[info] [info] Packaging /private/var/folders/vm/h_lhw5wn573cw70qd6l0ljt80000gn/T/sbt_78381fbc/publish/target/scala-2.12/sbt-github-packages-tests-publish_2.12-0.1-SNAPSHOT-sources.jar ...
[info] [info] Updating ...
[info] [info] Done packaging.
[info] [info] Wrote /private/var/folders/vm/h_lhw5wn573cw70qd6l0ljt80000gn/T/sbt_78381fbc/publish/target/scala-2.12/sbt-github-packages-tests-publish_2.12-0.1-SNAPSHOT.pom
[info] [info] Done updating.
[info] [info] Packaging /private/var/folders/vm/h_lhw5wn573cw70qd6l0ljt80000gn/T/sbt_78381fbc/publish/target/scala-2.12/sbt-github-packages-tests-publish_2.12-0.1-SNAPSHOT-javadoc.jar ...
[info] [info] Done packaging.
[info] [info] Packaging /private/var/folders/vm/h_lhw5wn573cw70qd6l0ljt80000gn/T/sbt_78381fbc/publish/target/scala-2.12/sbt-github-packages-tests-publish_2.12-0.1-SNAPSHOT.jar ...
[info] [info] Done packaging.
[info] [info]   published sbt-github-packages-tests-publish_2.12 to https://maven.pkg.github.com/djspiewak/sbt-github-packages/com/codecommit/sbt-github-packages-tests-publish_2.12/0.1-SNAPSHOT/sbt-github-packages-tests-publish_2.12-0.1-SNAPSHOT.pom
[info] [error] java.io.IOException: Access to URL https://maven.pkg.github.com/djspiewak/sbt-github-packages/com/codecommit/sbt-github-packages-tests-publish_2.12/0.1-SNAPSHOT/sbt-github-packages-tests-publish_2.12-0.1-SNAPSHOT.jar was refused by the server: Forbidden
[info] [error]  at org.apache.ivy.util.url.AbstractURLHandler.validatePutStatusCode(AbstractURLHandler.java:79)
[info] [error]  at sbt.internal.librarymanagement.ivyint.GigahorseUrlHandler.upload(GigahorseUrlHandler.scala:191)
[info] [error]  at org.apache.ivy.util.url.URLHandlerDispatcher.upload(URLHandlerDispatcher.java:82)
[info] [error]  at org.apache.ivy.util.FileUtil.copy(FileUtil.java:150)
[info] [error]  at org.apache.ivy.plugins.repository.url.URLRepository.put(URLRepository.java:84)
[info] [error]  at sbt.internal.librarymanagement.ConvertResolver$LocalIfFileRepo.put(ConvertResolver.scala:366)
[info] [error]  at org.apache.ivy.plugins.repository.AbstractRepository.put(AbstractRepository.java:130)
[info] [error]  at sbt.internal.librarymanagement.ConvertResolver$ChecksumFriendlyURLResolver.put(ConvertResolver.scala:118)
[info] [error]  at sbt.internal.librarymanagement.ConvertResolver$ChecksumFriendlyURLResolver.put$(ConvertResolver.scala:105)
[info] [error]  at sbt.internal.librarymanagement.ConvertResolver$$anonfun$defaultConvert$lzycompute$1$PluginCapableResolver$1.put(ConvertResolver.scala:165)
[info] [error]  at org.apache.ivy.plugins.resolver.RepositoryResolver.publish(RepositoryResolver.java:216)
[info] [error]  at sbt.internal.librarymanagement.IvyActions$.$anonfun$publish$5(IvyActions.scala:497)
[info] [error]  at sbt.internal.librarymanagement.IvyActions$.$anonfun$publish$5$adapted(IvyActions.scala:496)
[info] [error]  at scala.collection.TraversableLike$WithFilter.$anonfun$foreach$1(TraversableLike.scala:788)
[info] [error]  at scala.collection.Iterator.foreach(Iterator.scala:937)
[info] [error]  at scala.collection.Iterator.foreach$(Iterator.scala:937)
[info] [error]  at scala.collection.AbstractIterator.foreach(Iterator.scala:1425)
[info] [error]  at scala.collection.IterableLike.foreach(IterableLike.scala:70)
[info] [error]  at scala.collection.IterableLike.foreach$(IterableLike.scala:69)
[info] [error]  at scala.collection.AbstractIterable.foreach(Iterable.scala:54)
[info] [error]  at scala.collection.TraversableLike$WithFilter.foreach(TraversableLike.scala:787)
[info] [error]  at sbt.internal.librarymanagement.IvyActions$.publish(IvyActions.scala:496)
[info] [error]  at sbt.internal.librarymanagement.IvyActions$.$anonfun$publish$3(IvyActions.scala:144)
[info] [error]  at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
[info] [error]  at sbt.internal.librarymanagement.IvyActions$.withChecksums(IvyActions.scala:157)
[info] [error]  at sbt.internal.librarymanagement.IvyActions$.withChecksums(IvyActions.scala:151)
[info] [error]  at sbt.internal.librarymanagement.IvyActions$.$anonfun$publish$1(IvyActions.scala:144)
[info] [error]  at sbt.internal.librarymanagement.IvyActions$.$anonfun$publish$1$adapted(IvyActions.scala:134)
[info] [error]  at sbt.internal.librarymanagement.IvySbt$Module.$anonfun$withModule$1(Ivy.scala:239)
[info] [error]  at sbt.internal.librarymanagement.IvySbt.$anonfun$withIvy$1(Ivy.scala:204)
[info] [error]  at sbt.internal.librarymanagement.IvySbt.sbt$internal$librarymanagement$IvySbt$$action$1(Ivy.scala:70)
[info] [error]  at sbt.internal.librarymanagement.IvySbt$$anon$3.call(Ivy.scala:77)
[info] [error]  at xsbt.boot.Locks$GlobalLock.withChannel$1(Locks.scala:95)
[info] [error]  at xsbt.boot.Locks$GlobalLock.xsbt$boot$Locks$GlobalLock$$withChannelRetries$1(Locks.scala:80)
[info] [error]  at xsbt.boot.Locks$GlobalLock$$anonfun$withFileLock$1.apply(Locks.scala:99)
[info] [error]  at xsbt.boot.Using$.withResource(Using.scala:10)
[info] [error]  at xsbt.boot.Using$.apply(Using.scala:9)
[info] [error]  at xsbt.boot.Locks$GlobalLock.ignoringDeadlockAvoided(Locks.scala:60)
[info] [error]  at xsbt.boot.Locks$GlobalLock.withLock(Locks.scala:50)
[info] [error]  at xsbt.boot.Locks$.apply0(Locks.scala:31)
[info] [error]  at xsbt.boot.Locks$.apply(Locks.scala:28)
[info] [error]  at sbt.internal.librarymanagement.IvySbt.withDefaultLogger(Ivy.scala:77)
[info] [error]  at sbt.internal.librarymanagement.IvySbt.withIvy(Ivy.scala:199)
[info] [error]  at sbt.internal.librarymanagement.IvySbt.withIvy(Ivy.scala:196)
[info] [error]  at sbt.internal.librarymanagement.IvySbt$Module.withModule(Ivy.scala:238)
[info] [error]  at sbt.internal.librarymanagement.IvyActions$.publish(IvyActions.scala:134)
[info] [error]  at sbt.Classpaths$.$anonfun$publishTask$4(Defaults.scala:2416)
[info] [error]  at sbt.Classpaths$.$anonfun$publishTask$4$adapted(Defaults.scala:2416)
[info] [error]  at scala.Function1.$anonfun$compose$1(Function1.scala:44)
[info] [error]  at sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:40)
[info] [error]  at sbt.std.Transform$$anon$4.work(System.scala:67)
[info] [error]  at sbt.Execute.$anonfun$submit$2(Execute.scala:269)
[info] [error]  at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:16)
[info] [error]  at sbt.Execute.work(Execute.scala:278)
[info] [error]  at sbt.Execute.$anonfun$submit$1(Execute.scala:269)
[info] [error]  at sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:178)
[info] [error]  at sbt.CompletionService$$anon$2.call(CompletionService.scala:37)
[info] [error]  at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[info] [error]  at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
[info] [error]  at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[info] [error]  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
[info] [error]  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
[info] [error]  at java.lang.Thread.run(Thread.java:748)

Se você olhar para o topo, verá que o pom foi publicado com sucesso, mas o primeiro arquivo jar foi rejeitado com Forbidden . @alexarchambault relata que a ordem das publicações é irrelevante e os jars são rejeitados independentemente.

bug

Comentários muito úteis

Parece que o Github mudou algumas coisas, conseguiu fazer um upload completo hoje. (baunilha sbt 1.3.3)

[info]  published test_2.13 to https://maven.pkg.github.com/francisdb/foo/com/example/test_2.13/0.0.9/test_2.13-0.0.9.pom
[info]  published test_2.13 to https://maven.pkg.github.com/francisdb/foo/com/example/test_2.13/0.0.9/test_2.13-0.0.9.jar
[info]  published test_2.13 to https://maven.pkg.github.com/francisdb/foo/com/example/test_2.13/0.0.9/test_2.13-0.0.9-sources.jar
[info]  published test_2.13 to https://maven.pkg.github.com/francisdb/foo/com/example/test_2.13/0.0.9/test_2.13-0.0.9-javadoc.jar

A interface do usuário da web ainda está confusa sobre o sufixo sbt

<dependency>
  <groupId>com.example.test_2</groupId>
  <artifactId>13</artifactId>
  <version>0.0.9</version>
</dependency> 

Todos 23 comentários

Até onde eu sei, -sources, -javadoc, -tests não são suportados

usando sbt-aether-deploy, publiquei com sucesso nos pacotes do github do sbt

projeto/plugins.sbt

addSbtPlugin("no.arktekk.sbt" % "aether-deploy" % "0.23.0")
addSbtPlugin("com.dwijnand" % "sbt-dynver" % "4.0.0")

build.sbt

externalResolvers += "GitHub lokkju Apache Maven Packages" at "https://maven.pkg.github.com/lokkju/github-action-sbt"
publishTo := Some("GitHub lokkju Apache Maven Packages" at "https://maven.pkg.github.com/lokkju/github-action-sbt")
credentials += Credentials("GitHub Package Registry", "maven.pkg.github.com", "lokkju", "<GITHUB_TOKEN>")

// GitHub package repo isn't supporting javadoc and sources
publishArtifact in (Compile, packageDoc) := false
publishArtifact in (Compile, packageSrc) := false

sbt aetherDeploy

Um aspecto adicional; se eu usar o Charles Web Debugging Proxy, tudo funciona bem. Sem ele, ocasionalmente recebo erros sobre o servidor não responder.

@lokkju Hmm, e quanto a compilações de vários módulos?

Eu não tentei; key aqui parece estar usando o aether-deploy, embora não o corrija totalmente. Estou suspeitando que seja um problema com o suporte SSL nas versões do cliente usadas por cada ferramenta.

Vou tentar algumas bibliotecas http java diferentes e ver se posso substituir uma configuração simples de trabalho e não de trabalho. Vou mantê-lo atualizado.

Então, depois de mais exploração, encontrei alguns sintomas interessantes.

Apenas usando curl para tentar fazer upload de pacotes, descobri;

  • O primeiro arquivo que você PUT é tratado como o artefato principal, independentemente do nome do arquivo ou extensão
  • você pode enviar quantos arquivos POM (válidos) quiser, desde que tenham nomes exclusivos
  • você não pode fazer upload de nenhum outro arquivo que não seja POM
  • Arquivos com extensões de arquivo JAR e POM são analisados ​​pelo github, e formatos inválidos reportarão um erro como a mensagem do erro HTTP 4xx que é retornado.

A principal conclusão atualmente é que você deve fazer upload do artefato JAR primeiro e depois publicar o POM.

Tenho um email para o suporte, vamos ver se eles fornecem mais informações.

Hmm, então também não há assinatura de artefatos?

Ele gera automaticamente *.md5 e *.sha1 para qualquer arquivo carregado.

Além disso, encontrei isto: https://github.com/sbt/librarymanagement/blob/d09f9f81b664baaac15054730fbcb51e1b240de2/ivy/src/main/scala/sbt/internal/librarymanagement/IvyActions.scala#L123

Artifactory deals with the publishing (and republishing) of SNAPSHOTs using a strict rule on the order of publishing. The ;build.timestamp=... suffix is the alternative.

The strict rule is:

publish the main artefact (which has no classifier)
publish the POM/ivy.xml file
publish additional artefacts which have a classifier

Não consigo implantar classificadores até agora, o que é incômodo, e parte do que eu tenho uma pergunta no github.

Provavelmente vou criar um projeto maven/java puro e ver se funciona então

Apenas tentei implantar um instantâneo usando a publicação padrão e obtive isto:

[error] stack trace is suppressed; run last publish for the full output
[error] (publish) java.io.IOException: PUT operation to URL https://maven.pkg.github.com/company/foo/bar/utils/3.24.0-SNAPSHOT/utils-3.24.0-SNAPSHOT.pom failed with status code 400: Bad Request

Nenhuma menção de instantâneos nos documentos

Na verdade, tenho o mesmo para pacotes normais:

java.io.IOException: PUT operation to URL https://maven.pkg.github.com/company/foo/bar/utils/utils/0.0.1/utils-0.0.1.pom failed with status code 400: Bad Request
[error] java.io.IOException: PUT operation to URL https://maven.pkg.github.com/company/foo/bar/utils/utils/0.0.1/utils-0.0.1.pom failed with status code 400: Bad Request
[error]     at org.apache.ivy.util.url.AbstractURLHandler.validatePutStatusCode(AbstractURLHandler.java:82)
[error]     at org.apache.ivy.util.url.BasicURLHandler.upload(BasicURLHandler.java:264)
[error]     at org.apache.ivy.util.url.URLHandlerDispatcher.upload(URLHandlerDispatcher.java:82)
[error]     at org.apache.ivy.util.FileUtil.copy(FileUtil.java:150)

Gostaria de saber como é o corpo desse 400

Existem atualizações sobre isso?

Ainda não há atualizações! Os experimentos de @lokkju são os mais recentes, eu acho. Eu quero brincar um pouco mais com isso, mas honestamente parece que o GitHub Packages ainda não suporta arquivos de hospedagem que são parte integrante de um Maven padrão distribuível (como assinaturas, documentação e classificadores). É difícil fazer algo prático com ele como um host de artefatos até que eles corrijam essas deficiências.

Mais algumas informações, testando com sbt 1.3.2 simples (sem plugins extras)

Você precisa publicar no repositório do seu projeto:

publishTo := Some("GitHub Package Registry" at "https://maven.pkg.github.com/[username]/[project]")

credenciais devem ser definidas assim

credentials += Credentials("GitHub Package Registry","maven.pkg.github.com","[username]","[token]")

Seu token precisa dos seguintes escopos: read:packages , repo e write:packages

mas uma vez que você publica, você acaba com essas coordenadas de pacote propostas (onde organization="io.test" e name="test"):

<dependency>
  <groupId>com.github.[username]/[project]</groupId>
  <artifactId>io.test.test_2.13</artifactId>
  <version>0.1</version>
</dependency> 

Os instantâneos podem ser carregados, mas provavelmente não têm tratamento especial, pois você não pode enviá-los duas vezes

O upload do Pom funciona, mas o resto falha:

[info] publicou test_2.13 em https://maven.pkg.github.com/ [username]/[project]/io/test/test_2.13/0.0.3/test_2.13-0.0.3.pom
[erro] java.io.IOException: Acesso à URL https://maven.pkg.github.com/ [username]/[project]/io/test/test_2.13/0.0.3/test_2.13-0.0. 3.jar foi recusado pelo servidor: Forbidden response=Erro: "test_2.13-0.0.3.jar" na versão 0.0.3 de "io.test.test_2.13" já foi publicado.

O upload do JAR do @francisdb falha porque o SBT carrega os arquivos fora de ordem; pelo que me lembro, é um bug de longa data no SBT (IvyActions.scala) onde a função de publicação usa um tipo de mapa em vez do tipo seq. Com a mudança para o sistema de gerenciamento de dependências do Coursier, isso pode ser resolvido automaticamente.

Minha sugestão seria substituir o próprio processo de upload dentro deste plugin, certificando-se de fazer o upload do pom primeiro. Claro, isso ainda não ajuda com classificadores, para os quais preciso de suporte.

parece no sbt 1.3.2 Coursier não está em uso para upload de artefatos, apenas para download

Além disso, não tive nenhuma resposta do GitHub sobre esse problema

Solicitação de pull: #2

Coursier só é usado por padrão a partir do sbt 1.3.0

meu teste foi com 1.3.2

@francisdb Entendi.

Parece que o Github mudou algumas coisas, conseguiu fazer um upload completo hoje. (baunilha sbt 1.3.3)

[info]  published test_2.13 to https://maven.pkg.github.com/francisdb/foo/com/example/test_2.13/0.0.9/test_2.13-0.0.9.pom
[info]  published test_2.13 to https://maven.pkg.github.com/francisdb/foo/com/example/test_2.13/0.0.9/test_2.13-0.0.9.jar
[info]  published test_2.13 to https://maven.pkg.github.com/francisdb/foo/com/example/test_2.13/0.0.9/test_2.13-0.0.9-sources.jar
[info]  published test_2.13 to https://maven.pkg.github.com/francisdb/foo/com/example/test_2.13/0.0.9/test_2.13-0.0.9-javadoc.jar

A interface do usuário da web ainda está confusa sobre o sufixo sbt

<dependency>
  <groupId>com.example.test_2</groupId>
  <artifactId>13</artifactId>
  <version>0.0.9</version>
</dependency> 

Isso é emocionante! Vou fazer alguns testes hoje e ver se consigo fechar isso. Muito muito emocionante.

Posso confirmar que, com alguns ajustes no plugin para usar os resultados experimentais do @francisdb , as coisas estão funcionando agora! Os problemas de webui com sufixos de compilação cruzada não parecem afetar a resolução real, apenas a interface do usuário. Portanto, publicação e resolução agora funcionam com o plugin. Ainda não testei coisas com um repositório privado; meu palpite é que eles não estão funcionando ainda, mas as coisas estão boas o suficiente para que eu publique 0.1.0 .

Obrigado a todos, por todo o seu trabalho duro e experimentação! O plugin é notavelmente trivial graças a todos vocês.

@francisdb

Os instantâneos podem ser carregados, mas provavelmente não têm tratamento especial, pois você não pode enviá-los duas vezes

Você _pode_ carregá-los duas vezes: você pode excluir um instantâneo na interface do usuário do GitHub e, em seguida, carregar novamente um novo instantâneo (ou seja, a mesma versão do instantâneo). Isso funcionou para mim. Um pouco trabalhoso, mas funciona.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

dcsobral picture dcsobral  ·  11Comentários

mkurz picture mkurz  ·  6Comentários

pankajmi picture pankajmi  ·  44Comentários

weihsiu picture weihsiu  ·  10Comentários

itissid picture itissid  ·  13Comentários