Использование плагина Artifactory в декларативном конвейере Jenkins

13

Я использую декларативный конвейер Jenkins для автоматизации процесса сборки. Мы хотим опубликовать наши артефакты в удаленном хранилище JFrog, только если пройдены определенные условия (Sonar, Checkmarx).

После небольшого исследования я обнаружил, что плагин Artifactory полезен для этого. Но я не могу найти какой-либо документ о том, как интегрировать в декларативный конвейер. Ниже приведен фрагмент кода из Jenkinsfile

stages{

    stage('Pre-Build'){
        steps{

             script{
                def server = Artifactory.server 'LocalJfrog'
                def rtGradle = Artifactory.newGradleBuild()
                rtGradle.resolver server: server, repo: 'gradle-dev-local'
                rtGradle.deployer server: server, repo: 'gradle-release-local'
                rtGradle.useWrapper = true
            }

        }   
    }
}

Условная публикация невозможна с указанным выше кодом, поскольку я не могу повторно использовать переменную сервера, даже если я отключил автоматическую публикацию.

Dharanidhar
источник

Ответы:

3

Вы можете иметь условные выражения в своем декларативном конвейере, используя- когда блок внутри стадии. Есть плагин под названием «окружающий инжектор», который позволяет вам устанавливать переменные вне конвейерного скрипта, что приятно. Также, если вы поместите шаг ниже других шагов, он не будет выполнен, если они потерпят неудачу.

 when {
    environment name: 'pushArtifact', value: 'true'
  }
  steps{
     //push artifact  
  }
Джеспер Олссон
источник
Спасибо за подсказку. Если я правильно понял, переменная должна быть установлена ​​после выполнения условий, а затем проверить эту переменную на этапе предварительной сборки
Дхаранидхар,
2

Я думаю, что ваша проблема коренится в серверной переменной, которая не может использоваться повторно за пределами этапа предварительной сборки.

В декларативном Jenkins вы можете определять переменные, подобные этой, используя script { ... }блок, но как только вы покидаете стадию, эти переменные становятся недоступными для других стадий.

С предыдущими предложениями я бы порекомендовал это:

Разместите код развертывания артефакта в общей библиотеке.

gradle_artifactory.groovy

    вызов def (параметры карты = [:]) {// отображение дополнительных параметров

        def server = Artifactory.server 'LocalJfrog'
        def rtGradle = Artifactory.newGradleBuild ()
        Сервер rtGradle.resolver: сервер, репозиторий: 'gradle-dev-local'
        Сервер rtGradle.deployer: сервер, репозиторий: 'gradle-release-local'
        rtGradle.useWrapper = true
        def buildInfo = rtGradle.run rootDir: "projectDir /", buildFile: 
            build.gradle, задачи: очистить артефакты Опубликовать

    }

Затем сохранить ваши декларативные конвейеры D.R.Y

@Library('my-shared-lib') 
...
stage('Artifactory Upload') {
    when { <some expression with sonarqube/checkmarx> }
    steps {
        script {
            gradle_artifactory()
        }
    }
}

рефов:

https://jenkins.io/doc/book/pipeline/syntax/#when

https://jenkins.io/doc/book/pipeline/shared-libraries/

Elektrolyte
источник
1

Если вы хотите встроить логику в файл Jenkinsfile, декларативный синтаксис не может быть лучшим методом, поскольку не всегда легко отразить его в коде.

Если вы переключитесь на конвейер сценариев Jenkinsfile, вы сможете определить и использовать условия более простым способом.

Майкл Перейра
источник
1
Спасибо за ответ. Я знаю о скриптовом конвейере, но, поскольку это основная необходимость для любого проекта, он будет включен в декларативный конвейер. Затем переключимся обратно на сценарий или внешний сценарий
Дхаранидхар