当前位置: 首页 > 知识库问答 >
问题:

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

孟安民
2023-03-14

我刚开始使用Jenkins声明性管道。在我支持一些类似的项目时,我考虑将类似的管道步骤(甚至阶段)放入可重用的构建块中。这些区块应保持在一个中心点,然后由单独的管道包括在内(例如:干燥)。

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

你知道在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'
            }
        }
    }
}

但是,与其将此复制到所有项目中,如果下面的用例可以轻松处理,那就太好了。

对于不需要自定义的项目,最好将其用于examle,如:

defaultMavenpipeline{}

其中defaultMaven管道将被上述管道替换(我认为这对于共享库是可能的)。

对于一个只需要定制一些阶段的项目,这样的事情可能吗?

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个答案

康照
2023-03-14

您可以为此使用共享库。

我使用库中的vars部分来定义一个模板(工作流),src部分用可重用的方法编写类,从jenkins文件中,我只调用模板,为它提供项目特定的参数映射。

这允许我让开发人员只通过克隆和修改Jenkins文件来创建自己的项目,而我仍然可以控制执行。

在Jenkins文件中:

@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中,并从jenkins文件中调用它们。詹金斯的力量在于它的灵活性。

另一个有用的链接

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

步浩壤
2023-03-14

您可以将声明性管道与共享库一起使用。

请按照以下步骤操作:

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»配置系统»全局管道库部分
  • 根据需要命名库(在我的示例中,我的共享库如下所示)
  • 添加包含Groovy代码的分支名称。在我的例子中,它位于默认分支中,即master
  • 除非您知道自己在做什么,否则无需选中/取消选中复选框

3) 访问项目中的共享库

  • 在Jenkinsfile或Pipeline脚本部分,添加以下代码:
@Library('my-shared-lib')_

pipeline {
    agent any

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

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

就这样。你完了!:)

注意:对于Jenkinsfile中共享库中使用的下划线()(来自官方链接),对于仅定义全局变量的共享库(vars/),或仅需要全局变量的Jenkinsfile,注释模式@Library('my-shared-Library')对于保持代码简洁可能很有用。本质上,符号\uu不是注释不必要的导入语句,而是注释符号。

输出:

 类似资料:
  • 我有几个不同repo的Jenkins声明性管道,它们触发数据库刷新,以及依赖于数据库的单元测试。这些Jenkins作业是从GitHub中的pull请求触发的。 为了避免资源冲突,我需要防止这些作业同时运行——无论是在每个项目内还是在各个项目之间。 “油门并发构建”插件似乎就是为此而构建的。 我已经安装了插件,并配置了如下类别: 我在Jenkins文件中添加了“throttle”选项,其中一个存储库

  • 我的存储库中有一个带有Jenkinsfile的多分支管道,我能够拥有我的CI工作流程(构建 为了设置我的夜间构建,我添加了 但是现在,如果我们只是在晚上构建由cron表达式触发的作业,如何执行分析步骤呢? 我的简化构建阶段如下所示:

  • 问题内容: 我正在使用声明性管道语法在Docker容器中执行一些CI工作。 我注意到,用于Jenkins的Docker插件使用主机中jenkins用户的用户ID和组ID运行一个容器(即,如果jenkins用户具有用户ID 100和组ID 111,它将运行管道以创建带有命令)。 我遇到了一些问题,因为该容器将以不存在的用户运行(特别是我遇到了用户没有主目录的问题)。所以我想到了创建一个Dockerf

  • 我在詹金斯内部写了一个声明性管道。此管道应在远程Docker服务器上的Docker容器中运行。 我阅读了自定义执行环境: 自定义执行环境 Pipeline的设计可以轻松地将Docker映像用作单个阶段或整个管道的执行环境。这意味着用户可以定义其管道所需的工具,而无需手动配置代理。实际上,任何可以打包在Docker容器中的工具。只需对Jenkins文件进行少量编辑即可轻松使用。 它工作,但它使用詹金

  • 我正在尝试从管道中自动创建Jenkins管道构建。 我有一个管道,它创建一个比特桶存储库并向其提交一些代码,包括一个Jenkinsfile。 我需要向此管道添加另一个步骤,然后为其创建管道生成,这将运行 Jenkinsfile 中的步骤。 我认为Jobs DSL应该能够处理这一点,但我找到的文档非常稀少,我仍然不完全确定是否有可能或如何做到这一点。 任何帮助都将不胜感激。我想生成的Pipeline

  • 问题内容: 我正在尝试将旧样式的基于项目的工作流转换为基于Jenkins的管道。在浏览文档时,我发现有两种不同的语法分别命名为和。例如最近(2016年底)发布的Jenkins网络语法。尽管有一个新的语法版本,Jenkins仍然也支持脚本语法。 现在,我不确定这两种类型的哪种情况最合适。语法将很快被弃用吗?詹金斯管道的未来会是这样吗? 任何可以分享有关这两种语法类型的想法的人。 问题答案: 最初创建