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.
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é;
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
Hmmm... Je viens de jeter un coup d'œil très rapide. sbt 1.2.8 est toujours utilisé ici partout :
https://github.com/djspiewak/sbt-github-packages/blob/0839b97dea06100a202f2a105cbe83873784bf77/build.sbt#L28
https://github.com/djspiewak/sbt-github-packages/blob/0839b97dea06100a202f2a105cbe83873784bf77/src/sbt-test/sbtghpackages/publish/project/build.properties#L1
https://github.com/djspiewak/sbt-github-packages/blob/0839b97dea06100a202f2a105cbe83873784bf77/project/build.properties#L1
(Peut-être en a-t-il manqué cependant)
Je suppose que ces mises à niveau ont besoin?
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.
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)
L'interface utilisateur Web est toujours confuse au sujet du suffixe sbt