Sbt-github-packages: Les packages GitHub ne semblent pas (encore) prendre en charge sbt

Créé le 1 août 2019  ·  23Commentaires  ·  Source: djspiewak/sbt-github-packages

Le modèle de publication de Sbt ne semble tout simplement pas fonctionner avec les packages GitHub, pour des raisons qui ne sont pas tout à fait claires. Ce tweet semble impliquer qu'il s'agit d'un problème connu, ou à tout le moins quelque chose qui n'est pas tout à fait inattendu. Une fois que GitHub ajoutera la prise en charge de sbt, ou au moins arrêtera de le casser, nous fermerons ce problème et ferons une version appropriée du plugin de travail.

Pour mémoire, l'erreur ressemble à ceci :

[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)

Si vous regardez vers le haut, vous verrez que le pom a été publié avec succès, mais que le premier fichier jar a été rejeté avec Forbidden . @alexarchambault signale que l'ordre des publications n'est pas pertinent et que les pots sont rejetés malgré tout.

bug

Commentaire le plus utile

On dirait que Github a changé certaines choses, a pu faire un téléchargement complet aujourd'hui. (vanille 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

L'interface utilisateur Web est toujours confuse au sujet du suffixe sbt

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

Tous les 23 commentaires

Autant que je sache, -sources, -javadoc, -tests ne sont pas pris en charge

en utilisant sbt-aether-deploy, j'ai publié avec succès des packages github à partir de sbt

projet/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

Un aspect supplémentaire; si j'utilise le Charles Web Debugging Proxy, tout fonctionne bien. Sans cela, j'obtiens parfois des erreurs sur le serveur qui ne répond pas.

@lokkju Hmm, qu'en est-il des versions multi-modules ?

je ne les ai pas essayés; key ici semble utiliser aether-deploy, bien qu'il ne le corrige pas entièrement. Je soupçonne que c'est un problème avec le support SSL dans les versions clientes utilisées par chaque outil.

Je vais essayer différentes bibliothèques Java http et voir si je peux remplacer une configuration simple qui fonctionne et ne fonctionne pas. Je vous tiens au courant.

Donc, après plus d'exploration, j'ai trouvé des symptômes intéressants.

En utilisant simplement curl pour essayer de télécharger des packages, j'ai trouvé;

  • Le premier fichier que vous mettez est traité comme l'artefact principal, quel que soit le nom de fichier ou l'extension
  • vous pouvez ensuite télécharger autant de fichiers POM (valides) que vous le souhaitez, tant qu'ils ont des noms uniques
  • vous ne pouvez pas télécharger d'autres fichiers non POM
  • Les fichiers avec les extensions de fichier JAR et POM sont analysés par github, et les formats non valides signaleront une erreur en tant que message de l'erreur HTTP 4xx renvoyée.

La clé à retenir actuellement est que vous devez d'abord télécharger l'artefact JAR, puis publier le POM.

J'ai un e-mail au support, nous verrons s'ils fournissent plus d'informations.

Hmm, donc pas de signature d'artefact non plus, alors ?

Il génère automatiquement les *.md5 et *.sha1 pour tous les fichiers téléchargés.

Aussi, trouvé ceci: 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

Je n'arrive pas du tout à déployer des classificateurs jusqu'à présent, ce qui est gênant et fait partie de ce sur quoi j'ai une question sur github.

Je vais probablement créer un projet maven/java pur et voir si cela fonctionne alors

Je viens d'essayer de déployer un instantané à l'aide de la publication par défaut et j'ai obtenu ceci :

[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

Aucune mention d'instantanés dans les docs

En fait j'ai la même chose pour les packages normaux :

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)

Je me demande à quoi ressemble le corps de ce 400

Y a-t-il des mises à jour à ce sujet ?

Pas encore de mises à jour ! Les expériences de @lokkju sont les dernières, je pense. Je veux jouer un peu plus avec, mais honnêtement, il semble que les packages GitHub ne prennent toujours pas en charge les fichiers d'hébergement qui font partie intégrante d'un distribuable Maven standard (tels que les signatures, la documentation et les classificateurs). Il est difficile de faire quoi que ce soit de pratique avec lui en tant qu'hôte d'artefacts jusqu'à ce qu'ils corrigent ces lacunes.

Quelques informations supplémentaires, test avec sbt 1.3.2 (pas de plugins supplémentaires)

Vous devez publier dans le dépôt de votre projet :

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

les informations d'identification doivent être définies comme ceci

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

Votre jeton a besoin des champs d'application suivants : read:packages , repo et write:packages

mais une fois que vous publiez, vous vous retrouvez avec ces coordonnées de package proposées (où organization="io.test" et name="test") :

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

Les instantanés peuvent être téléchargés, mais ils n'ont probablement pas de traitement spécial car vous ne pouvez pas les télécharger deux fois

Le téléchargement de Pom fonctionne, mais le reste échoue :

[info] a publié test_2.13 sur https://maven.pkg.github.com/ [username]/[project]/io/test/test_2.13/0.0.3/test_2.13-0.0.3.pom
[erreur] java.io.IOException : accès à l'URL https://maven.pkg.github.com/ [nom d'utilisateur]/[projet]/io/test/test_2.13/0.0.3/test_2.13-0.0. 3.jar a été refusé par le serveur : Forbidden response=Erreur : "test_2.13-0.0.3.jar" dans la version 0.0.3 de "io.test.test_2.13" a déjà été publié.

@francisdb Le téléchargement JAR échoue car SBT télécharge les fichiers dans le désordre ; d'après ce dont je me souviens, c'est un bogue de longue date dans SBT (IvyActions.scala) où la fonction de publication utilise un type de carte au lieu du type seq. Avec le passage au système de gestion des dépendances Coursier, cela pourrait se résoudre d'eux-mêmes.

Ma suggestion serait de remplacer le processus de téléchargement lui-même dans ce plugin, en veillant à télécharger le pom en premier. Bien sûr, cela n'aide toujours pas avec les classificateurs, pour lesquels j'ai besoin d'aide.

ressemble à sbt 1.3.2 Coursier n'est pas utilisé pour le téléchargement d'artefacts, uniquement pour le téléchargement

De plus, je n'ai eu aucune réponse de GitHub sur ce problème

Demande d'extraction : #2

Coursier n'est utilisé par défaut qu'à partir de sbt 1.3.0

mon test était avec 1.3.2

@francisdb Compris .

On dirait que Github a changé certaines choses, a pu faire un téléchargement complet aujourd'hui. (vanille 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

L'interface utilisateur Web est toujours confuse au sujet du suffixe sbt

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

C'est excitant! Je vais faire des tests aujourd'hui et voir si je peux fermer ça. Très très excitant.

Je peux confirmer qu'avec quelques ajustements au plugin pour utiliser les résultats expérimentaux de @francisdb , les choses fonctionnent maintenant ! Les problèmes d'interface Web avec les suffixes de construction croisée ne semblent pas affecter la résolution réelle, uniquement l'interface utilisateur. Ainsi, la publication et la résolution fonctionnent désormais avec le plugin. Je n'ai pas encore testé les choses avec un dépôt privé ; je suppose qu'ils ne fonctionnent pas encore tout à fait, mais les choses sont assez bonnes pour que j'ai publié 0.1.0 .

Merci à tous pour votre travail acharné et vos expérimentations ! Le plugin est remarquablement trivial grâce à vous tous.

@francisdb

Les instantanés peuvent être téléchargés, mais ils n'ont probablement pas de traitement spécial car vous ne pouvez pas les télécharger deux fois

Vous _pouvez_ les télécharger deux fois : vous pouvez supprimer un instantané dans l'interface utilisateur GitHub, puis télécharger à nouveau un nouvel instantané (c'est-à-dire la même version d'instantané). Cela a fonctionné pour moi. Un peu encombrant, mais ça marche.

Cette page vous a été utile?
0 / 5 - 0 notes