Ny famaritana amin'ny antsipiriany momba ny mekanika amin'ny famoahana artifact ao amin'ny Maven Central amin'ny alàlan'ny Sonatype OSS Repository Hosting Service dia efa nofaritana tao amin'ny Ity lahatsoratra ity mpampiasa Googolplex, noho izany dia hijery ity lahatsoratra ity amin'ny toerana mety aho.
Misoratra anarana mialoha ho an'ny Sonatype JIRA ary sokafy tapakila hanokafana ny tahiry (vakio ny fizarana raha mila fanazavana fanampiny Mamorona tapakila amin'ny Sonatype JIRA). Aorian'ny fanokafana ny tahiry, dia hampiasaina handefasana artifacts amin'ny Sonatype nexus ny mpivady fidirana / tenimiafina avy amin'ny JIRA (antsoina hoe kaonty Sonatype).
Manaraka izany, ny dingan'ny famokarana fanalahidy GPG dia voalaza fa maina be. Jereo ny fizarana raha mila fanazavana fanampiny Fanamboarana GnuPG hanasonia artifacts
Raha mampiasa ny console Linux ianao hamorona fanalahidin'ny GPG (gnupg/gnupg2), dia mila mametraka izany ianao. rng-fitaovana mba hamoronana entropy. Raha tsy izany dia mety haharitra ela ny famoronana fototra.
Voalohany indrindra, mila mamorona sy manamboatra tetikasa iray izay hitehirizana ny fantsona ho an'ny fametrahana artifacts ianao. Nomeko anarana tsotra sy tsy sarotra ny tetikasako - miisa
Rehefa avy namorona ny tahiry ianao dia mila mametra ny fidirana hanovana ny tahiry.
Mandehana any amin'ny tetikasa -> Settings -> Repository -> Sampana voaaro. Fafantsika ny fitsipika rehetra ary ampiana fitsipika tokana miaraka amin'ny Wildcard * miaraka amin'ny zo hanosika sy hanambatra afa-tsy ho an'ireo mpampiasa manana andraikitry ny Mpitantana. Ity fitsipika ity dia hiasa ho an'ny mpampiasa rehetra amin'ity tetikasa ity sy ny vondrona misy ity tetikasa ity.
Raha misy mpikarakara maromaro, ny vahaolana tsara indrindra dia ny famerana ny fidirana amin'ny tetikasa amin'ny ankapobeny.
Mandehana any amin'ny tetikasa -> Settings -> General -> Visibility, endri-javatra tetikasa, fahazoan-dàlana ary apetraho amin'ny fahitana ny tetikasa Private.
Manana tetikasa azo idirana ho an'ny besinimaro aho, satria mampiasa ny GitLab Runner ahy aho ary izaho irery no afaka manova ny tahiry. Eny, raha ny marina, tsy mahaliana ahy ny mampiseho fampahalalana manokana amin'ny diarin'ny fantsona ho an'ny daholobe.
Fanamafisana ny fitsipika momba ny fanovana ny tahiry
Mandehana any amin'ny tetikasa -> Settings -> Repository -> Push Rules ary apetraho ny famerana ny Committer, Jereo raha saina mpampiasa GitLab ny mpanoratra. Manoro hevitra ny hametraka ihany koa aho manao sonia, ary apetraho ny saina Mandà tsy misy sonia.
Avy eo dia mila manamboatra trigger ianao hanombohana asa
Mandehana any amin'ny tetikasa -> Settings -> CI / CD -> Pipeline triggers ary mamorona trigger-token vaovao
Ity mari-pamantarana ity dia azo ampidirina avy hatrany amin'ny fanefena ankapoben'ny variables ho an'ny vondrona tetikasa.
Mandehana any amin'ny vondrona -> Settings -> CI / CD -> Variables ary ampio ny variable DEPLOY_TOKEN miaraka amin'ny sanda trigger-token.
Ity fizarana ity dia mamaritra ny fanefena amin'ny fampandehanana asa amin'ny fampiasana ny mpihazakazakanao manokana (Specific) sy ho an'ny daholobe (Mizara).
Mpihazakazaka manokana
Mampiasa ny mpihazakazaka manokana aho satria, voalohany indrindra, mety, haingana ary mora.
Ho an'ny mpihazakazaka, manoro hevitra aho Linux VDS misy CPU 1, 2 GB RAM, 20 GB HDD. Ny vidin'ny famoahana dia ~3000₽ isan-taona.
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!
Manamarina izahay fa voasoratra anarana ny mpihazakazaka. Mandehana any amin'ny tranokala gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Runners manokana -> Runners activated for this project
Mamorona fanalahidy izahay amin'ny famaliana fanontaniana. Nampiasa ny anarako sy ny mailaka aho.
Ataovy azo antoka ny mamaritra ny tenimiafina ho an'ny fanalahidy. Ny artifacts dia hosoniavina amin'ity fanalahidy ity.
gpg --gen-key
fanamarinana
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
Mampakatra ny fanalahidin'ny besinimaro amin'ny lohamilina fanalahidy
gpg --keyserver keys.gnupg.net --send-key 00000000
gpg: sending key 00000000 to hkp server keys.gnupg.net
Voalohany indrindra, mila mamorona fanalahidy GPG ianao. Mba hanaovana izany, mametraka ny gnupg.
yum install -y gnupg
Mamorona fanalahidy izahay amin'ny famaliana fanontaniana. Nampiasa ny anarako sy ny mailaka aho. Ataovy azo antoka ny mamaritra ny tenimiafina ho an'ny fanalahidy.
Ampio ny rakitra .gitlab-ci.yml amin'ny fototry ny tetikasa fametrahana
Ny script dia manolotra asa fampielezam-peo roa miavaka. Mpihazakazaka manokana na mpihazakazaka iombonana.
.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
Ao amin'ny tetikasa java izay tokony hampidirina any amin'ny trano fitahirizana ho an'ny daholobe dia mila manampy dingana 2 ianao mba hisintonana ny dikan-teny Release sy Snapshot.
.gitlab-ci.yml
stages:
- build
- test
- verify
- deploy
<...>
Release:
extends: .trigger_deploy
# Запускать задачу только пo тегу.
only:
- tags
Snapshot:
extends: .trigger_deploy
# Запускаем задачу на публикацию SNAPSHOT версии вручную
when: manual
# Не запускать задачу, если проставлен тег.
except:
- tags
.trigger_deploy:
stage: deploy
variables:
# Отключаем клонирование текущего проекта
GIT_STRATEGY: none
# Ссылка на триггер deploy-задачи
URL: "https://gitlab.com/api/v4/projects/<deploy project ID>/trigger/pipeline"
# Переменные deploy-задачи
POST_DATA: "
token=${DEPLOY_TOKEN}&
ref=master&
variables[DEPLOY]=${DEPLOY}&
variables[DEPLOY_CI_REPOSITORY_URL]=${CI_REPOSITORY_URL}&
variables[DEPLOY_CI_PROJECT_NAME]=${CI_PROJECT_NAME}&
variables[DEPLOY_CI_COMMIT_SHA]=${CI_COMMIT_SHA}&
variables[DEPLOY_CI_COMMIT_TAG]=${CI_COMMIT_TAG}
"
script:
# Не использую cURL, так как с флагами --fail --show-error
# он не выводит тело ответа, если HTTP код 400 и более
- wget --content-on-error -qO- ${URL} --post-data ${POST_DATA}
Amin'ity vahaolana ity dia nandeha lavidavitra kokoa aho ary nanapa-kevitra ny hampiasa template CI iray ho an'ny tetikasa java.
More details
Namorona tetikasa manokana aho gitlab-ci izay nametrahako template CI ho an'ny tetikasa java common.yml.
Mametraka modules ao amin'ny tahiry eo an-toerana.
Tena ilaina amin'ny fanamarinana eo an-toerana ny vahaolana amin'ny tetikasa hafa, ary koa ny checksum.
<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>
Rehefa apetraka ny tenifototra, ny asa mifandraika amin'izany ao amin'ny tetikasa fanapariahana dia atomboka ho azy mba hisintona ny kinova famoahana ho an'ny nexus (ohatra).
Ny ampahany tsara indrindra dia ny famotsorana akaiky dia mandeha ho azy amin'ny 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] ------------------------------------------------------------------------
Ary raha misy zavatra tsy mety, dia tsy hahomby ny asa
[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] ------------------------------------------------------------------------
Vokany, safidy iray ihany no sisa tavela amintsika. Na vonoy ity dikan-teny ity na avoaka.
Aorian'ny famotsorana, aorian'ny fotoana kelikely dia ho ao ny artifacts
offtopic
Hitako izany fa maven no manisy indexes ho an'ny daholobe hafa.
Tsy maintsy nampiana robots.txt aho satria nanondro ny fitehirizako taloha.
Tetikasa fanapariahana mitokana izay ahafahanao manatanteraka asa CI maromaro amin'ny fampiakarana artifacts any amin'ny trano fitehirizam-bahoaka ho an'ny fiteny fampandrosoana isan-karazany.
Ny tetikasa Deploy dia mitoka-monina amin'ny fitsabahana avy any ivelany ary tsy azon'ny mpampiasa ovaina afa-tsy amin'ny andraikitry ny Tompo sy Mpiambina.
Mpihazakazaka manokana miaraka amin'ny cache "mafana" mba handefasana asa fotsiny.
Famoahana ny kinova snapshot/famoahana ao anaty tahiry ho an'ny daholobe.
Fanamarinana mandeha ho azy ny kinova famoahana ho an'ny fahavononana havoaka ao amin'ny maven central.
Fiarovana amin'ny famoahana mandeha ho azy ny dikan-teny "manta" ao amin'ny maven central.
Mamorona sy mamoaka dikan-tsary "amin'ny fipihana".
Fitehirizam-boky tokana hahazoana ny dikan-tsary snapshot/famoahana.
Fantsona ankapobeny ho an'ny fananganana/fitsapana/famoahana tetikasa java.
Ny fametrahana ny GitLab CI dia tsy lohahevitra sarotra tahaka ny hita amin'ny voalohany. Ampy ny mametraka CI amin'ny sehatra turnkey imbetsaka, ary ankehitriny dia lavitra ny mpankafy amin'ity raharaha ity ianao. Ambonin'izany, ny antontan-taratasy GitLab dia tena tafahoatra. Aza matahotra ny hanao ny dingana voalohany. Ny lalana dia miseho eo ambanin'ny dingan'ny olona mandeha (tsy tadidiko hoe iza no nilaza izany :)
Ho faly aho handray valiny.
Ao amin'ny lahatsoratra manaraka dia hiresaka momba ny fomba fanamboarana ny GitLab CI aho amin'ny fampandehanana asa miaraka amin'ny fitsapana fampidirana amin'ny fifaninanana (manatanteraka ny serivisy amin'ny fitsapana amin'ny fampiasana docker-compose) raha manana mpihazakazaka akorandriaka iray ianao.