為什麼要將 maven repo 部署到 Gitlab

  1. 將 Maven artifacts 放在對應的專案倉庫下,而不是專門再去建一個 Maven 倉庫。這麼做使用起來更方便,更易於管理。

  2. 藉助 Gitlab CI/CD 自動部署 Maven artifacts,減少人力投入和不必要的人為錯誤。

最小版本要求

  • Java:11.0.5+
  • Maven:3.6+
  • Gitlab:11.3+

構建步驟

Gitlab 設定

首先你需要建立一個 Gitlab 專案,或者你應該是一個已有專案的管理員。

當你建立好專案之後,你應該能在側欄看到 Packages & Registries。如果沒有這個選項,你需要聯絡你的 Gitlab 管理員開啟此選項。

你需要在專案設定 Settings > Access Tokens 中設定專案令牌,注意 Scopes 應該要選擇 api。當你點選 Create project access token 之後,Gitlab 會為你生成一個令牌,你必須小心謹慎地將它儲存起來,因為這個頁面重新整理之後你就再也無法看到這個 token 了。

在專案設定 Settings > CI/CD > Runners 中你可以看到註冊 Runner 時需要用到的 URL 與 Token。

此外,強烈推薦Settings > CI/CD > Variables 中設定 PRIVATE_TOKEN、CI_SERVER_URL、CI_PROJECT_ID 三個變數,這些變數在後面的專案設定中會有很大的用處。其中 CI_PROJECT_ID 可以在 Project overview > details 中找到。

構建 Gitlab Runner

構建 Runner,你需要另外一臺主機/虛擬機器。

構建 Runner 有多種方式,我這邊採用 Docker 方式。

為了儲存 register 的配置,我掛載了一個 volume:/srv/gitlab-runner/config

$ docker run --rm -it -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register
Runtime platform arch=amd64 os=linux pid=9 revision=54944146 version=13.10.0
Running in system-mode. Enter the GitLab instance URL (for example, https://gitlab.com/):
這裡填寫上一步得到的 URL
Enter the registration token:
這裡填寫上一步得到的 Token
Enter a description for the runner:
[5edf4287b599]: 這裡填寫 runner 的名稱
Enter tags for the runner (comma-separated):
這裡填寫 tags,只有在 CI/CD 中指定了 tag,才會用到這個 runner
Registering runner... succeeded runner=r59ARoTS
Enter an executor: custom, docker-ssh+machine, ssh, virtualbox, docker+machine, kubernetes, docker, docker-ssh, parallels, shell:
這裡填寫 executor
Enter the default Docker image (for example, ruby:2.6):
這裡填寫預設的 Docker 映象
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded! $ docker run -d --name gitlab-runner --restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner
# 這裡掛載的 volume 需要與 register 的相同

其他構建方式可以檢視官方文件:

https://docs.gitlab.com/runner/install/docker.html#register-the-runner

https://docs.gitlab.com/runner/register/index.html#docker

專案配置

pom.xml

你需要在專案的 pom.xml 檔案中引入以下內容,其中 ${env.CI_SERVER_URL}${env.CI_PROJECT_ID}是上一步新增的變數,這也正是它的作用之處。放在 Gitlab 中設定而非直接寫死在專案檔案中,有更好的通用性和安全性。

	<repositories>
<repository>
<id>your-server-id</id>
<url>${env.CI_SERVER_URL}/api/v4/projects/${env.CI_PROJECT_ID}/packages/maven</url>
</repository>
</repositories> <distributionManagement>
<repository>
<id>your-server-id</id>
<url>${env.CI_SERVER_URL}/api/v4/projects/${env.CI_PROJECT_ID}/packages/maven</url>
</repository>
<snapshotRepository>
<id>your-server-id</id>
<url>${env.CI_SERVER_URL}/api/v4/projects/${env.CI_PROJECT_ID}/packages/maven</url>
</snapshotRepository>
</distributionManagement>

ci_settings.xml

此檔案放在專案的根目錄下,用於指定 Maven 的配置。其中 id 需要與 pom.xml 中的 id 對應,name 必須為 Private-Token,value 我們已經配置在 Gitlab 倉庫的變數中了。

<?xml version="1.0" encoding="UTF-8"?>
<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>your-server-id</id>
<configuration>
<httpHeaders>
<property>
<name>Private-Token</name>
<value>${env.PRIVATE_TOKEN}</value>
</property>
</httpHeaders>
</configuration>
</server>
</servers>
</settings>

.gitlab-ci.yml

此檔案放在專案的根目錄下,用於指定 CI/CD 相關的配置。如果你在構建 Runner 的時候指定了 tags,那麼你需要在此處指定對應的 tag,否則 CI/CD 無法在這個 Runner 上執行。

deploy:
image: maven:3.6.3-jdk-11
variables:
CMD: |
mvn deploy -s ci_settings.xml
script:
- bash -c "${CMD}"
only:
- master

Gitlab 官方 CI/CD 文件:https://docs.gitlab.com/ee/ci/

如何釋出

只要 master 分支發生改變,CI/CD 會自動部署到 Gitlab Maven Repo。

在 Packages & Registries > Package Registry 中,就可以看到我們釋出的 Package 了。

點選對應的 Package 有詳細的使用說明。

參考文件:

https://docs.gitlab.com/ee/user/packages/maven_repository/index.html

https://docs.gitlab.com/runner/install/docker.html#register-the-runner

https://docs.gitlab.com/runner/register/index.html#docker