Prohoster > Blog > quản lý > Thiết lập GitLab CI để tải dự án java lên trung tâm maven
Thiết lập GitLab CI để tải dự án java lên trung tâm maven
Bài viết này dành cho các nhà phát triển java, những người cần nhanh chóng xuất bản sản phẩm của họ lên kho lưu trữ trung tâm sonatype và/hoặc maven bằng GitLab. Trong bài viết này, tôi sẽ nói về việc thiết lập gitlab-runner, gitlab-ci và maven-plugin để giải quyết vấn đề này.
Điều kiện tiên quyết:
Lưu trữ an toàn các khóa mvn và GPG.
Thực hiện an toàn các nhiệm vụ CI công cộng.
Tải các tạo phẩm (phát hành/ảnh chụp nhanh) lên kho lưu trữ công cộng.
Tự động kiểm tra các phiên bản phát hành để xuất bản ở trung tâm maven.
Một giải pháp chung để tải các tạo phẩm lên kho lưu trữ cho nhiều dự án.
Mô tả chi tiết về cơ chế xuất bản các tạo phẩm lên Maven Central thông qua Dịch vụ lưu trữ kho lưu trữ Sonatype OSS đã được mô tả trong bài viết này người sử dụng Googolplex, vì vậy tôi sẽ tham khảo bài viết này ở những nơi thích hợp.
Đăng ký trước tại Sonatype JIRA và bắt đầu một vé để mở kho lưu trữ (để biết thêm chi tiết, hãy đọc phần Tạo vé Sonatype JIRA). Sau khi mở kho lưu trữ, cặp thông tin đăng nhập/mật khẩu JIRA (sau đây gọi là tài khoản Sonatype) sẽ được sử dụng để tải các tạo phẩm lên mối quan hệ Sonatype.
Nếu bạn đang sử dụng bảng điều khiển Linux để tạo khóa GPG (gnupg/gnupg2), thì bạn cần cài đặt rng-công cụ để tạo ra entropy. Nếu không, việc tạo khóa có thể mất nhiều thời gian.
Trước hết, bạn cần tạo và định cấu hình một dự án trong đó quy trình sẽ được lưu trữ để triển khai các tạo phẩm. Tôi gọi dự án của mình một cách đơn giản và không phức tạp - triển khai
Sau khi tạo kho lưu trữ, bạn cần hạn chế quyền truy cập để thay đổi kho lưu trữ.
Chuyển đến dự án -> Cài đặt -> Kho lưu trữ -> Chi nhánh được bảo vệ. Chúng tôi xóa tất cả các quy tắc và thêm một quy tắc duy nhất với Wildcard * với quyền đẩy và hợp nhất chỉ dành cho người dùng có vai trò Người bảo trì. Quy tắc này sẽ có hiệu lực đối với tất cả người dùng của cả dự án này và nhóm mà dự án này thuộc về.
Nếu có một số người bảo trì, thì giải pháp tốt nhất về nguyên tắc là hạn chế quyền truy cập vào dự án.
Chuyển đến dự án -> Cài đặt -> Chung -> Khả năng hiển thị, tính năng dự án, quyền và đặt Chế độ hiển thị dự án thành Riêng.
Tôi có một dự án được truy cập công khai vì tôi sử dụng GitLab Runner của riêng mình và chỉ tôi mới có quyền truy cập để sửa đổi kho lưu trữ. Chà, thực ra tôi không có lợi khi hiển thị thông tin cá nhân trong nhật ký đường dẫn công cộng.
Siết chặt quy định về thay đổi kho lưu trữ
Đi tới dự án -> Cài đặt -> Kho lưu trữ -> Quy tắc đẩy và đặt cờ Hạn chế người gửi, Kiểm tra xem tác giả có phải là người dùng GitLab hay không. Tôi cũng khuyên bạn nên thiết lập ký cam kếtvà đặt cờ Từ chối cam kết không dấu.
Tiếp theo, bạn cần định cấu hình trình kích hoạt để chạy tác vụ
Đi tới dự án -> Cài đặt -> CI / CD -> Trình kích hoạt đường ống và tạo mã thông báo kích hoạt mới
Mã thông báo này có thể được thêm ngay vào cấu hình chung của các biến cho một nhóm dự án.
Vào nhóm -> Cài đặt -> CI/CD -> Biến và thêm biến DEPLOY_TOKEN với mã thông báo kích hoạt trong giá trị.
Phần này mô tả cấu hình để chạy các tác vụ khi triển khai bằng cách sử dụng trình chạy gốc (Cụ thể) và công khai (Được chia sẻ).
Người chạy cụ thể
Tôi sử dụng máy chạy bộ của riêng mình vì trước hết nó tiện, nhanh, rẻ.
Đối với người chạy, tôi khuyên dùng Linux VDS với 1 CPU, RAM 2 GB, ổ cứng 20 GB. Giá phát hành ~ 3000₽ mỗi năm.
Á hậu của tôi
Đối với người chạy, tôi lấy CPU VDS 4, RAM 4 GB, SSD 50 GB. Nó có giá ~11000₽ và không bao giờ hối hận.
Tôi có tổng cộng 7 máy. 5 trên aruba và 2 trên ihor.
Vì vậy, chúng tôi có một Á hậu. Bây giờ chúng ta sẽ thiết lập nó.
Chúng ta vào máy thông qua SSH và cài đặt java, git, maven, gnupg2.
Runtime platform arch=amd64 os=linux pid=17594 revision=3001a600 version=11.10.0
Running in system-mode.
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
https://gitlab.com/
Please enter the gitlab-ci token for this runner:
REGISTRATION_TOKEN
Please enter the gitlab-ci description for this runner:
[ih1174328.vds.myihor.ru]: Deploy Runner
Please enter the gitlab-ci tags for this runner (comma separated):
deploy
Registering runner... succeeded runner=ZvKdjJhx
Please enter the executor: docker-ssh, parallels, virtualbox, docker-ssh+machine, kubernetes, docker, ssh, docker+machine, shell:
shell
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
Kiểm tra xem người chạy đã được đăng ký chưa. Truy cập gitlab.com -> triển khai dự án -> Cài đặt -> CI/CD -> Người chạy -> Người chạy cụ thể -> Người chạy được kích hoạt cho dự án này
Chúng tôi tạo ra một chìa khóa bằng cách trả lời các câu hỏi. Tôi đã sử dụng tên và email của riêng tôi.
Hãy chắc chắn chỉ định mật khẩu cho khóa. Hiện vật sẽ được ký bằng chìa khóa này.
gpg --gen-key
Kiểm tra
gpg --list-keys -a
/home/gitlab-deployer/.gnupg/pubring.gpg
----------------------------------------
pub 4096R/00000000 2019-04-19
uid Petruha Petrov <[email protected]>
sub 4096R/11111111 2019-04-19
Tải khóa công khai của chúng tôi lên máy chủ khóa
gpg --keyserver keys.gnupg.net --send-key 00000000
gpg: sending key 00000000 to hkp server keys.gnupg.net
Thêm tệp .gitlab-ci.yml vào thư mục gốc của dự án triển khai
Kịch bản trình bày hai nhiệm vụ triển khai loại trừ lẫn nhau. Người chạy cụ thể hoặc Người chạy chung tương ứng.
.gitlab-ci.yml
stages:
- deploy
Specific Runner:
extends: .java_deploy_template
# Задача будет выполняться на вашем shell-раннере
tags:
- deploy
Shared Runner:
extends: .java_deploy_template
# Задача будет выполняться на публичном docker-раннере
tags:
- docker
# Образ из раздела GitLab Runner -> Shared Runner -> Docker
image: registry.gitlab.com/group/deploy-project:latest
before_script:
# Импортируем GPG ключ
- printf "${GPG_SECRET_KEY}" | gpg --batch --import
# Сохраняем maven конфигурацию
- printf "${SETTINGS_SECURITY_XML}" > ~/.m2/settings-security.xml
- printf "${SETTINGS_XML}" > ~/.m2/settings.xml
.java_deploy_template:
stage: deploy
# Задача сработает по триггеру, если передана переменная DEPLOY со значением java
only:
variables:
- $DEPLOY == "java"
variables:
# отключаем клонирование текущего проекта
GIT_STRATEGY: none
script:
# Предоставляем возможность хранения пароля в незашифрованном виде
- git config --global credential.helper store
# Сохраняем временные креды пользователя gitlab-ci-token
# Токен работает для всех публичных проектов gitlab.com и для проектов группы
- echo "https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com" >> ~/.git-credentials
# Полностью чистим текущую директорию
- rm -rf .* *
# Клонируем проект который, будем деплоить в Sonatype Nexus
- git clone ${DEPLOY_CI_REPOSITORY_URL} .
# Переключаемся на нужный коммит
- git checkout ${DEPLOY_CI_COMMIT_SHA} -f
# Если хоть один pom.xml содержит параметр autoReleaseAfterClose валим сборку.
# В противном случае есть риск залить сырые артефакты в maven central
- >
for pom in $(find . -name pom.xml); do
if [[ $(grep -q autoReleaseAfterClose "$pom" && echo $?) == 0 ]]; then
echo "File $pom contains prohibited setting: <autoReleaseAfterClose>";
exit 1;
fi;
done
# Если параметр DEPLOY_CI_COMMIT_TAG пустой, то принудительно ставим SNAPSHOT-версию
- >
if [[ "${DEPLOY_CI_COMMIT_TAG}" != "" ]]; then
mvn versions:set -DnewVersion=${DEPLOY_CI_COMMIT_TAG}
else
VERSION=$(mvn -q -Dexec.executable=echo -Dexec.args='${project.version}' --non-recursive exec:exec)
if [[ "${VERSION}" == *-SNAPSHOT ]]; then
mvn versions:set -DnewVersion=${VERSION}
else
mvn versions:set -DnewVersion=${VERSION}-SNAPSHOT
fi
fi
# Запускаем задачу на сборку и деплой артефактов
- mvn clean deploy -DskipTests=true
Nếu bạn có một dự án nhiều mô-đun và bạn không cần tải một mô-đun cụ thể lên kho lưu trữ thì bạn cần thêm vào pom.xml của mô-đun này nexus-staging-maven-plugin với cờ skipNexusStagingDeployMojo
Sau khi tải lên phiên bản chụp nhanh/phát hành có sẵn trong kho dàn dựng
<repositories>
<repository>
<id>SonatypeNexus</id>
<url>https://oss.sonatype.org/content/groups/staging/</url>
<!-- Не надо указывать флаги snapshot/release для репозитория -->
</repository>
</repositories>
Thêm điểm cộng
Một danh sách rất phong phú các mục tiêu để làm việc với kho lưu trữ Nexus (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
Kiểm tra bản phát hành tự động về khả năng tải xuống ở trung tâm maven
Khi thẻ được đặt, tác vụ tương ứng trong dự án triển khai sẽ tự động được kích hoạt để tải phiên bản phát hành lên nexus (Ví dụ).
Phần hay nhất là việc phát hành đóng sẽ tự động kích hoạt trong Nexus.
[INFO] Performing remote staging...
[INFO]
[INFO] * Remote staging into staging profile ID "9043b43f77dcc9"
[INFO] * Created staging repository with ID "orgtouchbit-1037".
[INFO] * Staging repository at https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/orgtouchbit-1037
[INFO] * Uploading locally staged artifacts to profile org.touchbit
[INFO] * Upload of locally staged artifacts finished.
[INFO] * Closing staging repository with ID "orgtouchbit-1037".
Waiting for operation to complete...
.........
[INFO] Remote staged 1 repositories, finished with success.
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] Shields4J 1.0.0 .................................... SUCCESS [ 9.603 s]
[INFO] test-core .......................................... SUCCESS [ 3.419 s]
[INFO] Shields4J client ................................... SUCCESS [ 9.793 s]
[INFO] TestNG listener 1.0.0 .............................. SUCCESS [01:23 min]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:47 min
[INFO] Finished at: 2019-04-21T04:05:46+03:00
[INFO] ------------------------------------------------------------------------
Và nếu có sự cố xảy ra thì nhiệm vụ sẽ thất bại
[INFO] Performing remote staging...
[INFO]
[INFO] * Remote staging into staging profile ID "9043b43f77dcc9"
[INFO] * Created staging repository with ID "orgtouchbit-1038".
[INFO] * Staging repository at https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/orgtouchbit-1038
[INFO] * Uploading locally staged artifacts to profile org.touchbit
[INFO] * Upload of locally staged artifacts finished.
[INFO] * Closing staging repository with ID "orgtouchbit-1038".
Waiting for operation to complete...
.......
[ERROR] Rule failure while trying to close staging repository with ID "orgtouchbit-1039".
[ERROR]
[ERROR] Nexus Staging Rules Failure Report
[ERROR] ==================================
[ERROR]
[ERROR] Repository "orgtouchbit-1039" failures
[ERROR] Rule "signature-staging" failures
[ERROR] * No public key: Key with id: (1f42b618d1cbe1b5) was not able to be located on <a href=http://keys.gnupg.net:11371/>http://keys.gnupg.net:11371/</a>. Upload your public key and try the operation again.
...
[ERROR] Cleaning up local stage directory after a Rule failure during close of staging repositories: [orgtouchbit-1039]
[ERROR] * Deleting context 9043b43f77dcc9.properties
[ERROR] Cleaning up remote stage repositories after a Rule failure during close of staging repositories: [orgtouchbit-1039]
[ERROR] * Dropping failed staging repository with ID "orgtouchbit-1039" (Rule failure during close of staging repositories: [orgtouchbit-1039]).
[ERROR] Remote staging finished with a failure: Staging rules failure!
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] Shields4J 1.0.0 .................................... SUCCESS [ 4.073 s]
[INFO] test-core .......................................... SUCCESS [ 2.788 s]
[INFO] Shields4J client ................................... SUCCESS [ 3.962 s]
[INFO] TestNG listener 1.0.0 .............................. FAILURE [01:07 min]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
Kết quả là chúng ta chỉ còn lại một sự lựa chọn. Hoặc xóa phiên bản này hoặc xuất bản.
Sau khi phát hành, sau một thời gian, các hiện vật sẽ ở trạng thái
đề ra
Tôi phát hiện ra rằng maven lập chỉ mục các kho lưu trữ công khai khác.
Tôi phải tải lên robots.txt vì nó lập chỉ mục kho lưu trữ cũ của tôi.
Một dự án triển khai riêng biệt trong đó bạn có thể triển khai một số tác vụ CI để tải các tạo phẩm lên kho công khai cho các ngôn ngữ phát triển khác nhau.
Dự án triển khai được tách biệt khỏi sự can thiệp từ bên ngoài và chỉ người dùng có vai trò Chủ sở hữu và Người bảo trì mới có thể sửa đổi.
Một Trình chạy cụ thể riêng biệt có bộ nhớ đệm “nóng” để chỉ chạy các tác vụ triển khai.
Xuất bản các phiên bản chụp nhanh/phát hành trong kho lưu trữ công cộng.
Tự động kiểm tra phiên bản phát hành để sẵn sàng xuất bản ở trung tâm maven.
Bảo vệ chống lại việc tự động xuất bản các phiên bản "thô" trong trung tâm maven.
Xây dựng và xuất bản các phiên bản chụp nhanh “khi nhấp chuột”.
Kho lưu trữ duy nhất để nhận các phiên bản chụp nhanh/phát hành.
Quy trình chung để xây dựng/thử nghiệm/xuất bản một dự án java.
Thiết lập GitLab CI không phải là một chủ đề phức tạp như thoạt nhìn. Chỉ cần thiết lập CI theo hình thức chìa khóa trao tay một vài lần là đủ và bây giờ bạn không còn là người nghiệp dư trong vấn đề này nữa. Hơn nữa, tài liệu GitLab rất dư thừa. Đừng ngại thực hiện bước đầu tiên. Con đường hiện ra dưới bước chân người đi (ko nhớ ai nói :)
Tôi sẽ vui mừng phản hồi.
Trong bài viết tiếp theo, tôi sẽ hướng dẫn bạn cách thiết lập GitLab CI để chạy các tác vụ kiểm tra tích hợp một cách cạnh tranh (chạy các dịch vụ kiểm tra với docker-compose) nếu bạn chỉ có một trình chạy shell.