Usando o plug-in Artifactory no pipeline declarativo do Jenkins

13

Estou usando o pipeline declarativo Jenkins para automatizar meu processo de criação. Queremos publicar nossos artefatos em um repositório JFrog remoto apenas se determinadas condições (Sonar, Checkmarx) forem aprovadas.

Depois de um pouco de pesquisa, descobri que o plugin Artifactory é útil para isso. Mas não consigo encontrar nenhum documento sobre como integrar no pipeline declarativo. Abaixo está o trecho de código de 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
            }

        }   
    }
}

A publicação condicional não é possível com o código acima, pois não posso reutilizar a variável do servidor , mesmo que eu desabilite a publicação automática.

Dharanidhar
fonte

Respostas:

3

Você pode ter condicionais em seu pipeline declarativo usando o bloco quando dentro de um estágio. Existe um plug-in chamado "injetor de ambiente" que permite definir variáveis ​​fora do script de pipeline, o que é bom. Além disso, se você colocar a etapa abaixo das outras etapas, ela não será executada se elas falharem.

 when {
    environment name: 'pushArtifact', value: 'true'
  }
  steps{
     //push artifact  
  }
Jesper Olsson
fonte
Obrigado pela dica. Se eu entendi direito uma variável deve ser definido após ter sido cumpridas as condições e verifique se variável na etapa pré-compilação
Dharanidhar
2

Penso que o seu problema está enraizado na variável do servidor que não é reutilizável fora do bloco do estágio de pré-construção.

No declarativo de Jenkins, você pode definir variáveis ​​como essa usando o script { ... }bloco, mas depois de sair do estágio, essas variáveis ​​ficam inacessíveis a outras para os estágios.

Com as sugestões anteriores, eu recomendaria o seguinte:

Abrigue o código de implantação artefato em uma biblioteca compartilhada.

gradle_artifactory.groovy

    def call (Map parameters = [:]) {// mapeamento opcional de parâmetros

        def server = Artifactory.server 'LocalJfrog'
        def rtGradle = Artifactory.newGradleBuild ()
        servidor rtGradle.resolver: servidor, repositório: 'gradle-dev-local'
        servidor rtGradle.deployer: server, repo: 'gradle-release-local'
        rtGradle.useWrapper = true
        def buildInfo = rtGradle.run rootDir: "projectDir /", buildFile: 
            'build.gradle', tarefas: 'clean artifactoryPublish'

    }

Então, mantenha seus pipelines declarativos D.R.Y

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

refs:

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

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

Elektrolyte
fonte
1

Se você deseja incorporar lógica no arquivo Jenkins, a sintaxe declarativa pode não ser o melhor método, pois nem sempre é fácil refleti-la no código.

Se você alternar para o pipeline com script Jenkinsfile, poderá definir e usar condições de uma maneira mais fácil.

Michael Pereira
fonte
1
Obrigado pela resposta. Estou ciente do pipeline com script, mas, desde então, essa é uma necessidade básica para qualquer projeto que seria incluído no pipeline declarativo. Vai voltar para o script ou roteiro Groovy externo, então
Dharanidhar