極狐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-Token | System.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-token | System.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-token | sys.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/bar | foo/bar/1.0-SNAPSHOT | Yes |
gitlab-org/gitlab | foo/bar/1.0-SNAPSHOT | No |
gitlab-org/gitlab | gitlab-org/gitlab/1.0-SNAPSHOT | Yes |
端點 URL
端點 | pom.xml 的端點 URL | 額外信息 |
---|---|---|
項目 | https://gitlab.example.com/api/v4/projects/<project_id>/packages/maven | 將 gitlab.example.com 替換為您的域名名稱。 用您的群組 ID 替換 <group_id> ,可以在項目概覽頁面上找到。 |
群組 | https://gitlab.example.com/api/v4/groups/<group_id>/-/packages/maven | 將 gitlab.example.com 替換為您的域名名稱。用您的群組 ID 替換 <group_id> ,可以在群組主頁上找到 ID。 |
示例 | https://gitlab.example.com/api/v4/packages/maven | 將 gitlab.example.com 替換為您的域名名稱。 |
編輯發布用的配置文件
您必須為您的客戶端配置文件添加認證詳細信息。
::Tabs
:::TabTitle mvn
不管你選擇哪個端點,你必須有:
- 在
distributionManagement
部分中有一個項目指定的 URL。 - 一個
repository
和distributionManagement
部分。
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 作業令牌)
- 令牌具有必要的權限(
api
、read_api
或read_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 設置文件。
- 確保您的流水線有訪問所有必要的倉庫的權限。