ProHoster > blog > Utawala > Kuanzisha GitLab CI kupakia mradi wa java kwa maven central
Kuanzisha GitLab CI kupakia mradi wa java kwa maven central
Makala haya yanalenga wasanidi wa java ambao wanahitaji kuchapisha bidhaa zao kwa haraka kwa sonatype na/au hazina kuu za maven kwa kutumia GitLab. Katika nakala hii, nitazungumza juu ya kusanidi gitlab-runner, gitlab-ci na maven-plugin kutatua shida hii.
Mahitaji:
Hifadhi salama ya funguo za mvn na GPG.
Utekelezaji salama wa majukumu ya CI ya umma.
Inapakia vizalia vya programu (kutolewa/picha) kwenye hazina za umma.
Angalia kiotomatiki matoleo ya kuchapishwa kwa maven central.
Suluhisho la jumla la kupakia vizalia vya programu kwenye hifadhi ya miradi mingi.
Maelezo ya kina ya utaratibu wa kuchapisha vizalia vya programu hadi Maven Central kupitia Huduma ya Upangishi wa Hifadhi ya Sonatype OSS tayari imefafanuliwa katika Makala hii mtumiaji Googolplex, kwa hivyo nitarejelea nakala hii katika sehemu zinazofaa.
Jisajili mapema saa Sonatype JIRA na anza tikiti ya kufungua hazina (kwa maelezo zaidi, soma sehemu hiyo Unda tikiti ya Sonatype JIRA) Baada ya kufungua hazina, jozi ya kuingia/nenosiri ya JIRA (hapa inajulikana kama akaunti ya Sonatype) itatumika kupakia vizalia vya programu kwenye uhusiano wa Sonatype.
Ikiwa unatumia koni ya Linux kutengeneza kitufe cha GPG (gnupg/gnupg2), basi unahitaji kusakinisha. zana za rng kutengeneza entropy. Vinginevyo, kizazi muhimu kinaweza kuchukua muda mrefu sana.
Awali ya yote, unahitaji kuunda na kusanidi mradi ambao bomba litahifadhiwa kwa ajili ya kupelekwa kwa mabaki. Niliita mradi wangu kwa urahisi na sio ngumu - kupeleka
Baada ya kuunda hazina, unahitaji kuzuia ufikiaji wa kubadilisha hazina.
Nenda kwa mradi -> Mipangilio -> Hifadhi -> Matawi Yanayolindwa. Tunafuta sheria zote na kuongeza sheria moja na Wildcard * yenye haki ya kusukuma na kuunganisha kwa watumiaji walio na jukumu la Wasimamizi pekee. Sheria hii itafanya kazi kwa watumiaji wote wa mradi huu na kikundi ambacho mradi huu unamiliki.
Ikiwa kuna watunzaji kadhaa, basi suluhisho bora itakuwa kuzuia upatikanaji wa mradi kwa kanuni.
Nenda kwa mradi -> Mipangilio -> Jumla -> Mwonekano, huduma za mradi, ruhusa na uweke mwonekano wa Mradi kuwa Binafsi.
Nina mradi katika ufikiaji wa umma, kwani mimi hutumia GitLab Runner yangu na ni mimi pekee ninaweza kupata kurekebisha hazina. Kweli, sio kwa faida yangu kuonyesha habari za kibinafsi kwenye kumbukumbu za bomba za umma.
Kuimarisha sheria za kubadilisha hazina
Nenda kwa mradi -> Mipangilio -> Hifadhi -> Kanuni za Kushinikiza na uweke kizuizi cha Mtoa huduma wa bendera, Angalia ikiwa mwandishi ni mtumiaji wa GitLab. Ninapendekeza pia kuweka kufanya saini, na uweke bendera ya Kataa ambayo haijasainiwa.
Ifuatayo, unahitaji kusanidi kichochezi ili kuendesha kazi
Nenda kwa mradi -> Mipangilio -> CI / CD -> Vichochezi vya bomba na uunda ishara mpya ya kichochezi.
Ishara hii inaweza kuongezwa mara moja kwa usanidi wa jumla wa vigezo kwa kundi la miradi.
Nenda kwa kikundi -> Mipangilio -> CI / CD -> Vigezo na uongeze tofauti DEPLOY_TOKEN na ishara ya kichochezi katika thamani.
Sehemu hii inaelezea usanidi wa kuendesha kazi kwenye kusambaza kwa kutumia kikimbiaji asili (Maalum) na cha umma (Iliyoshirikiwa).
Mkimbiaji Maalum
Ninatumia wakimbiaji wangu mwenyewe, kwa sababu kwanza kabisa ni rahisi, haraka, nafuu.
Kwa mkimbiaji ninapendekeza Linux VDS yenye CPU 1, RAM ya GB 2, HDD ya GB 20. Bei ya toleo ~ 3000₽ kwa mwaka.
Mkimbiaji wangu
Kwa mkimbiaji nilichukua VDS 4 CPU, 4 GB RAM, 50 GB SSD. Iligharimu ~11000₽ na sikujuta kamwe.
Nina jumla ya mashine 7. 5 kwenye aruba na 2 kwenye ihor.
Kwa hivyo, tuna mkimbiaji. Sasa tutaiweka.
Tunaenda kwa mashine kupitia SSH na kusakinisha java, git, maven, gnupg2.
Unda saraka ya kashe ya maven na upe haki za kikundi runner
Unaweza kuruka hatua hii ikiwa huna mpango wa kukimbia wakimbiaji wengi kwenye mashine moja.
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!
Angalia ikiwa mkimbiaji amesajiliwa. Nenda kwa gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners -> Runners iliyoamilishwa kwa mradi huu
Skrini
Ongeza kujitenga huduma /etc/systemd/system/gitlab-deployer.service
Tunatengeneza ufunguo kwa kujibu maswali. Nilitumia jina langu na barua pepe.
Hakikisha kutaja nenosiri kwa ufunguo. Vizalia vya programu vitatiwa saini kwa ufunguo huu.
gpg --gen-key
Angalia
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
Inapakia ufunguo wetu wa umma kwa keyserver
gpg --keyserver keys.gnupg.net --send-key 00000000
gpg: sending key 00000000 to hkp server keys.gnupg.net
Unda saraka ya maven there na unganisha na kashe (usifanye makosa)
Hatua hii inaweza kuruka ikiwa huna mpango wa kukimbia wakimbiaji kadhaa kwenye mashine moja.
Ongeza faili .gitlab-ci.yml kwenye mzizi wa mradi wa kupeleka
Hati inawasilisha kazi mbili za kipekee za kusambaza. Mkimbiaji Maalum au Mkimbiaji Aliyeshirikiwa kwa mtiririko huo.
.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
Ikiwa una mradi wa moduli nyingi, na hauitaji kupakia moduli maalum kwenye hazina, basi unahitaji kuongeza kwenye pom.xml ya moduli hii nexus-staging-maven-plugin na bendera skipNexusStagingDeployMojo
Baada ya kupakia matoleo ya muhtasari/toleo yanapatikana ndani hifadhi za maonyesho
<repositories>
<repository>
<id>SonatypeNexus</id>
<url>https://oss.sonatype.org/content/groups/staging/</url>
<!-- Не надо указывать флаги snapshot/release для репозитория -->
</repository>
</repositories>
Faida zaidi
Orodha tajiri sana ya malengo ya kufanya kazi na hazina ya uhusiano (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
Angalia kutolewa kiotomatiki kwa upakuaji katika maven central
Lebo inapowekwa, kazi inayolingana katika mradi wa kusambaza inachochewa kiotomatiki kupakia toleo la toleo kwenye nexus (mfano).
Sehemu bora ni kwamba kutolewa kwa karibu kunasababisha kiotomatiki kwenye 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] ------------------------------------------------------------------------
Na ikiwa kitu kilikwenda vibaya, basi kazi itashindwa
[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] ------------------------------------------------------------------------
Matokeo yake, tumebakiwa na chaguo moja tu. Au futa toleo hili au uchapishe.
Baada ya kutolewa, baada ya muda, mabaki yatakuwa ndani
nje ya mada
Ilikuwa ufunuo kwangu kwamba maven inaashiria hazina zingine za umma.
Ilinibidi kupakia robots.txt kwa sababu iliorodhesha hazina yangu ya zamani.
Mradi tofauti wa kupeleka ambao unaweza kutekeleza majukumu kadhaa ya CI kwa kupakia vizalia vya programu kwenye hazina za umma kwa lugha mbalimbali za maendeleo.
Mradi wa usambazaji umetengwa kutokana na kuingiliwa na nje na unaweza kurekebishwa tu na watumiaji walio na majukumu ya Mmiliki na Msimamizi.
Kikimbiaji Maalum kilicho na akiba "moto" ili kutekeleza majukumu ya kusambaza pekee.
Uchapishaji wa matoleo ya muhtasari/toleo katika hazina ya umma.
Angalia kiotomatiki toleo la toleo kwa utayari wa kuchapishwa katika maven central.
Ulinzi dhidi ya uchapishaji otomatiki wa matoleo "mbichi" katikati mwa maven.
Unda na uchapishe matoleo ya muhtasari "kwa kubofya".
Hazina moja ya kupata matoleo ya muhtasari/toleo.
Bomba la jumla la kujenga / kupima / kuchapisha mradi wa java.
Kusanidi GitLab CI sio mada ngumu kama inavyoonekana mwanzoni. Inatosha kusanidi CI kwa msingi wa turnkey mara kadhaa, na sasa uko mbali na amateur katika suala hili. Kwa kuongezea, nyaraka za GitLab ni za ziada sana. Usiogope kuchukua hatua ya kwanza. Barabara inaonekana chini ya hatua za mtu anayetembea (sikumbuki ni nani alisema :)
Nitafurahi kutoa maoni.
Katika makala inayofuata, nitakuonyesha jinsi ya kusanidi GitLab CI ili kuendesha kazi za mtihani wa ujumuishaji kwa ushindani (kuendesha huduma za majaribio na docker-compose) ikiwa una mkimbiaji mmoja tu.