maven center жүйесіне java жобасын жүктеп салу үшін GitLab CI орнату

Бұл мақала GitLab көмегімен sonatype және/немесе maven орталық репозиторийлеріне өнімдерін жылдам жариялауды қажет ететін java әзірлеушілеріне арналған. Бұл мақалада мен бұл мәселені шешу үшін gitlab-runner, gitlab-ci және maven-plugin орнату туралы айтатын боламын.

Пререквизиттер:

  • mvn және GPG кілттерін қауіпсіз сақтау.
  • Қоғамдық CI тапсырмаларын қауіпсіз орындау.
  • Жалпы репозитарийлерге артефактілерді жүктеп салу (шығару/сурет).
  • maven center жүйесінде жариялау үшін шығарылым нұсқаларын автоматты түрде тексеру.
  • Бірнеше жобалар үшін репозиторийге артефактілерді жүктеп салуға арналған жалпы шешім.
  • Қарапайымдылық пен қолайлылық.

Мазмұны

жалпы ақпарат

  • Sonatype OSS Repository хостинг қызметі арқылы Maven Central жүйесінде артефактілерді жариялау механизмінің егжей-тегжейлі сипаттамасы қазірдің өзінде сипатталған. Бұл мақала пайдаланушы Googolplex, сондықтан мен бұл мақалаға қажетті жерлерде сілтеме жасаймын.
  • мекен-жайында алдын ала тіркелу JIRA сонатипі және репозиторийді ашу үшін билетті бастаңыз (толығырақ ақпарат алу үшін бөлімді оқыңыз Sonatype JIRA билетін жасаңыз). Репозиторийді ашқаннан кейін JIRA логин/құпия сөз жұбы (бұдан әрі Sonatype тіркелгісі деп аталады) артефактілерді Sonatype nexus жүйесіне жүктеп салу үшін пайдаланылады.
  • Әрі қарай, GPG кілтін жасау процесі өте құрғақ сипатталған. Қосымша мәліметтер алу үшін бөлімді қараңыз. Артефактілерге қол қою үшін GnuPG конфигурациялануда
  • GPG кілтін (gnupg/gnupg2) жасау үшін Linux консолін пайдалансаңыз, орнатуыңыз керек. құрал-жабдықтар энтропия құру үшін. Әйтпесе, кілттерді құру өте ұзақ уақыт алуы мүмкін.
  • Сақтау қызметтері қоғамдық GPG кілттері

Мазмұнына

GitLab жүйесінде орналастыру жобасын орнату

  • Ең алдымен, артефактілерді орналастыру үшін құбыр сақталатын жобаны жасау және конфигурациялау қажет. Мен өз жобамды қарапайым және оңай атадым - орналастыру
  • Репозиторийді жасағаннан кейін репозиторийді өзгерту үшін кіруді шектеу керек.
    Жоба -> Параметрлер -> Репозиторий -> Қорғалған тармақтарға өтіңіз. Біз барлық ережелерді жоямыз және Wildcard * бар жалғыз ережені тек Техникалық қызмет көрсетуші рөлі бар пайдаланушылар үшін басу және біріктіру құқығымен қосамыз. Бұл ереже осы жобаның және осы жоба тиесілі топтың барлық пайдаланушылары үшін жұмыс істейді.
    maven center жүйесіне java жобасын жүктеп салу үшін GitLab CI орнату
  • Егер бірнеше жөндеушілер болса, ең жақсы шешім жобаға қол жеткізуді шектеу болады.
    Жоба -> Параметрлер -> Жалпы -> Көріну, жоба мүмкіндіктері, рұқсаттар бөліміне өтіп, Жобаның көріну мүмкіндігін орнатыңыз. жеке.
    Менде жалпыға қолжетімді жоба бар, өйткені мен өзімнің GitLab Runner-ді пайдаланамын және репозиторийді өзгертуге тек менде рұқсат бар. Шын мәнінде, жалпыға ортақ құбыр журналдарында жеке ақпаратты көрсету менің мүддемде емес.
  • Репозиторийді өзгерту ережелерін қатайту
    Жоба -> Параметрлер -> Репозиторий -> Push ережелері бөліміне өтіп, Committer шектеуі жалаушаларын орнатыңыз, Автордың GitLab пайдаланушысы екенін тексеріңіз. Мен де орнатуды ұсынамын қол қоюға міндеттенеді, және Қол қойылмаған тапсырудан бас тарту жалаушасын орнатыңыз.
  • Әрі қарай, тапсырмаларды орындау үшін триггерді конфигурациялау қажет
    Жоба -> Параметрлер -> CI / CD -> Құбыр триггерлеріне өтіңіз және жаңа триггер-токен жасаңыз
    Бұл таңбалауышты жобалар тобы үшін айнымалылардың жалпы конфигурациясына бірден қосуға болады.
    Топ -> Параметрлер -> CI / CD -> Айнымалылар тармағына өтіп, айнымалыны қосыңыз DEPLOY_TOKEN мәндегі триггер-таңбалауышпен.

Мазмұнына

GitLab Runner

Бұл бөлім жергілікті (арнайы) және жалпы (ортақ) жүгіргішті пайдаланып орналастыру кезінде орындалатын тапсырмаларға арналған конфигурацияны сипаттайды.

Арнайы жүгіруші

Мен өзімнің жүгірушілерімді қолданамын, себебі бұл ең алдымен ыңғайлы, жылдам, арзан.
Жүгірушілерге 1 процессоры, 2 ГБ жедел жады, 20 ГБ қатты дискі бар Linux VDS ұсынамын. Шығару бағасы жылына ~ 3000₽.

Менің жүгірушім

Жүгіруші үшін мен VDS 4 CPU, 4 ГБ жедел жады, 50 ГБ SSD алдым. Құны ~11000₽ және ешқашан өкінген емес.
Менде барлығы 7 машина бар. Арубада 5 және Ихорда 2.

Сонымен, бізде жүгіруші бар. Енді біз оны орнатамыз.
Біз SSH арқылы машинаға өтіп, java, git, maven, gnupg2 орнатамыз.

Мазмұнына

Gitlab runner орнату

  • Жаңа топ құру runner
    sudo groupadd runner
  • maven кэшіне каталог жасаңыз және топтық құқықтарды тағайындаңыз runner
    Бір машинада бірнеше жүгіргішті іске қосуды жоспарламасаңыз, бұл қадамды өткізіп жіберуге болады.

    mkdir -p /usr/cache/.m2/repository
    chown -R :runner /usr/cache
    chmod -R 770 /usr/cache
  • Пайдаланушы жасаңыз gitlab-deployer және топқа қосыңыз runner
    useradd -m -d /home/gitlab-deployer gitlab-deployer
    usermod -a -G runner gitlab-deployer
  • Файлға қосу /etc/ssh/sshd_config келесі жол
    AllowUsers root@* [email protected]
  • Қайта жүктеу sshd
    systemctl restart sshd
  • Пайдаланушыға құпия сөз орнатыңыз gitlab-deployer (бұл қарапайым болуы мүмкін, өйткені жергілікті хост үшін шектеу бар)
    passwd gitlab-deployer
  • GitLab Runner орнату (Linux x86-64)
    sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
    sudo chmod +x /usr/local/bin/gitlab-runner
    ln -s /usr/local/bin/gitlab-runner /etc/alternatives/gitlab-runner
    ln -s /etc/alternatives/gitlab-runner /usr/bin/gitlab-runner
  • gitlab.com -> deploy-project -> Параметрлер -> CI/CD -> Жүгірушілер -> Арнайы жүгірушілер тармағына өтіп, тіркеу таңбалауышын көшіріңіз.

Экран

maven center жүйесіне java жобасын жүктеп салу үшін GitLab CI орнату

  • Жүгірушіні тіркеу
    gitlab-runner register --config /etc/gitlab-runner/gitlab-deployer-config.toml

процесс

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 -> Жүгірушілер -> Арнайы жүгірушілер -> Осы жоба үшін белсендірілген жүгірушілер

Экран

maven center жүйесіне java жобасын жүктеп салу үшін GitLab CI орнату

  • қосу бөлек қызмет көрсету /etc/systemd/system/gitlab-deployer.service
    [Unit]
    Description=GitLab Deploy Runner
    After=syslog.target network.target
    ConditionFileIsExecutable=/usr/local/bin/gitlab-runner
    [Service]
    StartLimitInterval=5
    StartLimitBurst=10
    ExecStart=/usr/local/bin/gitlab-runner "run" "--working-directory" "/home/gitlab-deployer" "--config" "/etc/gitlab-runner/gitlab-deployer-config.toml" "--service" "gitlab-deployer" "--syslog" "--user" "gitlab-deployer"
    Restart=always
    RestartSec=120
    [Install]
    WantedBy=multi-user.target
  • Біз қызметті бастаймыз.
    systemctl enable gitlab-deployer.service
    systemctl start gitlab-deployer.service
    systemctl status gitlab-deployer.service
  • Жүгірушінің жүгіріп тұрғанын тексеріңіз.

Мысал:

maven center жүйесіне java жобасын жүктеп салу үшін GitLab CI орнату

Мазмұнына

GPG кілттерін жасау

  • Сол машинадан біз пайдаланушының астындағы ssh арқылы өтеміз gitlab-deployer (бұл GPG кілтін жасау үшін маңызды)

    ssh [email protected]

  • Сұрақтарға жауап беру арқылы кілт жасаймыз. Мен өз атымды және электрондық поштамды пайдаландым.
    Кілт үшін құпия сөзді көрсетуді ұмытпаңыз. Артефактілерге осы кілтпен қол қойылады.

    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-deployer
    su gitlab-deployer 
  • maven каталогын жасаңыз репозиторий және кэшпен байланыстыру (қате жасамаңыз)
    Бір машинада бірнеше жүгіргішті іске қосуды жоспарламасаңыз, бұл қадамды өткізіп жіберуге болады.

    mkdir -p ~/.m2/repository
    ln -s /usr/cache/.m2/repository /home/gitlab-deployer/.m2/repository
  • Негізгі кілт жасаңыз
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • ~/.m2/settings-security.xml файлын жасаңыз
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • Sonatype тіркелгісінен құпия сөзді шифрлау
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • ~/.m2/settings.xml файлын жасаңыз
    <settings>  
    <profiles>
        <profile>
            <id>env</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <gpg.passphrase>GPG_SECRET_KEY_PASSPHRASE</gpg.passphrase>
            </properties>
        </profile>
    </profiles>
    <servers>
        <server>
            <id>sonatype</id>
            <username>SONATYPE_USERNAME</username>
            <password>{98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}</password>
        </server>
    </servers>
    </settings>

қайда,
GPG_SECRET_KEY_PASSPHRASE - GPG кілтінің құпия сөзі
SONATYPE_USERNAME — сонатиптік тіркелгіге кіру

Бұл жүгіргішті орнатуды аяқтайды, бөлімге өтуге болады GitLab CI

Мазмұнына

Ортақ жүгіруші

GPG кілттерін жасау

  • Ең алдымен, сізге GPG кілтін жасау керек. Ол үшін gnupg орнатыңыз.

    yum install -y gnupg

  • Сұрақтарға жауап беру арқылы кілт жасаймыз. Мен өз атымды және электрондық поштамды пайдаландым. Кілт үшін құпия сөзді көрсетуді ұмытпаңыз.

    gpg --gen-key 

  • Негізгі ақпаратты алыңыз

    gpg --list-keys -a
    pub   rsa3072 2019-04-24 [SC] [expires: 2021-04-23]
      2D0D1706366FC4AEF79669E24D09C55BBA3FD728
    uid           [ultimate] tttemp <[email protected]>
    sub   rsa3072 2019-04-24 [E] [expires: none]

  • Біздің ашық кілтімізді кілт серверіне жүктеп салу

    gpg --keyserver keys.gnupg.net --send-key 2D0D1706366FC4AEF79669E24D09C55BBA3FD728
    gpg: sending key 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 to hkp server keys.gnupg.net

  • Біз жеке кілтті аламыз

    gpg --export-secret-keys --armor 2D0D1706366FC4AEF79669E24D09C55BBA3FD728
    -----BEGIN PGP PRIVATE KEY BLOCK-----
    lQWGBFzAqp8BDADN41CPwJ/gQwiKEbyA902DKw/WSB1AvZQvV/ZFV77xGeG4K7k5
    ...
    =2Wd2
    -----END PGP PRIVATE KEY BLOCK-----

  • Жоба параметрлері -> Параметрлер -> CI / CD -> Айнымалылар тармағына өтіп, жеке кілтті айнымалыға сақтаңыз GPG_SECRET_KEY
    maven center жүйесіне java жобасын жүктеп салу үшін GitLab CI орнату

Мазмұнына

Maven орнату

  • Негізгі кілт жасаңыз
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Жоба параметрлері -> Параметрлер -> CI / CD -> Айнымалылар тармағына өтіп, айнымалыға сақтаңыз SETTINGS_SECURITY_XML келесі жолдар:
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • Sonatype тіркелгісінен құпия сөзді шифрлау
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • Жоба параметрлері -> Параметрлер -> CI / CD -> Айнымалылар тармағына өтіп, айнымалыға сақтаңыз SETTINGS_XML келесі жолдар:
    <settings>  
    <profiles>
        <profile>
            <id>env</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <gpg.passphrase>GPG_SECRET_KEY_PASSPHRASE</gpg.passphrase>
            </properties>
        </profile>
    </profiles>
    <servers>
        <server>
            <id>sonatype</id>
            <username>sonatype_username</username>
            <password>{98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}</password>
        </server>
    </servers>
    </settings>

қайда,
GPG_SECRET_KEY_PASSPHRASE - GPG кілтінің құпия сөзі
SONATYPE_USERNAME — сонатиптік тіркелгіге кіру

Мазмұнына

Докер кескінін орналастыру

  • Біз Java тілінің қалаған нұсқасымен орналастыру кезінде тапсырмаларды орындау үшін өте қарапайым Dockerfile жасаймыз. Төменде альпі үшін мысал келтірілген.

    FROM java:8u111-jdk-alpine
    RUN apk add gnupg maven git --update-cache 
    --repository http://dl-4.alpinelinux.org/alpine/edge/community/ --allow-untrusted && 
    mkdir ~/.m2/

  • Жобаңызға контейнер салу

    docker build -t registry.gitlab.com/group/deploy .

  • Біз контейнерді аутентификациядан өткіземіз және тізілімге жүктейміз.

    docker login -u USER -p PASSWORD registry.gitlab.com
    docker push registry.gitlab.com/group/deploy

Мазмұнына

GitLab CI

Жобаны қолдану

.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

Мазмұнына

Java жобасы

Жалпы репозитарийлерге жүктеп салу керек java жобаларында Шығарылым және сурет нұсқаларын жүктеп алу үшін 2 қадамды қосу керек.

.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}

Бұл шешімде мен сәл әрі қарай жүріп, java жобалары үшін бір CI үлгісін пайдалануды шештім.

Егжей-тегжейлі

Мен бөлек жоба жасадым gitlab-ci онда мен java жобалары үшін CI үлгісін орналастырдым ортақ.yml.

ортақ.yml

stages:
  - build
  - test
  - verify
  - deploy

variables:
  SONAR_ARGS: "
  -Dsonar.gitlab.commit_sha=${CI_COMMIT_SHA} 
  -Dsonar.gitlab.ref_name=${CI_COMMIT_REF_NAME} 
  "

.build_java_project:
  stage: build
  tags:
    - touchbit-shell
  variables:
    SKIP_TEST: "false"
  script:
    - mvn clean
    - mvn package -DskipTests=${SKIP_TEST}
  artifacts:
    when: always
    expire_in: 30 day
    paths:
      - "*/target/reports"

.build_sphinx_doc:
  stage: build
  tags:
    - touchbit-shell
  variables:
    DOCKERFILE: .indirect/docs/Dockerfile
  script:
    - docker build --no-cache -t ${CI_PROJECT_NAME}/doc -f ${DOCKERFILE} .

.junit_module_test_run:
  stage: test
  tags:
    - touchbit-shell
  variables:
    MODULE: ""
  script:
    - cd ${MODULE}
    - mvn test
  artifacts:
    when: always
    expire_in: 30 day
    paths:
      - "*/target/reports"

.junit_test_run:
  stage: test
  tags:
    - touchbit-shell
  script:
    - mvn test
  artifacts:
    when: always
    expire_in: 30 day
    paths:
    - "*/target/reports"

.sonar_review:
  stage: verify
  tags:
    - touchbit-shell
  dependencies: []
  script:
    - >
      if [ "$CI_BUILD_REF_NAME" == "master" ]; then
        mvn compile sonar:sonar -Dsonar.login=$SONAR_LOGIN $SONAR_ARGS
      else
        mvn compile sonar:sonar -Dsonar.login=$SONAR_LOGIN $SONAR_ARGS -Dsonar.analysis.mode=preview
      fi

.trigger_deploy:
  stage: deploy
  tags:
    - touchbit-shell
  variables:
    URL: "https://gitlab.com/api/v4/projects/10345765/trigger/pipeline"
    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:
  - wget --content-on-error -qO- ${URL} --post-data ${POST_DATA}

.trigger_release_deploy:
  extends: .trigger_deploy
  only:
    - tags

.trigger_snapshot_deploy:
  extends: .trigger_deploy
  when: manual
  except:
    - tags

Нәтижесінде, java жобаларының өзінде .gitlab-ci.yml өте жинақы және толық емес көрінеді.

.gitlab-ci.yml

include: https://gitlab.com/TouchBIT/gitlab-ci/raw/master/common.yml

Shields4J:
  extends: .build_java_project

Sphinx doc:
  extends: .build_sphinx_doc
  variables:
    DOCKERFILE: .docs/Dockerfile

Sonar review:
  extends: .sonar_review
  dependencies:
    - Shields4J

Release:
  extends: .trigger_release_deploy

Snapshot:
  extends: .trigger_snapshot_deploy

Мазмұнына

pom.xml конфигурациясы

Бұл тақырып өте егжей-тегжейлі сипатталған. Googolplex в Артефактілерге автоматты түрде қол қою және жүктеп салу үшін maven орнату және репозиторийлерді қою, сондықтан мен плагиндерді пайдаланудың кейбір нюанстарын сипаттаймын. Мен сондай-ақ қаншалықты оңай және табиғи түрде қолдануға болатынын сипаттаймын nexus-staging-maven-pluginегер сіз жобаңыздың ата-анасы ретінде org.sonatype.oss:oss-parent қолданбасын қаламасаңыз немесе пайдалана алмасаңыз.

maven-install-plugin

Модульдерді жергілікті репозиторийге орнатады.
Басқа жобалардағы шешімдерді жергілікті тексеру үшін, сондай-ақ бақылау сомасы үшін өте пайдалы.

<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>

Мазмұнына

maven-javadoc-плагин

Жоба үшін Javadoc жасау.

<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>

Егер сізде java жоқ модуль болса (мысалы, тек ресурстар)
Немесе сіз негізінен javadoc генерациялауды қаламайсыз, содан кейін көмектесу үшін maven-jar-plugin

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <executions>
    <execution>
      <id>empty-javadoc-jar</id>
      <phase>generate-resources</phase>
      <goals>
        <goal>jar</goal>
      </goals>
      <configuration>
        <classifier>javadoc</classifier>
        <classesDirectory>${basedir}/javadoc</classesDirectory>
      </configuration>
    </execution>
  </executions>
</plugin>

Мазмұнына

maven-gpg-плагин

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-gpg-plugin</artifactId>
  <executions>
    <execution>
      <id>sign-artifacts</id>
      <!-- Сборка будет падать, если отсутствует GPG ключ -->
      <!-- Подписываем артефакты только на фазе deploy -->
      <phase>deploy</phase>
      <goals>
        <goal>sign</goal>
      </goals>
    </execution>
  </executions>
</plugin>

Мазмұнына

nexus-staging-maven-plugin

Конфигурация:

<project>
  <!-- ... -->
  <build>
    <plugins>
      <!-- ... -->
      <plugin>
        <groupId>org.sonatype.plugins</groupId>
        <artifactId>nexus-staging-maven-plugin</artifactId>
      </plugin>
    </plugins>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.sonatype.plugins</groupId>
          <artifactId>nexus-staging-maven-plugin</artifactId>
          <extensions>true</extensions>
          <configuration>
            <serverId>sonatype</serverId>
            <nexusUrl>https://oss.sonatype.org/</nexusUrl>
            <!-- Обновляем метаданные, чтобы пометить артефакт как release -->
            <!-- Не влияет на snapshot версии -->
            <updateReleaseInfo>true</updateReleaseInfo>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-deploy-plugin</artifactId>
          <configuration>
            <!-- Отключаем плагин -->
            <skip>true</skip>
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
  <distributionManagement>
    <snapshotRepository>
      <id>sonatype</id>
      <name>Nexus Snapshot Repository</name>
      <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
    </snapshotRepository>
    <repository>
      <id>sonatype</id>
      <name>Nexus Release Repository</name>
      <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
    </repository>
  </distributionManagement>
</project>

Егер сізде көп модульді жоба болса және репозиторийге нақты модульді жүктеп салу қажет болмаса, онда осы модульдің pom.xml файлына қосу керек. nexus-staging-maven-plugin тумен skipNexusStagingDeployMojo

<build>
  <plugins>
    <plugin>
      <groupId>org.sonatype.plugins</groupId>
      <artifactId>nexus-staging-maven-plugin</artifactId>
      <configuration>
        <skipNexusStagingDeployMojo>true</skipNexusStagingDeployMojo>
      </configuration>
    </plugin>
  </plugins>
</build>

Жүктеп салынғаннан кейін сурет/шығару нұсқалары қол жетімді қоймаларды орналастыру

<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 орталығында жүктеп алу мүмкіндігін автоматты түрде шығаруды тексеру

Мазмұнына

нәтиже

SNAPSHOT нұсқасын жариялау

Жобаны құру кезінде SNAPSHOT нұсқасын nexus жүйесіне жүктеп алу үшін тапсырманы қолмен бастауға болады

maven center жүйесіне java жобасын жүктеп салу үшін GitLab CI орнату

Бұл тапсырма іске қосылғанда, орналастыру жобасындағы сәйкес тапсырма іске қосылады (мысал).

кесілген журнал

Running with gitlab-runner 11.10.0 (3001a600)
  on Deploy runner JSKWyxUw
Using Shell executor...
Running on ih1174328.vds.myihor.ru...
Skipping Git repository setup
Skipping Git checkout
Skipping Git submodules setup
$ rm -rf .* *
$ git config --global credential.helper store
$ echo "https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com" >> ~/.git-credentials
$ git clone ${DEPLOY_CI_REPOSITORY_URL} .
Cloning into 'shields4j'...
$ git checkout ${DEPLOY_CI_COMMIT_SHA}
Note: checking out '850f86aa317194395c5387790da1350e437125a7'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
  git checkout -b new_branch_name
HEAD is now at 850f86a... skip deploy test-core
$ for pom in $(find . -name pom.xml); do # collapsed multi-line command
$ if [[ "${DEPLOY_CI_COMMIT_TAG}" != "" ]]; then # collapsed multi-line command
[INFO] Scanning for projects...
[INFO] Inspecting build with total of 4 modules...
[INFO] Installing Nexus Staging features:
[INFO]   ... total of 4 executions of maven-deploy-plugin replaced with nexus-staging-maven-plugin
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] 
[INFO] Shields4J                                                          [pom]
[INFO] test-core                                                          [jar]
[INFO] Shields4J client                                                   [jar]
[INFO] TestNG listener                                                    [jar]
[INFO] 
[INFO] --------------< org.touchbit.shields4j:shields4j-parent >---------------
[INFO] Building Shields4J 1.0.0                                           [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
[INFO] 
[INFO] --- versions-maven-plugin:2.5:set (default-cli) @ shields4j-parent ---
[INFO] Searching for local aggregator root...
[INFO] Local aggregation root: /home/gitlab-deployer/JSKWyxUw/0/TouchBIT/deploy/shields4j
[INFO] Processing change of org.touchbit.shields4j:shields4j-parent:1.0.0 -> 1.0.0-SNAPSHOT
[INFO] Processing org.touchbit.shields4j:shields4j-parent
[INFO]     Updating project org.touchbit.shields4j:shields4j-parent
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO] 
[INFO] Processing org.touchbit.shields4j:client
[INFO]     Updating parent org.touchbit.shields4j:shields4j-parent
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO]     Updating dependency org.touchbit.shields4j:test-core
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO] 
[INFO] Processing org.touchbit.shields4j:test-core
[INFO]     Updating parent org.touchbit.shields4j:shields4j-parent
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO] 
[INFO] Processing org.touchbit.shields4j:testng
[INFO]     Updating parent org.touchbit.shields4j:shields4j-parent
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO]     Updating dependency org.touchbit.shields4j:client
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO]     Updating dependency org.touchbit.shields4j:test-core
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] Shields4J 1.0.0 .................................... SUCCESS [  0.992 s]
[INFO] test-core .......................................... SKIPPED
[INFO] Shields4J client ................................... SKIPPED
[INFO] TestNG listener 1.0.0 .............................. SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.483 s
[INFO] Finished at: 2019-04-21T02:40:42+03:00
[INFO] ------------------------------------------------------------------------
$ mvn clean deploy -DskipTests=${SKIP_TESTS}
[INFO] Scanning for projects...
[INFO] Inspecting build with total of 4 modules...
[INFO] Installing Nexus Staging features:
[INFO]   ... total of 4 executions of maven-deploy-plugin replaced with nexus-staging-maven-plugin
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] 
[INFO] Shields4J                                                          [pom]
[INFO] test-core                                                          [jar]
[INFO] Shields4J client                                                   [jar]
[INFO] TestNG listener                                                    [jar]
[INFO] 
[INFO] --------------< org.touchbit.shields4j:shields4j-parent >---------------
[INFO] Building Shields4J 1.0.0-SNAPSHOT                                  [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
...
DELETED
...
[INFO]  * Bulk deploy of locally gathered snapshot artifacts finished.
[INFO] Remote deploy finished with success.
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] Shields4J 1.0.0-SNAPSHOT ........................... SUCCESS [  2.375 s]
[INFO] test-core .......................................... SUCCESS [  3.929 s]
[INFO] Shields4J client ................................... SUCCESS [  3.815 s]
[INFO] TestNG listener 1.0.0-SNAPSHOT ..................... SUCCESS [ 36.134 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 47.629 s
[INFO] Finished at: 2019-04-21T02:41:32+03:00
[INFO] ------------------------------------------------------------------------

Нәтижесінде nexus нұсқасы жүктеледі 1.0.0-СУРЕТ.

Барлық сурет нұсқаларын сайттағы репозиторийден жоюға болады oss.sonatype.org есептік жазбаңыздың астында.

maven center жүйесіне java жобасын жүктеп салу үшін GitLab CI орнату

Мазмұнына

Шығарылым нұсқасын жариялау

Тег орнатылған кезде, nexus жүйесіне шығарылым нұсқасын жүктеп салу үшін орналастыру жобасындағы сәйкес тапсырма автоматты түрде іске қосылады (мысал).

maven center жүйесіне java жобасын жүктеп салу үшін GitLab CI орнату

Ең жақсы бөлігі - жақын босату 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 &lt;a href=http://keys.gnupg.net:11371/&gt;http://keys.gnupg.net:11371/&lt;/a&gt;. 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 center жүйесіне java жобасын жүктеп салу үшін GitLab CI орнату

Шығарылғаннан кейін, біраз уақыттан кейін артефактілер болады maven center жүйесіне java жобасын жүктеп салу үшін GitLab CI орнату

тақырыптан тыс

Мавеннің басқа қоғамдық репозиторийлерді индекстейтіні маған аян болды.
Мен robots.txt файлын жүктеп салуға тура келді, себебі ол менің ескі репозиторийімді индекстеген.

Мазмұнына

қорытынды

Бізде не бар

  • Әртүрлі әзірлеу тілдеріне арналған жалпы репозиторийлерге артефактілерді жүктеп салуға арналған бірнеше CI тапсырмаларын орындауға болатын бөлек орналастыру жобасы.
  • Орналастыру жобасы сыртқы кедергілерден оқшауланған және оны тек Ие және Техникалық қызмет көрсетуші рөлдері бар пайдаланушылар өзгерте алады.
  • Тек орналастыру тапсырмаларын іске қосу үшін «ыстық» кэші бар бөлек арнайы жүгіруші.
  • Жалпы репозиторийде сурет/шығару нұсқаларын жариялау.
  • Шығарылым нұсқасын maven center-те жариялауға дайын болу үшін автоматты тексеру.
  • maven center жүйесінде «шикі» нұсқаларды автоматты түрде жариялаудан қорғау.
  • «Басу арқылы» сурет нұсқаларын жасаңыз және жариялаңыз.
  • Суретті/шығару нұсқаларын алуға арналған жалғыз репозиторий.
  • Java жобасын құруға / тестілеуге / жариялауға арналған жалпы құбыр.

GitLab CI орнату бірінші көзқараста көрінетіндей күрделі тақырып емес. CI-ді кілт тапсыру негізінде бірнеше рет орнату жеткілікті, енді сіз бұл мәселеде әуесқойдан алыссыз. Сонымен қатар, GitLab құжаттамасы өте артық. Бірінші қадам жасаудан қорықпаңыз. Жол жүрген адамның баспалдақтары астында пайда болады (кім айтқаны есімде жоқ :)

Мен кері байланыс алуға қуаныштымын.

Келесі мақалада мен GitLab CI жүйесін интеграциялық сынақтармен тапсырмаларды бәсекеге қабілетті түрде орындау үшін қалай конфигурациялау керектігі туралы айтатын боламын (докер-композит көмегімен сынақтан өтіп жатқан қызметтерді іске қосу), егер сізде тек бір қабықша жүгіргіші болса.

Мазмұнына

Ақпарат көзі: www.habr.com

пікір қалдыру