无法使用 gradle 将 jar 发布到 Gitlab 包注册表

Dim*_*tri 9 gradle gitlab gitlab-ci gradle-kotlin-dsl

我正在尝试在 gitlab 包注册表上发布一些 jar 人工制品,但我从服务器收到此错误:

Received status code 415 from server: Unsupported Media Type
Run Code Online (Sandbox Code Playgroud)

这是我的 build.gradle.kts 的发布部分:

publishing {
    publications {
        create<MavenPublication>("maven"){
            artifact(tasks["bootJar"])
        }
    }
    repositories {
        maven {
            url =  uri("https://gitlab.com/api/v4/groups/my-group/-/packages/maven")
            name = "Gitlab"
            credentials(HttpHeaderCredentials::class) {
                name = "Token"
                value = System.getenv("CI_JOB_TOKEN")
            }
            authentication {
                create<HttpHeaderAuthentication>("header")
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的 gitlab-ci 中,我添加了一个发布人工制品的任务:

deploy:
  stage: deploy
  script: gradle publish
  only:
    - master
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激

Jan*_*Jan 18

快速回答

将指向 group-scope 的发布 url 替换为指向 specific-package-repository 的 url,例如gitlab.com

https://gitlab.com/api/v4/projects/<your-project-id>/packages/maven

当然,您需要替换<your-project-id>为您的特定项目 ID。

与此相关的引用来自docs.gitlab

注意:在所有情况下,您都需要一个项目特定的 URL 来上传 distributionManagement 部分中的包。

或者换句话说:只有常规存储库部分可以使用您的组 URL 来搜索其他已发布的工件!(我也必须明白这一点)。所以:

  • 你不能发布到 gitlab 上的 group-package-store,你可以在那里搜索
  • 发布总是到项目特定的包存储,然后它也将在组范围内可见。

示例 gradle 配置 (kotlin-dsl)

repositories {
    mavenCenter()
    jcenter()

    // Here you USE the group api/v4 url for SEARCHING packages
    maven {
        name = "GitLab"

        url = uri("https://gitlab.com/api/v4/groups/my-group/-/packages/maven")
        credentials(HttpHeaderCredentials::class) {
            name = "Job-Token"
            value = System.getenv("CI_JOB_TOKEN")
        }
        authentication {
            create<HttpHeaderAuthentication>("header")
        }
    }

}

publishing {
    publications {
        create<MavenPublication>("maven"){
            artifact(tasks["bootJar"])
        }
    }
    repositories {
        maven {
            
            // here your PROVIDE the PROJECT-URI for publishing your package
            // in the project-specific package-space which is also visible at
            // the group scope above
            url =  uri("https://gitlab.com/api/v4/projects/<your-project-id>/packages/maven")
            name = "Gitlab"
            credentials(HttpHeaderCredentials::class) {
                name = "Job-Token"
                value = System.getenv("CI_JOB_TOKEN")
            }
            authentication {
                create<HttpHeaderAuthentication>("header")
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

更多信息

关于如何与 GitLab 上的 maven-repository-space 进行交互有多种方案。这三个开关是:

  1. 您要查找现有已发布包的位置
    • 项目范围( https://.../api/v4/projects/<project-id>/packages/maven)
    • 组范围( https://.../api/v4/groups/<group-id>/-/packages/maven)
    • 实例范围( https://.../api/v4/packages/maven)
  2. 您要使用的授权方法
  3. 您想要发布包的地方
    • 这必须始终是特定的项目网址 ( https://.../api/v4/projects/<project-id>/packages/maven)

  • 按照你的回复,我得到了 403:禁止。尝试了所有 3 种令牌(及其各自的标头,ofc)。想知道这里有什么问题吗?我使用的是 gradle 6.5 和 Gitlab 13.6.1 (2认同)