【问题标题】:Publishing GitHub Packages returns 422 error发布 GitHub 包返回 422 错误
【发布时间】:2021-01-27 00:27:05
【问题描述】:

我在一个 Android 项目中使用 GitHub 包已经有一段时间了,没有任何问题。 现在,当我尝试发布一个新包时,我得到了错误:

无法 PUT 收到来自服务器的状态代码 422:无法处理的实体

为了确保我没有更改任何内容,我回到了几天前成功发布包的 git-tag,我只更改了版本以生成不同的包。我得到同样的错误。

我添加了日志,我可以看到令牌已正确读取,所有值(GROUP、VERSION 等)似乎都正确,并且我尝试发布的文件位于正确的文件夹中。 我还尝试创建和使用新令牌,以防旧令牌出现问题但没有帮助。

如果我发布了太多文件,GitHub 会拒绝发布该错误吗?我没有找到有关您在这种情况下遇到的错误的任何文档。

编辑

我还尝试创建一个新项目并发布到该项目,以防万一最初的项目出现问题,但它也不起作用。

我尝试使用 CURL 直接 PUT 一个文件,这意味着令牌是正确的,问题不在于已发布包的总大小限制:

curl -X PUT \
"https://maven.pkg.github.com/companyname/repositoryname/com/companyname/artifactid/v2.1.520/artifactid-v2.1.520.aar" \
-H "Authorization: token mytoken” \
--upload-file “/full/path/to/file.aar" -vvv

当然,这不是解决方案,因为我需要使用 pom 等发布 maven repo。

结束编辑

这里我的配置已经工作了很长时间,并且只是按照文档+我添加的用于调查问题的日志。

build.gradle

allprojects {
    repositories {
        google()
        jcenter()
        maven {
            name = "GitHubPackages"
            url = uri("https://maven.pkg.github.com/companyname/companyname-android-sdk")
            credentials {
                username = project.findProperty("gpr.user") ?: System.getenv("GitHubPackagesUsername")
                password = project.findProperty("gpr.key") ?: System.getenv("GitHubPackagesToken")
                println "GitHubPackages build.gradle\n\tusername=$username\n\ttoken=$password"
            }
        }
    }
}

publish-artifacts.gradle:

publishing {
    repositories {
        maven {
            name = "GitHubPackages"
            url = uri("https://maven.pkg.github.com/companyname/companyname-android-sdk")
            credentials {
                username = project.findProperty("gpr.user") ?: System.getenv("GitHubPackagesUsername")
                password = project.findProperty("gpr.key") ?: System.getenv("GitHubPackagesToken")
                println "GitHubPackages Publish Artifact:\n\tusername=$username\n\ttoken=$password"
            }
        }
    }

    publications {
        gpr(MavenPublication) {
            println "\tskSdkVersion=$SK_SDK_VERSION\n\tarchivesBaseName=$archivesBaseName\n\tGROUP=$GROUP\n\tdesciption=$POM_DESCRIPTION"
            println "artifact from $buildDir/outputs/aar/$archivesBaseName-${VARIANT_SUFFIX}.aar"
            groupId SK_GROUP
            version SK_SDK_VERSION
            artifactId archivesBaseName
            artifact "$buildDir/outputs/aar/$archivesBaseName-${VARIANT_SUFFIX}.aar"
            description POM_DESCRIPTION
            pom.packaging POM_PACKAGING
            pom.withXml {
                def dependenciesNode = asNode().appendNode('dependencies')
                configurations.implementation.allDependencies.each {
                    println "dependency=$it"
                    def dependencyNode = dependenciesNode.appendNode('dependency')
                    dependencyNode.appendNode('groupId', it.group)
                    dependencyNode.appendNode('artifactId', it.name)
                    dependencyNode.appendNode('version', it.version)
                }
            }
        }
    }
}

gradle.properties 文件中:

POM_NAME=PackageName
POM_PACKAGING=aar
GROUP=com.companyname
POM_DESCRIPTION=CompanyName SDK Core library

VARIANT_SUFFIX 是从环境变量中设置的。

archivesBaseName 设置在模块的build.gradle

【问题讨论】:

  • gpr 块有什么用?
  • @IgorGanapolsky 它告诉 Gradle 需要发布的工件,它们的 pom 文件声明了依赖关系等。gpr 只是一个名称。我有两个:gprgprStaging
  • 您在哪里声明gprgprStaging 名称? gradle 如何知道如何解释它们。
  • @IgorGanapolsky 你用那行声明它。这是隐藏你实际在做什么的(可怕的?)时髦的方式。在 kotlin 中,它将是 create<MavenPublication>("gpr") {。请查收:docs.gradle.org/current/userguide/publishing_maven.html

标签: android gradle github-package-registry


【解决方案1】:

您可以尝试降低您的工件 ID 的大小写吗? 我遇到了同样的问题,并且将其小写使其正常工作。

参考:https://github.community/t/gradle-maven-deploy-failing-with-422-unprocessable-entity/137299/3

【讨论】:

  • Github 似乎在这里改变了一些东西。以太他们允许大写字符或者他们将它们重写为小写。无论如何 - 这修复了我 4 个月前工作的发布版本,我这边没有任何代码更改:)
  • 这不再有效。 Github 已经改变了它。发布到 GitHub Packages 时出现的大多数 422 错误似乎与工件已经与不同的 repo 相关联的事实有关(请参阅@gridcell-coder 的答案)。如果您使用 gradle 或 mvn 发布,您只会看到一个通用的“422 Unprocessable Entity”,但如果您直接执行 PUT 请求(例如使用 Postman),您会看到完整的错误“Package xxx is already associated with another repository”。
  • 大声笑,这为我解决了!谢谢+1
【解决方案2】:

在我的情况下,当工件的名称为 apiserviceserde 时,它被阻止了。例如。这工作 <artifactId>database-ervice</artifactId> 这没有没有数据库服务

编辑: 当使用 Postman 执行 put 请求时,我得到了

Package "io.XXX.mydomain.xyz-service" is already associated with another repository. 意识到该软件包先前已部署在另一个 repo 中。

maven-deployer-plugin 非常不善于报告 PUT 响应的错误消息,因此不得不使用 mintm 查找 url 并使用 Postman 来找出消息。

【讨论】:

  • 似乎除了更改工件/组名称之外别无他法,或者从以前的仓库中删除工件。用户/组织只能从一个存储库发布具有相同组-工件组合的工件。
猜你喜欢
  • 2016-11-29
  • 1970-01-01
  • 2019-12-04
  • 1970-01-01
  • 2021-12-19
  • 2013-02-27
  • 2020-05-12
  • 2022-01-05
  • 1970-01-01
相关资源
最近更新 更多