2

我创建了一个 Codefresh 管道来将工件部署到 Gitlab 包注册表。源代码也在 Gitlab 中。

我可以使用 Gitlab 个人访问令牌发布我的工件,但是当我尝试使用 Gitlab 部署令牌进行发布时,无论我是否使用 Codefresh,它都会失败(401 未经授权的错误)。

我已经使用 Gradle 定义了这个,以发布到 Gitlab 包注册表:

    repositories {
        maven {
            url "https://gitlab.com/api/v4/projects/<group_id>/packages/maven"
            credentials(HttpHeaderCredentials) {
                name = "Private-Token"
                value = '<private_token>'
            }
            authentication {
                header(HttpHeaderAuthentication)
            }
        }
    }

我使用权利<group_id><private_token>价值观,出于安全原因,它们在此处进行了更改。

如果我在 中提供我的个人访问令牌<private_token>,我可以毫无问题地发布到 Gitlab 包注册表。但是当我使用生成的部署令牌时,它会失败。我的个人访问令牌和部署令牌都具有相同的名称和用户名(在部署令牌的情况下)。

我收到 401 未经授权的错误:

* What went wrong:
Execution failed for task ':publishMavenJavaPublicationToMavenRepository'.
> Failed to publish publication 'mavenJava' to repository 'maven'
   > Could not write to resource 'https://gitlab.com/api/v4/projects/<group_id>/packages/maven/mypackageroute/mypackage/0.1/mypackage-0.1.jar'.
      > Could not PUT 'https://gitlab.com/api/v4/projects/<group_id>/packages/maven/mypackageroute/mypackage/0.1/mypackage-0.1.jar'. Received status code 401 from server: Unauthorized

有谁知道我做错了什么?非常感谢

4

2 回答 2

2

使用部署令牌时需要设置name为,即"Deploy-Token"

repositories {
    maven {
        url "https://gitlab.com/api/v4/projects/<group_id>/packages/maven"
        credentials(HttpHeaderCredentials) {
            name = "Deploy-Token"
            value = '<deploy_token>'
        }
        authentication {
            header(HttpHeaderAuthentication)
        }
    }
}

Private-Token用于个人访问令牌和Job-TokenCI 访问令牌。

请注意,这里name是添加到 http 请求的标头名称,与令牌本身的名称或用户名无关。

于 2021-03-20T17:44:57.683 回答
1

主要问题是在您的 gradle 脚本中,您使用基于标头的身份验证,而相反,您需要使用基本身份验证。

为了使带有部署令牌的 gradle 发布工作,您必须使用PasswordCredentials+ basic(BasicAuthentication)

repositories {
        maven {
            url "https://gitlab.com/api/v4/projects/<project_id>/packages/maven"
            credentials(PasswordCredentials) {
                name = <username>
                password = <password>
            }
            authentication {
                basic(BasicAuthentication)
            }
        }
    }
于 2020-11-30T10:20:44.637 回答