在Jenkins声明式管道中使用构建基块

时间:2020-06-04 08:43:16

标签: jenkins jenkins-pipeline jenkins-groovy jenkins-declarative-pipeline

我只是从使用Jenkins声明性管道开始。当我支持一些类似的项目时,我正在考虑将类似的流程步骤(甚至阶段)放入可重用的构建块中。这些区块应维护在中央位置,然后由各个管道包含(例如:DRY)。

我将共享库视为脚本管道的一个选项,但是我不确定它是否也适用于声明性管道。

您知道在Jenkins声明性管道中使用诸如构建基块之类的方法吗?

示例以澄清:

如果您有用于Maven项目的标准管道(例如Spring Boot),则看起来像这样:

pipeline {
    agent {
        dockerfile true
    }
    stages {
        stage('Build') {
            steps {
                sh 'mvn -U -DskipTests clean package'
            }
        }
        stage('Test') {
            parallel {
                stage('Unit Tests') {
                    steps {
                        sh 'mvn test'
                    }
                }
                stage('Integration Tests') {
                    steps {
                        sh 'mvn integration-test'
                    }
                }
            }
        }
        stage('Deploy') {
            steps {
                sh 'mvn deploy'
            }
        }
    }
}

但是,如果可以轻松处理以下用例,那么最好将其复制到所有项目中。

对于无需自定义的项目,最好将其用于示例,例如:

defaultMavenpipeline{}

其中defaultMavenpipeline将被上述管道替换(我认为共享库可以实现)。

对于只需要自定义某些阶段的项目,这样的事情可能发生吗?

pipeline {
    defaultDockerAgent{}
    stages {
        stage('Build') {
            steps {
                sh 'mvn -U -DskipTests clean package'
                // ... customize some stuff ...
            }
        }
        defaultTestStage{}
        stage('Deploy') {
            steps {
                // ... customize some stuff ...
                sh 'mvn deploy'
            }
        }
    }
}

很抱歉,很长的帖子,非常感谢!

2 个答案:

答案 0 :(得分:3)

您可以在Shared-Library中非常使用声明性管道。

请按照以下步骤操作:

1)创建一个共享库

  • 创建存储库共享库
  • 在上述存储库中创建一个名为vars的目录。在vars目录中,创建具有以下内容的文件sayHello.groovy:

// vars/sayHello.groovy
def call(String name = 'human') {
    // Any valid steps can be called from this code.
    // Can be used in both scripted and declarative pipeline
    echo "Hello, ${name}."
}

2)配置Jenkins以在任何管道作业中访问共享库

  • 去管理Jenkins»配置系统»“全局管道库”部分
  • 根据需要命名库(在我的情况下为my-shared-library,如下所示)
  • 添加包含您的Groovy代码的分支名称。就我而言,它位于默认分支中,即master
  • 除非您知道自己在做什么,否则无需选中/取消选中复选框

3)访问您项目中的共享库

  • 在Jenkinsfile或Pipeline script部分中,添加以下代码:

@Library('my-shared-lib')_

pipeline {
    agent any

    stages {
        stage('Info') {
            steps {
                echo 'Publishing some details here'
            }
        }

        stage('Using shared-library') {
            steps {
                sayHello 'Alex'
            }
        }
    }
}

就是这样。你完成了! :)

注意:对于上述Jenkinsfile中共享库中使用的下划线(_,从official link开始,用于仅定义全局变量({{ 1}})或仅需要全局变量的Jenkinsfile,注释模式vars/对于保持代码简洁可能很有用。本质上,不是对不必要的import语句进行注释,而是对符号@Library('my-shared-library') _进行注释。

输出:

enter image description here

答案 1 :(得分:1)

您可以使用shared libraries

我使用库中的vars部分定义模板(工作流程),使用src部分定义具有可重用方法的类,并且从jenkinsfile中,我仅调用模板,为模板提供特定于项目的参数映射。

这使我可以让开发人员仅通过克隆它们并更改jenkinsfile来创建自己的项目,而我仍然可以控制执行。

在jenkinsfile中:

@Library('jenkinssharedlibrary') _
templatename([
parameter1: "value",
parameter2: "value"])

在共享库中: vars / templatename.groovy

import com.mydomain.someclassivemade
def call(Map<String, String> passedConfig) {
Myclass niceobject = new Myclass()
 pipeline {
        agent {
            label 'test'
        }
        environment {
            PROJECT_VERSION = "${passedConfig.version}"
        }
        tools {
            jdk '....'
        }
        stages {                
         steps {
                script {
                    niceobject.compile(mvn)
                }
            }}
}

在src文件夹中,使用可重用的方法编写类: /src/com/mydomain/Someclassivemade.groovy

 package com.mydomain.someclassivemade
 def build (final String xyz){
   sh("build comand with parameters")
 } 
 return this // very important line :) 

您可以用一种更简单的方法将方法放在vars中,然后从jenkinsfile中调用它们。詹金斯的力量在于灵活性。

另一个有用的link

PS:我可能在这里直接写过语法错误,请告诉我修复它们!