
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
- 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 corredorPara 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
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
- 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.
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 detallesCreé 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> <phase>prepare-package</phase> <configuration> <failOnError>true</failOnError> <failOnWarnings>true</failOnWarnings> <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> <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> <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> </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 <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] ------------------------------------------------------------------------
. .

, 
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