ProHoster > وبلاگ > اداره > راه اندازی GitLab CI برای آپلود یک پروژه جاوا در maven central
راه اندازی GitLab CI برای آپلود یک پروژه جاوا در maven central
این مقاله برای توسعه دهندگان جاوا است که نیاز به انتشار سریع محصولات خود در مخازن مرکزی sonatype و/یا maven با استفاده از GitLab دارند. در این مقاله در مورد راه اندازی gitlab-runner، gitlab-ci و maven-plugin برای حل این مشکل صحبت خواهم کرد.
پیش نیازها:
ذخیره سازی ایمن کلیدهای mvn و GPG.
اجرای ایمن وظایف عمومی CI.
بارگذاری مصنوعات (نسخه/عکس فوری) در مخازن عمومی.
بررسی خودکار نسخه های انتشار برای انتشار در maven central.
یک راه حل کلی برای آپلود مصنوعات در یک مخزن برای چندین پروژه.
شرح مفصلی از مکانیسم انتشار مصنوعات در Maven Central از طریق سرویس میزبانی مخزن Sonatype OSS قبلاً در این مقاله کاربر Googolplex، بنابراین در جاهای مناسب به این مقاله اشاره خواهم کرد.
پیش ثبت نام در سوناتایپ JIRA و یک بلیط برای باز کردن مخزن شروع کنید (برای جزئیات بیشتر، بخش را بخوانید یک بلیط در Sonatype JIRA ایجاد کنید). پس از باز کردن مخزن، جفت ورود/گذرواژه JIRA (از این پس به عنوان حساب Sonatype نامیده می شود) برای آپلود مصنوعات در Nexus Sonatype استفاده می شود.
در مرحله بعد، روند تولید یک کلید GPG بسیار خشک توضیح داده شده است. برای جزئیات بیشتر به بخش مراجعه کنید پیکربندی GnuPG برای امضای مصنوعات
اگر از کنسول لینوکس برای تولید یک کلید GPG (gnupg/gnupg2) استفاده می کنید، باید نصب کنید rng-tools برای ایجاد آنتروپی در غیر این صورت، تولید کلید ممکن است زمان زیادی طول بکشد.
اول از همه، شما باید پروژه ای را ایجاد و پیکربندی کنید که در آن خط لوله برای استقرار مصنوعات ذخیره می شود. من پروژه ام را ساده و بدون پیچیدگی نامیدم - گسترش
پس از ایجاد مخزن، باید دسترسی را برای تغییر مخزن محدود کنید.
به پروژه -> Settings -> Repository -> Protected Branches بروید. ما همه قوانین را حذف می کنیم و یک قانون را با Wildcard * اضافه می کنیم که فقط برای کاربران دارای نقش Maintainers حق فشار دادن و ادغام را دارد. این قانون برای همه کاربران این پروژه و گروهی که این پروژه به آن تعلق دارد کار خواهد کرد.
اگر چندین نگهدار وجود دارد، بهترین راه حل محدود کردن دسترسی به پروژه در اصل است.
به پروژه -> تنظیمات -> عمومی -> مشاهده، ویژگیهای پروژه، مجوزها بروید و نمایان بودن پروژه را روی خصوصی.
من یک پروژه در دسترسی عمومی دارم، زیرا از GitLab Runner خودم استفاده می کنم و فقط من به تغییر مخزن دسترسی دارم. خوب، در واقع به نفع من نیست که اطلاعات خصوصی را در گزارش های خط لوله عمومی نشان دهم.
تشدید قوانین برای تغییر مخزن
به پروژه -> Settings -> Repository -> Push Rules بروید و flags محدودیت Committer را تنظیم کنید، بررسی کنید که آیا نویسنده کاربر GitLab است یا خیر. تنظیم را هم توصیه می کنم متعهد امضا کردنو پرچم رد commits unsigned را تنظیم کنید.
در مرحله بعد، باید یک ماشه را برای اجرای وظایف پیکربندی کنید
به پروژه -> Settings -> CI / CD -> Pipeline triggers بروید و یک Trigger-token جدید ایجاد کنید.
این نشانه را می توان بلافاصله به پیکربندی کلی متغیرها برای گروهی از پروژه ها اضافه کرد.
به گروه -> Settings -> CI / CD -> Variables بروید و یک متغیر اضافه کنید DEPLOY_TOKEN با نشانه ماشه در مقدار.
این بخش پیکربندی برای اجرای وظایف در هنگام استقرار با استفاده از رانر بومی (Specific) و عمومی (Shared) را توضیح می دهد.
دونده خاص
من از دونده های خودم استفاده می کنم، زیرا اول از همه راحت، سریع، ارزان است.
برای رانر لینوکس VDS را با 1 CPU، 2 گیگابایت رم، 20 گیگابایت HDD توصیه می کنم. قیمت صدور ~ 3000 ₽ در سال.
دونده من
برای رانر من VDS 4 CPU، 4GB RAM، 50GB SSD گرفتم. هزینه آن ~ 11000 ₽ بود و هرگز پشیمان نشدم.
من در کل 7 دستگاه دارم. 5 در آروبا و 2 در ihor.
بنابراین ما یک دونده داریم. حالا ما آن را پیکربندی می کنیم.
از طریق SSH به دستگاه می رویم و جاوا، git، maven، gnupg2 را نصب می کنیم.
یک دایرکتوری برای کش maven ایجاد کنید و مجوزهای گروه را اختصاص دهید runner
اگر قصد ندارید چندین رانر را روی یک دستگاه اجرا کنید، میتوانید از این مرحله بگذرید.
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!
بررسی می کنیم که دونده ثبت نام کرده باشد. به وب سایت gitlab.com بروید -> deploy-project -> تنظیمات -> CI/CD -> Runners -> Specific Runners -> Runners فعال شده برای این پروژه
صفحه نمایش
اضافه کنید جداگانه، مجزا خدمات /etc/systemd/system/gitlab-deployer.service
ما با پاسخ دادن به سوالات یک کلید تولید می کنیم. من از نام و ایمیل خودم استفاده کردم.
حتما رمز عبور کلید را مشخص کنید. آثار با این کلید امضا خواهند شد.
gpg --gen-key
چک کردن
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
در حال آپلود کلید عمومی ما در سرور کلید
gpg --keyserver keys.gnupg.net --send-key 00000000
gpg: sending key 00000000 to hkp server keys.gnupg.net
یک دایرکتوری maven ایجاد کنید مخزن و پیوند به حافظه پنهان (اشتباه نکنید)
اگر قصد ندارید چندین رانر را روی یک دستگاه اجرا کنید، می توانید از این نکته صرف نظر کنید.
فایل .gitlab-ci.yml را به ریشه پروژه deploy اضافه کنید
اسکریپت دو وظیفه استقرار منحصر به فرد متقابل را ارائه می دهد. به ترتیب Specific Runner یا Shared Runner.
.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
این موضوع با جزئیات کامل توضیح داده شده است. Googolplex в راه اندازی maven برای امضا و آپلود خودکار مصنوعات در مخازن عکس فوری و مرحلهبندی، بنابراین برخی از تفاوت های ظریف استفاده از افزونه ها را شرح خواهم داد. من همچنین توضیح خواهم داد که چگونه به راحتی و به طور طبیعی می توانید استفاده کنید nexus-staging-maven-pluginاگر نمی خواهید یا نمی توانید از org.sonatype.oss:oss-parent به عنوان والد برای پروژه خود استفاده کنید.
پلاگین maven-install
ماژول ها را در مخزن محلی نصب می کند.
بسیار مفید برای تایید محلی راه حل ها در پروژه های دیگر، و همچنین چک جمع.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<executions>
<execution>
<id>install-project</id>
<!-- Если у вас многомодульный проект с деплоем родительского помика -->
<phase>install</phase>
<!-- Явно указываем файлы для локальной установки -->
<configuration>
<file>target/${project.artifactId}-${project.version}.jar</file>
```target/${project.artifactId}-${project.version}-sources.jar</sources>
<pomFile>dependency-reduced-pom.xml</pomFile>
<!-- Принудительное обновление метаданных проекта -->
<updateReleaseInfo>true</updateReleaseInfo>
<!-- Контрольные суммы для проверки целостности -->
<createChecksum>true</createChecksum>
</configuration>
</execution>
</executions>
</plugin>
پس از دانلود، نسخههای فوری/نسخهای در دسترس هستند مخازن مرحله بندی
<repositories>
<repository>
<id>SonatypeNexus</id>
<url>https://oss.sonatype.org/content/groups/staging/</url>
<!-- Не надо указывать флаги snapshot/release для репозитория -->
</repository>
</repositories>
مزیت های بیشتر
یک لیست بسیار غنی از اهداف برای کار با مخزن Nexus (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
بررسی انتشار خودکار برای قابلیت دانلود در maven central
هنگامی که یک برچسب نصب می شود، وظیفه مربوطه در پروژه استقرار به طور خودکار راه اندازی می شود تا نسخه انتشار در Nexus دانلود شود (مثال).
بهترین بخش این است که انتشار بسته به طور خودکار در 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] ------------------------------------------------------------------------
و اگر مشکلی پیش بیاید، کار شکست خواهد خورد
[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] ------------------------------------------------------------------------
در نتیجه تنها یک انتخاب برای ما باقی می ماند. یا این نسخه را حذف کنید یا منتشر کنید.
پس از انتشار، پس از مدتی، مصنوعات وارد خواهند شد
خارج از موضوع
این یک کشف برای من بود که maven سایر مخازن عمومی را نمایه می کند.
مجبور شدم robots.txt را آپلود کنم زیرا مخزن قدیمی من را ایندکس می کند.
یک پروژه استقرار جداگانه که در آن می توانید چندین وظیفه CI را برای آپلود مصنوعات در مخازن عمومی برای زبان های مختلف توسعه پیاده سازی کنید.
پروژه استقرار از تداخل بیرونی جدا شده است و فقط توسط کاربرانی که دارای نقش های مالک و نگهدارنده هستند قابل تغییر است.
یک Runner خاص جداگانه با یک کش "داغ" برای اجرای تنها وظایف استقرار.
انتشار نسخه های فوری/نسخه انتشار در یک مخزن عمومی.
بررسی خودکار نسخه انتشار برای آمادگی برای انتشار در maven central.
محافظت در برابر انتشار خودکار نسخه های "خام" در maven central.
ساخت و انتشار نسخه فوری "با کلیک".
مخزن واحد برای دریافت نسخه های فوری / انتشار.
خط لوله عمومی برای ساخت / آزمایش / انتشار یک پروژه جاوا.
راه اندازی GitLab CI آنقدرها که در نگاه اول به نظر می رسد موضوع پیچیده ای نیست. کافی است چند بار CI را به صورت کلید در دست راه اندازی کنید، و اکنون در این مورد از یک آماتور دور هستید. علاوه بر این، اسناد GitLab بسیار زائد است. از برداشتن اولین قدم نترسید. جاده زیر پله های شخصی که در حال راه رفتن است ظاهر می شود (یادم نیست کی گفته است)
من خوشحال خواهم شد به بازخورد.
در مقاله بعدی، من به شما نشان خواهم داد که چگونه GitLab CI را برای اجرای رقابتی وظایف تست یکپارچه سازی (اجرای خدمات تست با docker-compose) راه اندازی کنید، اگر فقط یک اجرا کننده پوسته دارید.