Configuración de GitLab CI para cargar un proyecto java en maven central


Este artículo está destinado a los desarrolladores de Java que necesitan publicar rápidamente sus productos en los repositorios centrales de sonatype y / o maven utilizando GitLab. En este artículo hablaré sobre la configuración de gitlab-runner, gitlab-ci y maven-plugin para resolver este problema.


Prerrequisitos:


  • Almacenamiento seguro de claves mvn y GPG.
  • Ejecución segura de tareas públicas de CI.
  • Cargue artefactos (lanzamiento / instantánea) en repositorios públicos.
  • Verifique automáticamente las versiones de lanzamiento para su publicación en maven central.
  • Una solución general para cargar artefactos en el repositorio para múltiples proyectos.
  • Simplicidad y usabilidad.


Contenido




Información general


  • Googolplex ya ha descrito en este artículo una descripción detallada del mecanismo para publicar artefactos en Maven Central a través del servicio de alojamiento del repositorio Sonatype OSS, por lo que me referiré a este artículo en los lugares correctos.
  • Nos registramos previamente con Sonatype JIRA y comenzamos un ticket para abrir el repositorio (para más detalles, lea la sección Creación de un ticket para Sonatype JIRA ). Después de abrir el repositorio, el par de inicio de sesión / contraseña de JIRA (en adelante, la cuenta de Sonatype) se usará para cargar artefactos en Sonatype nexus.
  • Además, el proceso de generar una clave GPG se describe muy secamente. Consulte Configuración de GnuPG para firmar artefactos para obtener más información.
  • Si usa la consola de Linux para generar la clave GPG (gnupg / gnupg2), entonces necesita instalar rng-tools para generar entropía. De lo contrario, la generación de claves puede llevar mucho tiempo.
  • Servicios para almacenar claves GPG públicas

Al contenido



Configurar un proyecto de implementación en GitLab


  • En primer lugar, es necesario crear y configurar un proyecto en el que se almacenará la tubería para desplegar artefactos. Llamé a mi proyecto simple y directo: implementar
  • Después de crear el repositorio, debe restringir el acceso para cambiar el repositorio.
    Vaya al proyecto -> Configuración -> Repositorio -> Ramas protegidas. Eliminamos todas las reglas y agregamos la única regla con Comodín * con el derecho de insertar y fusionar solo para usuarios con el rol de Mantenedores. Esta regla funcionará para todos los usuarios de este proyecto, así como para el grupo en el que este proyecto es miembro.
  • Si hay varios mantenedores, la mejor solución sería limitar el acceso al proyecto en principio.
    Vaya al proyecto -> Configuración -> General -> Visibilidad, características del proyecto, permisos y configure Visibilidad del proyecto en Privado .
    Tengo un proyecto en el dominio público, ya que uso mi propio GitLab Runner y solo tengo acceso para cambiar el repositorio. Bueno, en realidad, no me interesa mostrar información privada en registros públicos de canalizaciones.
  • Reglas más estrictas para cambiar el repositorio
    Vaya al proyecto -> Configuración -> Repositorio -> Reglas de inserción y establezca las banderas Restricción de committer, Compruebe si el autor es un usuario de GitLab. También recomiendo que configure la firma de las confirmaciones y establezca el indicador Rechazar confirmaciones sin firmar.
  • A continuación, debe configurar el disparador para ejecutar tareas
    Vaya al proyecto -> Configuración -> CI / CD -> Activadores de canalización y cree un nuevo token de activador
    Este token se puede agregar de inmediato a la configuración general de variables para un grupo de proyectos.
    Vaya al grupo -> Configuración -> CI / CD -> Variables y agregue la variable DEPLOY_TOKEN con token de activación en el valor.

Al contenido



Corredor de Gitlab


Esta sección describe la configuración para iniciar tareas en la implementación utilizando su propio corredor (específico) y público (compartido).



Corredor específico


Utilizo mis propios corredores, ya que en primer lugar es conveniente, rápido y económico.
Para el corredor, recomiendo Linux VDS con 1 CPU, 2 GB de RAM, 20 GB de disco duro. El precio de emisión es ~ 3000₽ por año.


Mi corredor

Para el corredor, tomé VDS 4 CPU, 4 GB de RAM, 50 GB de SSD. Costó ~ 11,000 rublos y nunca se arrepintió.
Tengo un total de 7 autos. 5 en aruba y 2 en ihor.


Entonces, tenemos un corredor. Ahora lo configuraremos.
Vamos a la máquina en SSH e instalamos java, git, maven, gnupg2.


Al contenido



Instalar gitlab runner


  • Crear un nuevo grupo de runner

     sudo groupadd runner 
  • Cree un directorio para la memoria caché de Maven y adjunte los derechos del grupo de runner
    Puede omitir este elemento si no planea ejecutar varios corredores en la misma máquina.

     mkdir -p /usr/cache/.m2/repository chown -R :runner /usr/cache chmod -R 770 /usr/cache 
  • Cree el gitlab-deployer y agregue el runner al grupo

     useradd -m -d /home/gitlab-deployer gitlab-deployer usermod -a -G runner gitlab-deployer 
  • Agregue la siguiente línea al /etc/ssh/sshd_config

     AllowUsers root@* gitlab-deployer@127.0.0.1 
  • Reiniciar sshd

     systemctl restart sshd 
  • Establecemos la contraseña para el gitlab-deployer (puede ser simple, ya que se aplica la restricción para localhost)

     passwd gitlab-deployer 
  • Instalar 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 
  • Vaya a gitlab.com -> deploy-project -> Configuración -> CI / CD -> Runners -> Runners específicos y copie el token de registro

Pantalla


  • Registrar corredor

     gitlab-runner register --config /etc/gitlab-runner/gitlab-deployer-config.toml 

El proceso
 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 (eg 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! 

  • Verifique que el corredor esté registrado. Vaya a gitlab.com -> deploy-project -> Configuración -> CI / CD -> Runners -> Runners específicos -> Runners activados para este proyecto

Pantalla


  • Agregue un servicio separado /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 
  • Iniciamos el servicio.

     systemctl enable gitlab-deployer.service systemctl start gitlab-deployer.service systemctl status gitlab-deployer.service 
  • Verifique que el corredor esté corriendo.

Ejemplo


Al contenido



Generación de clave GPG


  • Desde la misma máquina, pasamos por ssh bajo el usuario gitlab-deployer (esto es importante para generar una clave GPG)


     ssh gitlab-deployer@127.0.0.1 

  • Generamos una clave respondiendo preguntas. Usé mi propio nombre y correo.
    Asegúrese de especificar la contraseña para la clave. Esta clave firmará artefactos.


     gpg --gen-key 

  • Cheque


     gpg --list-keys -a /home/gitlab-deployer/.gnupg/pubring.gpg ---------------------------------------- pub 4096R/00000000 2019-04-19 uid Petruha Petrov <pp@example.com> sub 4096R/11111111 2019-04-19 

  • Subir nuestra clave pública al servidor de claves


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


Al contenido



Configuración de Maven


  • Pasamos al usuario gitlab-deployer

     su gitlab-deployer 
  • Cree un repositorio Maven y enlace al caché (no se equivoque)
    Puede omitir este elemento si no planea lanzar varios corredores en la misma máquina.

     mkdir -p ~/.m2/repository ln -s /usr/cache/.m2/repository /home/gitlab-deployer/.m2/repository 
  • Crea una llave maestra

     mvn --encrypt-master-password password {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=} 
  • Cree el archivo ~ / .m2 / settings-security.xml

     <settingsSecurity> <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master> </settingsSecurity> 
  • Encriptamos la contraseña de la cuenta Sonatype

     mvn --encrypt-password SONATYPE_PASSWORD {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J} 
  • Cree el archivo ~ / .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> 

donde
GPG_SECRET_KEY_PASSPHRASE: contraseña de la clave GPG
SONATYPE_USERNAME - inicio de sesión de cuenta sonatype


Esto completa la configuración del corredor, puede ir a la sección GitLab CI


Al contenido



Corredor compartido



Generación de clave GPG


  • En primer lugar, debe crear una clave GPG. Para hacer esto, instale gnupg.


     yum install -y gnupg 

  • Generamos una clave respondiendo preguntas. Usé mi propio nombre y correo. Asegúrese de especificar la contraseña para la clave.


     gpg --gen-key 

  • Mostramos información sobre la clave


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

  • Subir nuestra clave pública al servidor de claves


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

  • Obtenga la clave privada


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

  • Vaya a la configuración del proyecto -> Configuración -> CI / CD -> Variables y guarde la clave privada en la variable GPG_SECRET_KEY



Al contenido



Configuración de Maven


  • Crea una llave maestra

     mvn --encrypt-master-password password {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=} 
  • Vaya a la configuración del proyecto -> Configuración -> CI / CD -> Variables y guarde las siguientes líneas en la variable SETTINGS_SECURITY_XML :
     <settingsSecurity> <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master> </settingsSecurity> 
  • Encriptamos la contraseña de la cuenta Sonatype
     mvn --encrypt-password SONATYPE_PASSWORD {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J} 
  • Vaya a la configuración del proyecto -> Configuración -> CI / CD -> Variables y guarde las siguientes líneas en la variable 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> 

donde
GPG_SECRET_KEY_PASSPHRASE: contraseña de la clave GPG
SONATYPE_USERNAME - inicio de sesión de cuenta sonatype


Al contenido



Implementar imagen acoplable


  • Cree un Dockerfile lo suficientemente simple como para ejecutar tareas en la implementación con la versión correcta de Java. A continuación se muestra un ejemplo para alpino.


     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/ 

  • Recogemos el contenedor para su proyecto.


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

  • Autenticar y cargar el contenedor en el registro.


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


Al contenido



Gitlab ci



Implementar proyecto


Agregue el archivo .gitlab-ci.yml a la raíz del proyecto de implementación
El script presenta dos tareas mutuamente excluyentes en el despliegue. Runner específico o Runner compartido respectivamente.


.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 

Al contenido



Proyecto Java


En los proyectos de Java que se supone que deben cargarse en repositorios públicos, debe agregar 2 pasos para descargar las versiones Release y 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} 

En esta solución, fui un poco más lejos y decidí usar una plantilla de CI para proyectos de Java.


Más detalles

Creé un proyecto gitlab-ci separado en el que coloqué una plantilla de CI para proyectos common.yml java.


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

Como resultado, en los propios proyectos de Java .gitlab-ci.yml se ve muy compacto y no detallado


.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 

Al contenido



Configuración Pom.xml


Googolplex describe este tema en detalle en Configuración del experto para la firma automática y la carga de artefactos en los depósitos de instantáneas y almacenamiento provisional , por lo que describiré algunos de los matices del uso de complementos. También describiré cuán fácil y naturalmente puede usar el nexus-staging-maven-plugin si no quiere o no puede usar org.sonatype.oss: oss-parent como padre para su proyecto.



complemento-instalación-maven


Instala módulos en el repositorio local.
Muy útil para la verificación local de soluciones en otros proyectos, así como una suma de verificación.


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

Al contenido



Maven-Javadoc-Plugin


Generando javadoc para el proyecto.


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

Si tiene un módulo que no contiene Java (por ejemplo, solo recursos)
O, en principio, no desea generar javadoc, entonces maven-jar-plugin ayudará


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

Al contenido



maven-gpg-plugin


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

Al contenido



nexus-staging-maven-plugin


Configuración:


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

Si tiene un proyecto de varios módulos y no necesita cargar un módulo específico en el repositorio, agregue nexus-staging-maven-plugin con el indicador skipNexusStagingDeployMojo al pom.xml de este módulo


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

Una vez descargadas, las versiones de instantáneas / lanzamiento están disponibles en el repositorio provisional.


 <repositories> <repository> <id>SonatypeNexus</id> <url>https://oss.sonatype.org/content/groups/staging/</url> <!--     snapshot/release   --> </repository> </repositories> 

Más ventajas


  • Una lista muy rica de objetivos para trabajar con el repositorio nexus ( mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin ).
  • Verifique automáticamente el lanzamiento para la capacidad de descarga en maven central

Al contenido



Resultado



Publicar versión SNAPSHOT


Al crear un proyecto, existe la posibilidad de iniciar manualmente una tarea para descargar la versión SNAPSHOT en nexus



Cuando se inicia esta tarea, se activa la tarea correspondiente en el proyecto de implementación ( ejemplo ).


Registro recortado
 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] ------------------------------------------------------------------------ 

Como resultado, la versión 1.0.0-SNAPSHOT se carga en nexus.


Todas las versiones de instantáneas se pueden eliminar del repositorio en oss.sonatype.org bajo su cuenta.



Al contenido



Publicar versión de lanzamiento


Cuando se instala la etiqueta, la tarea correspondiente en el proyecto de implementación se activa automáticamente para descargar la versión de lanzamiento en nexus ( ejemplo ).



La mejor parte es que la liberación cerrada en nexus se activa automáticamente.


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

Y si algo salió mal, entonces la tarea seguramente fallará
 [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 Central


, maven .
robots.txt, .


Al contenido



Conclusión



  • deploy- CI .
  • Deploy- Owner Maintainer.
  • Specific Runner "" deploy .
  • snapshot/release .
  • release maven central.
  • "" maven central.
  • snapshot " ".
  • snapshot/release .
  • // java .

GitLab CI . CI " " , . GitLab . . ( :) ).


.


, GitLab CI ( docker-compose), shell .


Al contenido

Source: https://habr.com/ru/post/449664/


All Articles