问题描述
我创建了一个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
有人知道我在做什么错吗? 非常感谢
解决方法
使用 deploy token 时需要将 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-Token
用于 CI 访问令牌。
请注意,name
是添加到 http 请求的标头名称,与令牌本身的名称或用户名无关。
主要问题是在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)
}
}
}