Как организовать деплой артефактов из Jenkins в Nexus?
Деплой артефактов из Jenkins в Nexus — это процесс автоматической публикации собранных артефактов (JAR, WAR, Docker-образов) в Nexus Repository Manager из CI/CD пайплайна.
Способ 1: Maven Deploy (рекомендуемый для Maven-проектов)
Самый простой и идиоматичный способ — использовать mvn deploy с settings.xml, предоставленным через Config File Provider:
Пример
pipeline {
agent { label 'java17-maven' }
stages {
stage('Build & Test') {
steps { sh 'mvn clean verify' }
}
stage('Deploy to Nexus') {
when { branch 'main' }
steps {
configFileProvider([configFile(fileId: 'maven-settings-nexus', variable: 'MVN_SETTINGS')]) {
sh 'mvn deploy -DskipTests -s $MVN_SETTINGS'
}
}
}
}
}
Способ 2: Nexus Artifact Uploader Plugin
Плагин Jenkins, позволяющий загружать артефакты без Maven. Удобен, когда проект собирается не Maven’ом или нужно загрузить произвольные файлы:
Пример использования Nexus Artifact Uploader
stage('Upload to Nexus') {
steps {
nexusArtifactUploader(
nexusVersion: 'nexus3',
protocol: 'https',
nexusUrl: 'nexus.company.com',
groupId: 'com.company',
version: '1.0.0',
repository: 'maven-releases',
credentialsId: 'nexus-credentials',
artifacts: [
[artifactId: 'my-app',
classifier: '',
file: 'target/my-app-1.0.0.jar',
type: 'jar'],
[artifactId: 'my-app',
classifier: '',
file: 'pom.xml',
type: 'pom']
]
)
}
}
Способ 3: Nexus REST API (curl)
Низкоуровневый подход через HTTP API. Максимальная гибкость, не требует плагинов:
Пример
stage('Upload via REST API') {
steps {
withCredentials([usernamePassword(credentialsId: 'nexus-credentials',
usernameVariable: 'USER',
passwordVariable: 'PASS')]) {
sh """
curl -v -u ${USER}:${PASS} \\
--upload-file target/my-app-1.0.0.jar \\
'https://nexus.company.com/repository/maven-releases/com/company/my-app/1.0.0/my-app-1.0.0.jar'
"""
}
}
}
Сравнение способов
| Способ | Когда использовать | Плюсы | Минусы |
|---|---|---|---|
mvn deploy |
Maven-проекты | Идиоматично, POM-метаданные | Только Maven |
| Nexus Artifact Uploader | Произвольные файлы, не-Maven проекты | Универсальность, UI-конфигурация | Дополнительный плагин |
| REST API (curl) | Скрипты, автоматизация, не-Java проекты | Нет зависимостей от плагинов | Ручное формирование URL |
Полный пайплайн с публикацией JAR и Docker-образа
Jenkinsfile: полный цикл от сборки до публикации
pipeline {
agent { label 'java17-maven' }
environment {
VERSION = "${env.BUILD_NUMBER}"
NEXUS_URL = 'https://nexus.company.com'
}
stages {
stage('Build') { steps { sh 'mvn clean compile' } }
stage('Test') { steps { sh 'mvn test' } }
stage('Quality') { steps { sh 'mvn sonar:sonar' } }
stage('Package') { steps { sh "mvn package -DskipTests -Drevision=${VERSION}" } }
stage('Publish JAR to Nexus') {
when { branch 'main' }
steps {
configFileProvider([configFile(fileId: 'maven-settings', variable: 'SETTINGS')]) {
sh "mvn deploy -DskipTests -s \$SETTINGS -Drevision=${VERSION}"
}
}
}
stage('Publish Docker to Nexus') {
when { branch 'main' }
steps {
script {
def img = docker.build("nexus.company.com:8083/my-app:${VERSION}")
docker.withRegistry("${NEXUS_URL}:8083", 'nexus-docker-creds') {
img.push()
img.push('latest')
}
}
}
}
}
}
Вывод
Для Maven-проектов рекомендуется mvn deploy с Config File Provider — это самый простой и поддерживаемый подход. Для Docker-образов — docker.withRegistry(). REST API используется как fallback или для не-Java проектов.
На собеседовании: ключевой вопрос — как передаются credentials при деплое в Nexus. Правильный ответ: через Jenkins Credentials Store и Config File Provider (для
settings.xml) илиwithCredentials(для REST API). Никогда — хардкодом в Jenkinsfile.