Gymterview
middle

Как организовать деплой артефактов из 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.