如何使用極狐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.pswp.cn/pingmian/80419.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/80419.shtml
英文地址,請注明出處:http://en.pswp.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…