پرو ہوسٹر > بلاگ > انتظامیہ > ماون سنٹرل پر جاوا پروجیکٹ اپ لوڈ کرنے کے لیے GitLab CI کو ترتیب دینا
ماون سنٹرل پر جاوا پروجیکٹ اپ لوڈ کرنے کے لیے GitLab CI کو ترتیب دینا
یہ مضمون جاوا ڈویلپرز کے لیے ہے جنہیں GitLab کا استعمال کرتے ہوئے سوناٹائپ اور/یا ماون سنٹرل ریپوزٹریز میں اپنی مصنوعات کو تیزی سے شائع کرنے کی ضرورت ہے۔ اس مضمون میں میں اس مسئلے کو حل کرنے کے لیے gitlab-runner، gitlab-ci اور maven-plugin ترتیب دینے کے بارے میں بات کروں گا۔
شرائط:
ایم وی این اور جی پی جی کیز کا محفوظ ذخیرہ۔
عوامی CI کاموں کی محفوظ عملدرآمد۔
عوامی ذخیروں میں نمونے (ریلیز/اسنیپ شاٹ) اپ لوڈ کرنا۔
ماون سینٹرل میں اشاعت کے لیے ریلیز ورژن کی خودکار جانچ۔
ایک سے زیادہ پروجیکٹس کے لیے ایک ذخیرہ میں نمونے اپ لوڈ کرنے کا ایک عمومی حل۔
سوناٹائپ او ایس ایس ریپوزٹری ہوسٹنگ سروس کے ذریعے ماون سینٹرل میں نمونے شائع کرنے کے طریقہ کار کی تفصیلی وضاحت پہلے ہی میں بیان کی جا چکی ہے۔ اس مضمون صارف Googolplex، لہذا میں اس مضمون کا صحیح جگہوں پر حوالہ دوں گا۔
کے لیے پہلے سے رجسٹر کریں۔ سوناٹائپ JIRA اور ذخیرہ کھولنے کے لیے ٹکٹ کھولیں (مزید تفصیلات کے لیے سیکشن پڑھیں سوناٹائپ JIRA پر ٹکٹ بنائیں)۔ ریپوزٹری کو کھولنے کے بعد، JIRA سے لاگ ان/پاس ورڈ جوڑا (اس کے بعد سوناٹائپ اکاؤنٹ کہا جاتا ہے) کو سونا ٹائپ گٹھ جوڑ پر نمونے اپ لوڈ کرنے کے لیے استعمال کیا جائے گا۔
اگر آپ GPG کلید (gnupg/gnupg2) بنانے کے لیے لینکس کنسول کا استعمال کرتے ہیں، تو آپ کو انسٹال کرنے کی ضرورت ہے آرجیجی آلات اینٹروپی پیدا کرنے کے لیے۔ بصورت دیگر، کلیدی جنریشن میں بہت وقت لگ سکتا ہے۔
سب سے پہلے، آپ کو ایک پروجیکٹ بنانے اور ترتیب دینے کی ضرورت ہے جس میں نمونے کی تعیناتی کے لیے پائپ لائن کو ذخیرہ کیا جائے گا۔ میں نے اپنے پروجیکٹ کا نام سادہ اور غیر پیچیدہ رکھا ہے۔ تعیناتی
ذخیرہ بنانے کے بعد، آپ کو ذخیرہ کو تبدیل کرنے کے لیے رسائی کو محدود کرنے کی ضرورت ہے۔
پروجیکٹ -> سیٹنگز -> ریپوزٹری -> پروٹیکٹڈ برانچز پر جائیں۔ ہم تمام قواعد کو حذف کرتے ہیں اور صرف مینٹینرز کے کردار والے صارفین کے لیے پش اور ضم کرنے کے حق کے ساتھ وائلڈ کارڈ * کے ساتھ ایک اصول شامل کرتے ہیں۔ یہ اصول اس پروجیکٹ اور اس گروپ کے تمام صارفین کے لیے کام کرے گا جس سے یہ پروجیکٹ تعلق رکھتا ہے۔
اگر کئی دیکھ بھال کرنے والے ہیں، تو بہترین حل یہ ہوگا کہ اصولی طور پر اس منصوبے تک رسائی کو محدود کیا جائے۔
پروجیکٹ پر جائیں -> ترتیبات -> عمومی -> مرئیت، پروجیکٹ کی خصوصیات، اجازتیں اور پروجیکٹ کی مرئیت کو سیٹ کریں ذاتی.
میرے پاس عوامی طور پر قابل رسائی پروجیکٹ ہے، کیونکہ میں اپنا GitLab رنر استعمال کرتا ہوں اور صرف میرے پاس ذخیرہ کو تبدیل کرنے تک رسائی ہے۔ ٹھیک ہے، اصل میں، عوامی پائپ لائن لاگز میں نجی معلومات دکھانا میرے مفاد میں نہیں ہے۔
مخزن کو تبدیل کرنے کے قوانین کو سخت کرنا
پروجیکٹ پر جائیں -> سیٹنگز -> ریپوزٹری -> پش رولز اور کمیٹر پابندی سیٹ کریں، چیک کریں کہ آیا مصنف گٹ لیب صارف فلیگ ہے۔ میں ترتیب دینے کی بھی سفارش کرتا ہوں۔ دستخط کا عہد کریں، اور غیر دستخط شدہ کمٹ کو مسترد کرنے کا جھنڈا سیٹ کریں۔
اگلا آپ کو کاموں کو شروع کرنے کے لیے ایک ٹرگر ترتیب دینے کی ضرورت ہے۔
پروجیکٹ پر جائیں -> ترتیبات -> CI / CD -> پائپ لائن ٹرگرز اور ایک نیا ٹرگر ٹوکن بنائیں
اس ٹوکن کو فوری طور پر منصوبوں کے گروپ کے لیے متغیرات کی عمومی ترتیب میں شامل کیا جا سکتا ہے۔
گروپ -> ترتیبات -> CI / CD -> متغیرات پر جائیں اور ایک متغیر شامل کریں۔ DEPLOY_TOKEN قدر میں ٹرگر ٹوکن کے ساتھ۔
یہ سیکشن آپ کے اپنے (مخصوص) اور عوامی (مشترکہ) رنر کا استعمال کرتے ہوئے تعیناتی پر کاموں کو چلانے کے لیے ترتیب کو بیان کرتا ہے۔
مخصوص رنر
میں اپنے رنر استعمال کرتا ہوں کیونکہ، سب سے پہلے، یہ آسان، تیز اور سستا ہے۔
ایک رنر کے لیے، میں 1 CPU، 2 GB RAM، 20 GB HDD کے ساتھ ایک Linux VDS تجویز کرتا ہوں۔ ایشو کی قیمت ~3000₽ فی سال ہے۔
میرا رنر
رنر کے لیے میں نے VDS 4 CPU، 4 GB RAM، 50 GB SSD لیا۔ لاگت ~11000₽ اور اس پر کبھی افسوس نہیں ہوا۔
میرے پاس کل 7 مشینیں ہیں۔ 5 اروبا پر اور 2 ihor پر۔
تو ہمارے پاس ایک رنر ہے۔ اب ہم اسے ترتیب دیں گے۔
ہم SSH کے ذریعے مشین پر جاتے ہیں اور java, git, maven, gnupg2 انسٹال کرتے ہیں۔
میون کیشے کے لئے ایک ڈائرکٹری بنائیں اور گروپ کی اجازتیں تفویض کریں۔ 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 -> Settings -> 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 فائل کو تعیناتی پروجیکٹ کے روٹ میں شامل کریں۔
اسکرپٹ دو باہمی طور پر خصوصی تعیناتی کاموں کو پیش کرتا ہے۔ بالترتیب مخصوص رنر یا مشترکہ رنر۔
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
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>jar</goal>
</goals>
<!-- Генерация javadoc должна быть после фазы генерации ресурсов -->
<phase>prepare-package</phase>
<configuration>
<!-- Очень помогает в публичных проектах -->
<failOnError>true</failOnError>
<failOnWarnings>true</failOnWarnings>
<!-- Убирает ошибку поиска документации в target директории -->
<detectOfflineLinks>false</detectOfflineLinks>
</configuration>
</execution>
</executions>
</plugin>
اگر آپ کے پاس ایک ماڈیول ہے جس میں جاوا نہیں ہے (مثال کے طور پر صرف وسائل)
یا آپ اصولی طور پر javadoc پیدا نہیں کرنا چاہتے، پھر مدد کریں۔ maven-jar-plugin
اگر آپ کے پاس ملٹی ماڈیول پروجیکٹ ہے اور آپ کو مخزن میں مخصوص ماڈیول اپ لوڈ کرنے کی ضرورت نہیں ہے، تو آپ کو شامل کرنے کی ضرورت ہے nexus-staging-maven-plugin ایک پرچم کے ساتھ skipNexusStagingDeployMojo
ڈاؤن لوڈ کرنے کے بعد، اسنیپ شاٹ/ریلیز ورژن دستیاب ہیں۔ سٹیجنگ ریپوزٹریز
<repositories>
<repository>
<id>SonatypeNexus</id>
<url>https://oss.sonatype.org/content/groups/staging/</url>
<!-- Не надо указывать флаги snapshot/release для репозитория -->
</repository>
</repositories>
مزید فوائد
گٹھ جوڑ کے ذخیرے کے ساتھ کام کرنے کے اہداف کی ایک بہت ہی بھرپور فہرست (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
ماون سینٹرل پر اپ لوڈ کرنے کے لیے خودکار ریلیز چیک
جب کوئی ٹیگ انسٹال ہوتا ہے، ڈیپلائی پروجیکٹ میں متعلقہ کام خود بخود ریلیز ورژن کو گٹھ جوڑ پر ڈاؤن لوڈ کرنے کے لیے متحرک ہوجاتا ہے (مثال کے طور پر).
سب سے اچھی بات یہ ہے کہ گٹھ جوڑ میں قریبی ریلیز خود بخود متحرک ہو جاتی ہے۔
[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] ------------------------------------------------------------------------
نتیجے کے طور پر، ہمارے پاس صرف ایک ہی انتخاب رہ گیا ہے۔ یا تو اس ورژن کو حذف کریں یا اسے شائع کریں۔
رہائی کے بعد، کچھ عرصے بعد نمونے اندر ہوں گے۔
موضوع سے ہٹ کر
یہ میرے لئے ایک دریافت تھی جو ماون دیگر عوامی ذخیروں کو انڈیکس کرتی ہے۔
مجھے robots.txt شامل کرنا پڑا کیونکہ اس نے میرے پرانے ذخیرے کو انڈیکس کیا تھا۔
ایک علیحدہ تعیناتی پروجیکٹ جس میں آپ مختلف ترقیاتی زبانوں کے لیے عوامی ذخیروں میں نمونے اپ لوڈ کرنے کے لیے کئی CI کاموں کو نافذ کر سکتے ہیں۔
Deploy پروجیکٹ بیرونی مداخلت سے الگ تھلگ ہے اور اسے صرف مالک اور مینٹینر کے کردار والے صارفین ہی تبدیل کر سکتے ہیں۔
ایک علیحدہ مخصوص رنر جس میں "ہاٹ" کیشے ہے تاکہ صرف کاموں کو تعینات کیا جا سکے۔
عوامی ذخیرہ میں سنیپ شاٹ/ریلیز ورژن شائع کرنا۔
ماون سینٹرل میں اشاعت کے لیے تیاری کے لیے ریلیز ورژن کی خودکار جانچ۔
ماون سینٹرل میں "خام" ورژن کی خودکار اشاعت کے خلاف تحفظ۔
"کلک پر" سنیپ شاٹ ورژن بنائیں اور شائع کریں۔
سنیپ شاٹ/ریلیز ورژن حاصل کرنے کے لیے ایک واحد ذخیرہ۔
جاوا پروجیکٹ کی تعمیر/ٹیسٹ/شائع کے لیے عمومی پائپ لائن۔
GitLab CI کو ترتیب دینا اتنا پیچیدہ موضوع نہیں ہے جتنا کہ پہلی نظر میں لگتا ہے۔ ایک دو بار ٹرن کی بنیاد پر CI کو ترتیب دینا کافی ہے، اور اب آپ اس معاملے میں شوقیہ سے بہت دور ہیں۔ مزید یہ کہ GitLab دستاویزات بہت بے کار ہیں۔ پہلا قدم اٹھانے سے نہ گھبرائیں۔ سڑک چلنے والے شخص کے قدموں کے نیچے نظر آتی ہے (مجھے یاد نہیں کہ یہ کس نے کہا تھا :)
میں رائے حاصل کرنے کے لئے خوش ہو جائے گا.
اگلے مضمون میں میں اس بارے میں بات کروں گا کہ GitLab CI کو انٹیگریشن ٹیسٹ کے ساتھ کاموں کو مسابقتی طور پر چلانے کے لیے (docker-compose کے ذریعے ٹیسٹ کے تحت خدمات چلانا) اگر آپ کے پاس صرف ایک شیل رنر ہے۔