如何使用极狐GitLab 软件包仓库功能托管 maven?

极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有:

  • 极狐GitLab 中文文档
  • 极狐GitLab 中文论坛
  • 极狐GitLab 官网

软件包库中的 Maven 包 (BASIC ALL)

在项目的软件包库中发布 Maven 产物。然后,在需要将它们用作依赖项时安装它们。

对于 Maven 软件包管理器客户端使用的特定 API 端点的文档,请查阅 Maven API 文档。

支持的客户端:

  • mvn。学习如何构建 Maven 包。

  • gradle。学习如何构建 Gradle 包。

  • sbt。

发布到极狐GitLab 软件包库

软件包仓库认证

您需要一个令牌来发布软件包。根据您尝试实现的不同,有不同的令牌可用。有关令牌的指导,请参阅令牌指南。

创建令牌并在后续过程中使用它。

不要使用未在文档中描述的认证方法。未在文档中描述的认证方法可能在未来被删除。

编辑客户端配置

更新您的配置并使用 HTTP 对 Maven 仓库进行认证。

自定义 HTTP 标头

您必须为您的客户端配置文件添加认证详细信息。
::Tabs
:::TabTitle mvn

令牌类型名称必须是令牌
个人访问令牌Private-Token按原样粘贴令牌,或者定义一个环境变量来存储该令牌。
部署令牌Deploy-Token按原样粘贴令牌,或者定义一个环境变量来存储该令牌。
CI 作业令牌Job-Token${CI_JOB_TOKEN}

NOTE:<name> 字段必须命名以匹配您选择的令牌。
将如下内容添加到您的 settings.xml 文件中:

<settings><servers><server><id>gitlab-maven</id><configuration><httpHeaders><property><name>REPLACE_WITH_NAME</name><value>REPLACE_WITH_TOKEN</value></property></httpHeaders></configuration></server></servers>
</settings>

:::TabTitle gradle

令牌类型名称必须是令牌
个人访问令牌Private-Token按原样粘贴令牌,或者定义一个环境变量来存储该令牌。
部署令牌Deploy-Token按原样粘贴令牌,或者定义一个环境变量来存储该令牌。
CI 作业令牌Job-TokenSystem.getenv("CI_JOB_TOKEN")

NOTE:<name> 字段必须命名以匹配您选择的令牌。
在您的 GRADLE_USER_HOME 目录 中,创建一个包含以下内容的文件 gradle.properties:

gitLabPrivateToken=REPLACE_WITH_YOUR_TOKEN

添加 repositories 部分到您的 build.gradle 文件:

  • 在 Groovy DSL 中:
repositories {maven {url "https://gitlab.example.com/api/v4/groups/<group>/-/packages/maven"name "GitLab"credentials(HttpHeaderCredentials) {name = 'REPLACE_WITH_NAME'value = gitLabPrivateToken}authentication {header(HttpHeaderAuthentication)}}
}
  • 在 Kotlin DSL 中:
repositories {maven {url = uri("https://gitlab.example.com/api/v4/groups/<group>/-/packages/maven")name = "GitLab"credentials(HttpHeaderCredentials::class) {name = "REPLACE_WITH_NAME"value = findProperty("gitLabPrivateToken") as String?}authentication {create("header", HttpHeaderAuthentication::class)}}
}

::EndTabs

Basic HTTP 认证

您还可以使用 basic HTTP 认证来和 Maven 软件包仓库进行认证。
::Tabs
:::TabTitle mvn

令牌类型名称必须是令牌
个人访问令牌Private-Token按原样粘贴令牌,或者定义一个环境变量来存储该令牌。
部署令牌Deploy-Token按原样粘贴令牌,或者定义一个环境变量来存储该令牌。
CI 作业令牌gitlab-ci-token${CI_JOB_TOKEN}

将如下内容添加到您的 settings.xml 文件中:

<settings><servers><server><id>gitlab-maven</id><username>REPLACE_WITH_NAME</username><password>REPLACE_WITH_TOKEN</password><configuration><authenticationInfo><userName>REPLACE_WITH_NAME</userName><password>REPLACE_WITH_TOKEN</password></authenticationInfo></configuration></server></servers>
</settings>

:::TabTitle gradle

令牌类型名称必须是令牌
个人访问令牌`Private-Token` 按原样粘贴令牌,或者定义一个环境变量来存储该令牌。
部署令牌Deploy-Token按原样粘贴令牌,或者定义一个环境变量来存储该令牌。
CI 作业令牌gitlab-ci-tokenSystem.getenv("CI_JOB_TOKEN")

在您的 GRADLE_USER_HOME 目录 中,创建一个包含以下内容的文件 gradle.properties:

gitLabPrivateToken=REPLACE_WITH_YOUR_TOKEN

添加 repositories 部分到您的 build.gradle 文件:

  • 在 Groovy DSL 中:
repositories {maven {url "https://gitlab.example.com/api/v4/groups/<group>/-/packages/maven"name "GitLab"credentials(PasswordCredentials) {username = 'REPLACE_WITH_NAME'password = gitLabPrivateToken}authentication {basic(BasicAuthentication)}}
}
  • 在 Kotlin DSL 中:
repositories {maven {url = uri("https://gitlab.example.com/api/v4/groups/<group>/-/packages/maven")name = "GitLab"credentials(BasicAuthentication::class) {username = "REPLACE_WITH_NAME"password = findProperty("gitLabPrivateToken") as String?}authentication {create("basic", BasicAuthentication::class)}}
}

:::TabTitle sbt

令牌类型名称必须是令牌
个人访问令牌Private-Token按原样粘贴令牌,或者定义一个环境变量来存储该令牌。
部署令牌Deploy-Token按原样粘贴令牌,或者定义一个环境变量来存储该令牌。
CI 作业令牌gitlab-ci-tokensys.env.get("CI_JOB_TOKEN").get

对于 SBT 的认证是基于 basic HTTP 认证。所以您必须提供名称和密码。

NOTE:<name> 字段必须命名以匹配您选择的令牌。

要通过使用 sbt 来从 Maven 极狐GitLab 软件包仓库安装软件包,您必须配置 Maven 解析器。如果您访问私人或内部项目或组,您需要设置凭据。

在配置解析器和认证后,您可以从项目,组或命名空间中安装软件包。

在您的 build.sbt 中,添加如下行:

resolvers += ("gitlab" at "<endpoint url>")credentials += Credentials("GitLab Packages Registry", "<host>", "<name>", "<token>")

在此示例中:

  • <endpoint url> 是 端点 URL。示例:https://gitlab.example.com/api/v4/projects/<project_id>/packages/maven。

  • <host><endpoint url> 中的主机,不包括协议方案或端口。示例:gitlab.example.com。

  • <name><token> 详见上表。

::EndTabs

名称约定

您可以使用三种端点中的一种来安装 Maven 软件包。您必须将软件包发布到项目,但是您选择的端点决定您添加到 pom.xml 文件中的设置。
三种端点是:

  • 项目级别:当您有少量 Maven 软件包时使用它,而且他们不在同一个极狐GitLab 群组中。

  • 群组级别:当您想要从相同极狐GitLab 群组的众多不同项目安装软件包时使用它。极狐GitLab 不保证群组中的软件包名称的唯一性。您可以有两个项目具有相同的软件包名称和软件包版本。因此,GitLab 为您提供最新的软件包。

  • 实例级别:当您有许多不同群组的软件包时使用它。

对于实例级别端点,请确保您 Maven pom.xml 中的相关部分如下所示:

  <groupId>group-slug.subgroup-slug</groupId><artifactId>project-slug</artifactId>

仅和项目具有相同路径的软件包 能够通过实例级端点暴露。

项目软件包可用的实例级别的端点
foo/barfoo/bar/1.0-SNAPSHOTYes
gitlab-org/gitlabfoo/bar/1.0-SNAPSHOTNo
gitlab-org/gitlabgitlab-org/gitlab/1.0-SNAPSHOTYes
端点 URL
端点pom.xml 的端点 URL额外信息
项目https://gitlab.example.com/api/v4/projects/<project_id>/packages/mavengitlab.example.com 替换为您的域名名称。 用您的群组 ID 替换 <group_id>,可以在项目概览页面上找到。
群组https://gitlab.example.com/api/v4/groups/<group_id>/-/packages/mavengitlab.example.com 替换为您的域名名称。用您的群组 ID 替换 <group_id>,可以在群组主页上找到 ID。
示例https://gitlab.example.com/api/v4/packages/mavengitlab.example.com 替换为您的域名名称。
编辑发布用的配置文件

您必须为您的客户端配置文件添加认证详细信息。

::Tabs
:::TabTitle mvn
不管你选择哪个端点,你必须有:

  • distributionManagement 部分中有一个项目指定的 URL。
  • 一个 repositorydistributionManagement 部分。

Maven pom.xml 中相关 repository 部分的内容如下:

<repositories><repository><id>gitlab-maven</id><url><your_endpoint_url></url></repository>
</repositories>
<distributionManagement><repository><id>gitlab-maven</id><url>https://gitlab.example.com/api/v4/projects/<project_id>/packages/maven</url></repository><snapshotRepository><id>gitlab-maven</id><url>https://gitlab.example.com/api/v4/projects/<project_id>/packages/maven</url></snapshotRepository>
</distributionManagement>
  • id 是您在 settings.xml 中定义的 ID。

  • <your_endpoint_url> 依赖于您选择的 端点。

  • 将 gitlab.example.com 替换为您的域名。

:::TabTitle gradle
要使用 Gradle 发布软件包:

1.将 Gradle 插件 maven-plugin 添加到插件部分:

  • 在 Groovy DSL 中:
plugins {id 'java'id 'maven-publish'
}
  • 在 Kotlin DSL 中:
plugins {java`maven-publish`
}

2.添加 publishing 部分:

  • 在 Groovy DSL 中:
publishing {publications {library(MavenPublication) {from components.java}}repositories {maven {url "https://gitlab.example.com/api/v4/projects/<PROJECT_ID>/packages/maven"credentials(HttpHeaderCredentials) {name = "REPLACE_WITH_TOKEN_NAME"value = gitLabPrivateToken // the variable resides in $GRADLE_USER_HOME/gradle.properties}authentication {header(HttpHeaderAuthentication)}}}
}
  • 在 Kotlin DSL 中:
publishing {publications {create<MavenPublication>("library") {from(components["java"])}}repositories {maven {url = uri("https://gitlab.example.com/api/v4/projects/<PROJECT_ID>/packages/maven")credentials(HttpHeaderCredentials::class) {name = "REPLACE_WITH_TOKEN_NAME"value =findProperty("gitLabPrivateToken") as String? // the variable resides in $GRADLE_USER_HOME/gradle.properties}authentication {create("header", HttpHeaderAuthentication::class)}}}
}

::EndTabs

发布软件包

WARNING:使用 DeployAtEnd 选项可以导致上传被拒绝 400 bad request {"message":"Validation failed: Name has already been taken"}

在您设置认证和选择发布端点后,发布 Maven 软件包到您的项目。

::Tabs
:::TabTitle mvn
要使用 Maven 发布软件包:

mvn deploy

如果部署成功,构建成功消息应显示为:

...
[INFO] BUILD SUCCESS
...

消息应该显示软件包已成功发布到正确的位置:

Uploading to gitlab-maven: https://example.com/api/v4/projects/PROJECT_ID/packages/maven/com/mycompany/mydepartment/my-project/1.0-SNAPSHOT/my-project-1.0-20200128.120857-1.jar

:::TabTitle gradle
运行发布任务:

gradle publish

前往您项目的 软件包和仓库 页面并查看发布的软件包。

:::TabTitle sbt

在您的 build.sbt 文件中配置 publishTo 设置:

publishTo := Some("gitlab" at "<endpoint url>")

确保正确引用了凭据。查看sbt 文档了解更多信息。
使用 sbt 来发布软件包:

sbt publish

如果部署成功,构建成功消息应显示为:

[success] Total time: 1 s, completed Jan 28, 2020 12:08:57 PM

检查成功消息以确保软件包已成功发布到正确的位置:

[info]  published my-project_2.12 to https://gitlab.example.com/api/v4/projects/PROJECT_ID/packages/maven/com/mycompany/my-project_2.12/0.1.1-SNAPSHOT/my-project_2.12-0.1.1-SNAPSHOT.pom

::EndTabs

安装软件包

要从极狐GitLab 软件包仓库安装软件包,您必须配置远程和认证。当完成这些后,您就可以从项目、群组或命名空间安装软件包了。

如果多个包具有相同的名称和版本,当您安装包时,最近发布的包将被检索。

为了以防没有足够的权限来读取最近发布的包从而导致 403 Forbidden 返回。

::Tabs
:::TabTitle mvn
使用 mvn install 来安装软件包:

1.手动添加依赖到您项目的 pom.xml 文件中。要添加早前创建的示例,XML 如下所示:

<dependency><groupId>com.mycompany.mydepartment</groupId><artifactId>my-project</artifactId><version>1.0-SNAPSHOT</version>
</dependency>

2.在您的项目中,运行如下内容:

mvn install

消息应该展示软件包正在从软件包库下载:

Downloading from gitlab-maven: http://gitlab.example.com/api/v4/projects/PROJECT_ID/packages/maven/com/mycompany/mydepartment/my-project/1.0-SNAPSHOT/my-project-1.0-20200128.120857-1.pom

您还可以使用 Maven dependency:get 命令 直接安装软件包。

1.在您项目的目录中运行:

mvn dependency:get -Dartifact=com.nickkipling.app:nick-test-app:1.1-SNAPSHOT -DremoteRepositories=gitlab-maven::::<gitlab endpoint url>  -s <path to settings.xml>
  • <gitlab endpoint url> is the URL of the GitLab endpoint.

  • <path to settings.xml> is the path to the settings.xml file that contains the authentication details.

  • <gitlab endpoint url> 是极狐GitLab 的端点 URL。

NOTE:命令(gitlab-maven)和 settings.xml 文件中的仓库 ID 必须匹配。

The message should show that the package is downloading from the package registry:

Downloading from gitlab-maven: http://gitlab.example.com/api/v4/projects/PROJECT_ID/packages/maven/com/mycompany/mydepartment/my-project/1.0-SNAPSHOT/my-project-1.0-20200128.120857-1.pom

:::TabTitle gradle
通过使用 gradle 来安装软件包:

在依赖部分,将依赖添加到 build.gradle 中:

  • 在 Groovy DSL 中:
dependencies {implementation 'com.mycompany.mydepartment:my-project:1.0-SNAPSHOT'
}
  • 在 Kotlin DSL 中:
dependencies {implementation("com.mycompany.mydepartment:my-project:1.0-SNAPSHOT")
}

在您的项目中,运行如下命令:

gradle install

:::TabTitle sbt

通过使用 sbt 来安装软件包:

1.将内联依赖 添加到 build.sbt:

libraryDependencies += "com.mycompany.mydepartment" % "my-project" % "8.4"

2.在您的项目中,运行如下命令:

sbt update

::EndTabs

Maven 软件包的 CI/CD 集成

您可以使用 CI/CD 来自动化构建、测试和发布 Maven 软件包。此部分中的示例涵盖了诸如下面情况下的场景:

  • 多模块项目
  • 版本化发布
  • 条件发布
  • 代码质量和安全扫描的集成

您可以根据您的特定项目需求适配和组合这些示例。

记得根据项目需求调整 Maven 版本、Java 版本以及其他相关版本。此外,确保您正确配置了发布到极狐GitLab 软件包库所需的凭据和设置。

基本的 Maven 软件包发布和构建

如下的示例配置了一个构建和发布 Maven 软件包的流水线:

image: maven:3.8.5-openjdk-17variables:MAVEN_CLI_OPTS: "-s .m2/settings.xml --batch-mode"MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"cache:paths:- .m2/repository/- target/stages:- build- test- publishbuild:stage: buildscript:- mvn $MAVEN_CLI_OPTS compiletest:stage: testscript:- mvn $MAVEN_CLI_OPTS testpublish:stage: publishscript:- mvn $MAVEN_CLI_OPTS deployrules:- if: $CI_COMMIT_BRANCH == "main"

具有并行作业的多模块 Maven 项目

对于具有多模块的大型项目,您可以使用并行作业来加速构建过程:

image: maven:3.8.5-openjdk-17variables:MAVEN_CLI_OPTS: "-s .m2/settings.xml --batch-mode"MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"cache:paths:- .m2/repository/- target/stages:- build- test- publishbuild:stage: buildscript:- mvn $MAVEN_CLI_OPTS compiletest:stage: testparallel:matrix:- MODULE: [module1, module2, module3]script:- mvn $MAVEN_CLI_OPTS test -pl $MODULEpublish:stage: publishscript:- mvn $MAVEN_CLI_OPTS deployrules:- if: $CI_COMMIT_BRANCH == "main"

使用标签来版本化发布

下面的示例演示了当标签发布时,创建版本化发布:

image: maven:3.8.5-openjdk-17variables:MAVEN_CLI_OPTS: "-s .m2/settings.xml --batch-mode"MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"cache:paths:- .m2/repository/- target/stages:- build- test- publish- releasebuild:stage: buildscript:- mvn $MAVEN_CLI_OPTS compiletest:stage: testscript:- mvn $MAVEN_CLI_OPTS testpublish:stage: publishscript:- mvn $MAVEN_CLI_OPTS deployonly:- mainrelease:stage: releasescript:- mvn versions:set -DnewVersion=${CI_COMMIT_TAG}- mvn $MAVEN_CLI_OPTS deployrules:- if: $CI_COMMIT_TAG

基于变更进行条件化发布

下面的示例演示了仅当特定文件变更时,发布软件包:

image: maven:3.8.5-openjdk-17variables:MAVEN_CLI_OPTS: "-s .m2/settings.xml --batch-mode"MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"cache:paths:- .m2/repository/- target/stages:- build- test- publishbuild:stage: buildscript:- mvn $MAVEN_CLI_OPTS compiletest:stage: testscript:- mvn $MAVEN_CLI_OPTS testpublish:stage: publishscript:- mvn $MAVEN_CLI_OPTS deployonly:- mainrules:- changes:- pom.xml- src/**/*

集成代码质量和安全扫描

下面的示例演示了将代码质量检查和安全扫描集成到流水线中:

image: maven:3.8.5-openjdk-17variables:MAVEN_CLI_OPTS: "-s .m2/settings.xml --batch-mode"MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"include:- template: Security/SAST.gitlab-ci.yml- template: Code-Quality.gitlab-ci.ymlcache:paths:- .m2/repository/- target/stages:- build- test- quality- publishbuild:stage: buildscript:- mvn $MAVEN_CLI_OPTS compiletest:stage: testscript:- mvn $MAVEN_CLI_OPTS testcode_quality:stage: qualitysast:stage: qualitypublish:stage: publishscript:- mvn $MAVEN_CLI_OPTS deployrules:- if: $CI_COMMIT_BRANCH == "main"

有用的提示

发布具有相同名称和版本的软件包

当您发布和既有软件包具有相同名称和版本的软件包,新的软件包文件会被添加到既有软件包。您还可以使用 UI 或 API 来访问并查看既有软件包的旧文件。

要删除旧软件包版本,请考虑使用软件包 API 或 UI。

不允许重复的 Maven 软件包

  • 在极狐GitLab 15.0 中,所需角色从开发者改为维护者。
  • 在极狐GitLab 17.0 中,所需角色从维护者改为所有者。

要阻止用户发布重复的 Maven 软件包,您可以使用 GraphQl API 或 UI。

在 UI 上:

1.在左侧导航栏,选择 搜索或前往 并找到您的群组。
2.选择 设置 > 软件包与镜像库
3.在 Maven 行中的 允许重复软件包,关闭 允许重复 开关。
4.可选的。在 例外 文本框中,输入与您要允许的包的名称和/或版本匹配的正则表达式 pattern。

您的更改将自动保存。

请求转发至 Maven Central

  • 在极狐GitLab 17.0 中,所需角色从维护者改为所有者。

FLAG:默认情况下,此功能在私有化部署上不可用。要启用此功能,管理员可以启用名称为 maven_central_request_forwarding 的功能标志。此功能在 JihuLab.com 上不可用。

当在软件包仓库中未发现 Maven 软件包,请求会转发到 Maven Central。

当启用功能标志时,管理员可以在持续集成设置中禁用此行为。

Maven 转发被限制到项目级别和群组级别端点。实例级端点具有命名限制,阻止它用于不遵循该约定的包,并且还为供应链式攻击引入了过多的安全风险。

针对 mvn 的额外信息

当使用 mvn 时,有很多种方法来配置您的 Maven 项目,以便它从极狐GitLab 请求 Maven Central 中的包。Maven 仓库按特定顺序查询。默认情况下,Maven Center 通常会先通过 Super POM 进行检查,所以需要配置极狐GitLab 在 maven-central 之前被查询。

要确保所有的软件包请求被发送到极狐GitLab 而不是 Maven Central,您可以通过在 settings.xml 中添加 <mirror> 部分来覆盖 Maven Central 作为中央仓库:

<settings><servers><server><id>central-proxy</id><configuration><httpHeaders><property><name>Private-Token</name><value><personal_access_token></value></property></httpHeaders></configuration></server></servers><mirrors><mirror><id>central-proxy</id><name>GitLab proxy of central repo</name><url>https://gitlab.example.com/api/v4/projects/<project_id>/packages/maven</url><mirrorOf>central</mirrorOf></mirror></mirrors>
</settings>

使用极狐GitLab CI/CD 创建 Maven 软件包

当您配置您的仓库使用 Maven 软件包仓库时,您可以配置极狐GitLab CI/CD 来自动化构建新的软件包。

::Tabs
:::TabTitle mvn

每次当默认分支更新时,您都可以创建一个新软件包。

1.创建 ci_settings.xml 文件,该文件作为 Maven 的 settings.xml 文件。

2.使用您在 pom.xml 文件中定义的相同 ID 来添加 server 部分。例如,使用 gitlab-maven 作为 ID:

<settings xmlns="http://maven.apache.org/SETTINGS/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.1.0 http://maven.apache.org/xsd/settings-1.1.0.xsd"><servers><server><id>gitlab-maven</id><configuration><httpHeaders><property><name>Job-Token</name><value>${CI_JOB_TOKEN}</value></property></httpHeaders></configuration></server></servers>
</settings>

3.确保您的 pom.xml 文件包含如下内容。您可以让 Maven 使用预定义的 CI/CD 变量,如此示例所示,或者您可以硬编码您服务器的主机名和项目 ID。

<repositories><repository><id>gitlab-maven</id><url>${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/maven</url></repository>
</repositories>
<distributionManagement><repository><id>gitlab-maven</id><url>${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/maven</url></repository><snapshotRepository><id>gitlab-maven</id><url>${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/maven</url></snapshotRepository>
</distributionManagement>

4.在您的 .gitlab-ci.yml 文件中添加 deploy 作业:

deploy:image: maven:3.6-jdk-11script:- 'mvn deploy -s ci_settings.xml'rules:- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

5.将这些文件推送到仓库。

下次 deploy 作业运行时,它将 ci_settings.xml 复制到用户的 home 目录中。在此示例中:

  • 用户是 root,因为作业在 Docker 容器中运行。
  • Maven 使用配置的 CI/CD 变量。

:::TabTitle gradle

每当默认分支更新时,您都可以创建一个软件包。

1.在 Gradle 中使用 CI 作业令牌进行认证。

2.在您的 .gitlab-ci.yml 文件中添加 deploy 作业:

deploy:image: gradle:6.5-jdk11script:- 'gradle publish'rules:- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

3.提交文件到您的仓库。

当流水线成功时,Maven 软件包就会被创建。
::EndTabs

版本验证

通过使用如下正则表达式来验证版本字符串。

\A(?!.*\.\.)[\w+.-]+\z

为快照和版本部署使用不同的设置

要为快照和发布使用不同的 URL 或设置:

  • pom.xml<distributionManagement> 部分,定义 <repository><snapshotRepository> 元素。

有用的 Maven 命令行选项

当使用极狐GitLab CI/CD 执行任务时,您可以使用一些有用的 Maven 命令行选项。

文件转移进度使得 CI 日志难以阅读。在 3.6.1 中添加了选项 -ntp,--no-transfer-progress。另外,可以查看 -B,--batch-mode 或更低级的日志更改。

  • 指定找到 pom.xml 文件 (-f,--file)的位置:
package:script:- 'mvn --no-transfer-progress -f helloworld/pom.xml package'
  • 指定找到用户设置(-s,--settings)的位置而不是默认位置。还有一个 -gs,--global-settings 选项:
package:script:- 'mvn -s settings/ci.xml package'

支持的 CLI 命令

极狐GitLab Maven 仓库支持如下的 CLI 命令:

::Tabs
:::TabTitle mvn

  • mvn deploy:发布软件包到软件包仓库。

  • mvn install:在您的 Maven 项目中安装软件包。

  • mvn dependency:get:安装特定的软件包。

:::TabTitle gradle

  • gradle publish:发布您的软件包到软件包仓库。

  • gradle install:在您的 Gradle 项目中安装软件包。

::EndTabs

故障排查

当使用极狐GitLab Maven 软件包仓库时,您可能会遇到问题。为了解决常见的问题,尝试这些步骤:

  • 验证认证 - 确保您的认证令牌正确且未过期。
  • 检查权限 - 确保您有发布或安装软件包的必要权限。
  • 验证 Maven 设置 - 确保您的 settings.xml 文件配置正确。
  • 查看极狐GitLab CI/CD 日志 - 对于 CI/CD 问题,请仔细检查作业日志中的错误消息。
  • 确保正确的端点 URL - 确保您使用正确的项目或组的端点 URL。
  • 使用 -s 选项进行 mvn 命令 - 永远使用 -s 选项,例如,mvn package -s settings.xml。没有该选项,认证设置可能无法应用,Maven 可能无法找到软件包。

清楚缓存

要改善性能,客户端缓存文件与软件包相关联。如果您遇到问题,请使用这些命令清除缓存:

::Tabs
:::TabTitle mvn

rm -rf ~/.m2/repository

:::TabTitle gradle

rm -rf ~/.gradle/caches # Or replace ~/.gradle with your custom GRADLE_USER_HOME

::EndTabs

查看网络跟踪日志

如果您遇到了 Maven 仓库相关的问题,您可能想要查看网络跟踪日志。

比如,使用个人访问令牌运行 mvn deploy 本地并使用这些选项:

mvn deploy \
-Dorg.slf4j.simpleLogger.log.org.apache.maven.wagon.providers.http.httpclient=trace \
-Dorg.slf4j.simpleLogger.log.org.apache.maven.wagon.providers.http.httpclient.wire=trace

WARNING:当您设置这些选项时,所有网络请求都被记录,并生成大量输出。

验证您的 Maven 设置

如果您在 CI/CD 中遇到了与 settings.xml 文件相关的问题,尝试添加一个额外的脚本任务或作业来验证有效设置。

help 插件还能够提供环境变量,包括环境变量:

mvn-settings:script:- 'mvn help:effective-settings'package:script:- 'mvn help:system'- 'mvn package'

当尝试发布软件包时候遇到 “401 Unauthorized” 错误

这通常意味着认证问题。请检查:

  • 您的令牌有效且未过期。
  • 您正在使用正确的令牌类型(个人访问令牌、发布令牌或 CI/CD 作业令牌)
  • 令牌具有必要的权限(apiread_apiread_repository)。
  • 对于 Maven 项目,您应该使用 -s 选项(例如,mvn deploy -s settings.xml)。如果没有该选项,Maven 将不会应用您的 settings.xml 文件中的认证设置,导致未授权错误。

具有 “Validation failed: Version is invalid” 消息的错误 “400 Bad Request”

极狐GitLab 有针对版本字符串的特定要求。确保您的版本符合格式:

^(?!.*\.\.)(?!.*\.$)[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*(\+[0-9A-Za-z-]+)?$

比如,“1.0.0”、“1.0-SNAPSHOT” 和 “1.0.0-alpha” 是有效的,但 “1…0” 或 “1.0.” 不是(符合标准的)。

当发布时提示 “Artifact already exists” 错误

当您尝试发布一个已经存在的软件包时,可能会遇到此错误。要解决此错误:

  • 在发布之前增加您的软件包版本。
  • 如果您使用 SNAPSHOT 版本,确保您在配置中允许覆盖 SNAPSHOT 版本。

未在 UI 中显示已发布的软件包

如果您已经发布了软件包,它可能需要几分钟才能显示。如果它仍然没有显示,则:

  • 确保您有查看软件包的权限。
  • 检查您的 CI/CD 日志或 Maven 输出是否成功发布软件包。
  • 确保您正在查看正确的项目或群组。

Maven 仓库依赖冲突

可以通过如下方法来解决依赖冲突:

  • 在您的 pom.xml 中显式定义版本。
  • 使用 Maven 的依赖管理部分来控制版本。
  • 使用 <exclusions> 标签来排除冲突的传递依赖。

“Unable to find valid certification path to requested target” 错误

这是一个典型的 SSL 证书错误。要解决此问题:

  • 确保您的 JDK 信任极狐GitLab 服务器的 SSL 证书。
  • 如果使用自签名证书,请将其添加到您的 JDK 的信任存储库。
  • 作为最后的选择,您可以在 Maven 设置中禁用 SSL 验证。不推荐在生产环境中使用。

“No plugin found for prefix” 流水线错误

这通常意味着 Maven 无法找到插件。要修复此问题:

  • 确保插件正确定义在您的 pom.xml 中。
  • 检查您的 CI/CD 配置是否使用正确的 Maven 设置文件。
  • 确保您的流水线有访问所有必要的仓库的权限。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/80419.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业如何将钉钉付款单高效集成到金蝶云星空?

钉钉数据集成到金蝶云星空&#xff1a;修改下推的付款单③ 在企业信息化系统中&#xff0c;数据的高效流转和准确对接是实现业务流程自动化的关键。本文将分享一个实际案例&#xff0c;展示如何通过轻易云数据集成平台&#xff0c;将钉钉中的付款单数据无缝集成到金蝶云星空系…

python 实现文件批量重命名

以下是使用Python实现文件批量重命名的示例代码。该代码可以将指定目录下的文件按照一定规则进行重命名,这里以将文件重命名为带有编号的文件名为例: import osdef batch_rename(directory):if not os.path.isdir(directory):print(

Pandas学习笔记(四)

DataFrame对象 文章目录 DataFrame对象导入本文需要的包DataFrame与Series的相似之处使用read_csv函数导入DataFrameSeries和DataFrame的共享与专有属性Series和DataFrame的共有方法 对DataFrame进行排序按照单列进行排序按照多列进行排序按照索引进行排序对列索引进行排序 设置…

DA14585墨水屏学习(2)

一、user_svc2_wr_ind_handler函数 void user_svc2_wr_ind_handler(ke_msg_id_t const msgid,struct custs1_val_write_ind const *param,ke_task_id_t const dest_id,ke_task_id_t const src_id) {// sprintf(buf2,"HEX %d :",param->length);arch_printf("…

树莓派5+Ubuntu24.04 LTS串口通信 保姆级教程

【背景】 各位&#xff0c;除了树莓派4B之外&#xff0c;我又搞了个树莓派5, 装的也是Ubuntu24.04 LTS服务器版。装系统的方法跟树莓派4B一样&#xff0c;没什么好说的。装完了系统之后&#xff0c;我就想装个wiringPi来试试串口&#xff0c;却发现这个树莓派5的串口和树莓派4…

【QT】UDP通讯本地调试

qt已经写好了udp通讯代码&#xff0c;现在要进行测试。 1、终端输入ipconfig查看本机网卡的ipv4地址 2、 用udpBind函数&#xff0c;绑定到此ip和自定义的端口号。 3、 打开网络调试助手&#xff0c;自动检测到本机的ip地址&#xff0c;输入任意一个和程序里不一样的端口号。 …

在 Elasticsearch 中连接两个索引

作者&#xff1a;来自 Elastic Kofi Bartlett 解释如何使用 terms query 和 enrich processor 来连接 Elasticsearch 中的两个索引。 更多有关连接两个索引的查询&#xff0c;请参阅文章 “Elastic&#xff1a;开发者上手指南” 中的 “丰富数据及 lookup” 章节。 Elasticsea…

LabVIEW的PID参数自适应控制

在工业控制领域&#xff0c;PID 控制凭借结构简单、稳定性好、工作可靠等优点被广泛应用。然而&#xff0c;传统固定参数的 PID 控制在面对复杂多变的工况时&#xff0c;控制效果往往难以达到最优。基于 LabVIEW 实现 PID 控制根据情况选择参数&#xff08;即参数自适应调整&am…

[redis进阶四]分布式系统之哨兵(2)

目录 一 利用docker搭建环境 板书: 一)准备⼯作: 板书: 解读docker配置文件: 1)安装docker和docker-compose 2) 停⽌之前的redis-server 3) 使⽤docker获取redis镜像 二)编排redis主从节点 板书:​编辑 1) 编写docker-compose.yml 2) 启动所有容器 3) 查看运⾏⽇志 …

spark-Schema 定义字段强类型和弱类型

在数据处理和存储中&#xff0c;Schema&#xff08;模式&#xff09;定义了数据的结构和字段属性&#xff0c;其中字段的强类型和弱类型是重要的概念&#xff0c;直接影响数据的验证、存储和处理方式。以下是详细解释&#xff1a; 1. 强类型&#xff08;Strongly Typed&#x…

2024睿抗编程赛国赛-题解

2024睿抗编程赛国赛题解 RC-u1 大家一起查作弊 题目重述 我们需要从给定的多行字符串中提取出所有的关键词&#xff0c;并计算这些关键词的可疑分数总和、总长度以及关键词的数量。具体步骤如下&#xff1a; 关键词定义&#xff1a;由大写字母、小写字母、数字组成的字符串&a…

控制LED灯设备

本章分别使用C库和系统调用的文件操作方式控制开发板的LED灯&#xff0c;展示如何在应用层通过系统提供的设备文件控制相关硬件。 本章的示例代码目录为&#xff1a;base_code/linux_app/led/sys_class_leds。 9.1. LED子系统 在Linux系统中&#xff0c;绝大多数硬件设备都有…

SpringBoot学习(上) , SpringBoot项目的创建(IDEA2024版本)

目录 1. SpringBoot介绍 SpringBoot特点 2. SpringBoot入门 2.1 创建SpringBoot项目 Spring Initialize 第一步: 选择创建项目 第二步: 选择起步依赖 第三步: 查看启动类 2.2 springboot父项目 2.3 测试案例 2.3.1 数据库 2.3.2 生成代码 1. SpringBoot介绍 Spring B…

在 Ubuntu 中配置 Samba 实现「特定用户可写,其他用户只读」的共享目录

需求目标 所有认证用户可访问 Samba 共享目录 /path/to/home&#xff1b;**仅特定用户&#xff08;如 developer&#xff09;**拥有写权限&#xff1b;其他用户仅允许读取&#xff1b;禁止匿名访问。 配置步骤 1. 设置文件系统权限 将目录 /home3/guest 的所有权设为 develo…

ENSP-OSPF综合实验

AR4中通过ospf获取的其他区域路由信息&#xff0c;并且通过路由汇总后简化路由信息 实现全网通&#xff0c;以及单向重发布&#xff0c;以及通过缺省双向访问&#xff0c; 通过stub简化过滤四类五类lsa&#xff0c;简化ospf路由信息 通过nssa简化ospf信息 区域汇总简化R4路由信…

linux(centos)联网情况下部署

nginx部署 1.linux(centos)联网情况下部署 1.下载nginx所需依赖 # 安装开发工具组&#xff08;若未安装&#xff09; sudo yum groupinstall "Development Tools"# 安装 OpenSSL 开发包 sudo yum install openssl-devel# 安装 PCRE 开发包 sudo yum install pcre-…

LeetCode 1550.存在连续三个奇数的数组:遍历

【LetMeFly】1550.存在连续三个奇数的数组&#xff1a;遍历 力扣题目链接&#xff1a;https://leetcode.cn/problems/three-consecutive-odds/ 给你一个整数数组 arr&#xff0c;请你判断数组中是否存在连续三个元素都是奇数的情况&#xff1a;如果存在&#xff0c;请返回 tr…

Android Framework学习四:init进程实现

文章目录 init流程简介init源码执行顺序执行顺序 init进程的具体工作事项挂载文件系统设置 SELinuxSecondStageMaininit.rc启动zygote和serviceManager进程的重要性serviceManager工作原理 Framework学习之系列文章 init流程简介 下面图片主要围绕 Android 系统中init进程的运…

HTTP/3展望、我应该迁移到HTTP/2吗

1. HTTP/3展望 HTTP/3 基于 QUIC 协议&#xff0c;完全解决了“队头阻塞”问题&#xff0c;弱网环境下的表现会优于 HTTP/2&#xff1b;QUIC 是一个新的传输层协议&#xff0c;建立在 UDP 之上&#xff0c;实现了可靠传输&#xff1b;QUIC 内含了 TLS1.3&#xff0c;只能加密通…

【大模型面试每日一题】Day 15:流水线并行的Bubble问题及其缓解方法

【大模型面试每日一题】Day 15&#xff1a;流水线并行的Bubble问题及其缓解方法 &#x1f4cc; 题目重现 &#x1f31f;&#x1f31f; 面试官&#xff1a;解释流水线并行&#xff08;Pipeline Parallelism&#xff09;的bubble问题及其缓解方法。 #mermaid-svg-Uz7WGsO8akW5F…