DevOps实战系列【第十二章】:详解Shared Libraries共享库

news2024/11/16 21:50:03

个人亲自录制全套DevOps系列实战教程手把手教你玩转DevOps全栈技术

随着jenkins pipeline项目越来越多,冗余代码也越来越多,所以share library诞生。

流水线支持在外部仓库中创建【共享库】,然后加载到现有流水线中使用,以达到复用的功能。


共享库目录结构

在这里插入图片描述

  • src目录:源代码,可以定义类、变量、方法等;当执行jenkins pipeline时,该目录内容会被加载到pipeline项目的classes目录
  • vars目录:以.groovy定义的文件,文件名被加载成环境变量名,可通过变量名获取文件中定义的变量或方法(通过def定义变量或方法);

    .txt文件将会作为.groovy同名文件的说明文档,可以在jenkins的全局变量页面查看到此文档,用来说明对应的.groovy中有哪些变量或方法,

    ​ 尽管是.txt结尾,但可以是html、markdown等内容。
  • resources目录:该目录的内容允许Jenkinsfile中的step步骤指令“libraryResource”来加载该目录的非.groovy文件,只能从外部共享库加载文件,而jenkinsfile所在的项目中的内容不能通过libraryResource来加载。通俗点说存放资源文件,如配置文件,方便我们在Jenkinsfile中读取。

src目录定义的源码:2种方式

①class类文件:不能直接使用sh或git等Jenkinsfile中的命令

// 文件名src/org/devops/ClassTest.groovy
package org.devops

/*
 在class类中定义的方法中,是不能执行我们Jenkinsfile中要执行的sh或git等命令的,只能使用groovy原生语法
 如果需要使用sh等命令,可以将变量和方法定义到class外部,即删除class定义即可
*/
class ClassTest implements Serializable {
 def steps;

 ClassTest(steps) {
     this.steps = steps;
 }

 def hello(args) {
   // 这种情况如果想使用sh或git等Jenkinsfile中使用的命令,可以通过Jenkinsfile中调用该方法时传递过来再执行
   // 此处就是执行sh命令,只不过我们将pipeline的this传递过来了
   this.steps.echo args
 }
}

②非class类文件:可以直接使用Jenkinsfile中的命令

// 文件名src/org/devops/NoClassTest.groovy
package org.devops

def hello(args) {
 // 可以直接使用
 echo "NoClassTest is $args"
}

var目录创建变量文件:

该目录创建的文件和src中非class类似,只不过该文件会作为jenkins全局变量存在,而src中的文件会加载到classes目录可以被Jenkinsfile调用。

// 文件名var/abc.groovy
def info(message) {
echo "INFO: ${message}"
}

def warning(message) {
echo "WARNING: ${message}"
}

// 如果要定义字段作为全局变量需要使用注解@groovy.transform.Field
@groovy.transform.Field
def ABC_F = "字段变量"

无需指定package,所以比较简单

集成共享库到Jenkins

共享库配置到jenkins:在scm中创建完仓库后,还需要告诉jenkins,通过jenkins和scm配置好关联后,我们的pipeline项目(Jenkinsfile文件)才能使用@Library引用共享库。

路径:Manage Jenkins » Configure System » Global Pipeline Libraries

在这里插入图片描述
注意:如果Default version写错了,jenkins会有错误提醒的。
在这里插入图片描述


在Jenkins中使用共享库

在这里插入图片描述
注意:导入只有src类库的共享库,可以通过注解@Library(‘mylib@master’) import packageName+className,这样groovy编译器会自动将类库加载到jenkins方便直接使用;

而如果只有var的共享库,则可以使用注解@Library(‘mylib@master’) _ ,这样更整洁,不必增加多个import语句,而_符号是可以被解析的。

// 引入共享库,指定名称和版本
@Library('mylib@master') _

// 定义变量 
def classTest = new org.devops.ClassTest(this)
// 虽然没有class但可以通过文件名直接创建
def noClassTest = new org.devops.NoClassTest()

pipeline {
 agent any
 stages {
     stage('Hello') {
         steps {
             // 声明式语法需要script指令来执行脚本
             script {
                 // 此处我们传递的是this参数
                 echo "$classTest.steps"
                 classTest.hello('测试打印参数')

                 // noclass的测试
                 noClassTest.hello("NoClassTestArgs")

                 // 文件名自动加载为环境变量 
                 abc.info 'Starting'
                 abc.warning 'Nothing to do!'
             }
         }
     }
 }
}

在这里插入图片描述

动态加载:[了解]

  • 只有var的共享库可以直接:library 'mylib@master'该语句后,就可以直接使用var中定义的变量
  • 只有src的共享库可以直接:def lib = library(‘mylib@master’).org.devops,可以直接导入package包,使用lib.NoClassTest.new().hello(“动态调用参数”)

在共享库中定制Jenkinsfile的step步骤:[了解]
就是说我们在Jenkinsfile中常用的步骤sh或git,像这种step步骤,我们可以在共享库中通过var中定义变量来实现,比如我们要定义一个step叫做:sayHello

使用的时候就可以像使用sh或git那样:sayHello ‘abc’

定义方法:创建文件var/sayHello.groovy

// vars/sayHello.groovy
// 通过定义一个特殊的方法call来实现,参数name默认值我这里指定为human
def call(String name = 'human') {
   // Any valid steps can be called from this code, just like in other
   // Scripted Pipeline
   echo "Hello, ${name}."
}

那么我们执行:

sayHello ‘abc’ => 输出 “Hello, abc”
Sayhello => 输出 “Hello human”

实际使用,使用src还是var,其实都可以,看大家习惯,但var会作为全局变量,这个注意一下不要重名或冲突即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/98200.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

XXL-Job分布式任务调度框架-- 集群HA的配置3

一 xxl-job集群概述 1.1 xxl-job集群HA的作用 为了避免单点故障,任务调度系统通常需要通过集群实现系统高可用 由于任务调度系统的特殊性,“调度”和“任务”两个模块需要均支持集群部署,由于职责不同,因此各自集群侧重点也有…

AcWing第82场周赛

目录 1.第k个数 2. 多米诺骨牌 3.构造序列 1.第k个数 题目描述 给定一个长度为n的整数序列,a1,a2,...,an,以及一个整数k,请你计算该数列从大到小排序后的第k个数。 输入格式 第一行包含两个整数n,k 第二行n个整数 输出格式 输出一个数&…

Sqoop安装教程

Sqoop安装教程 文章目录Sqoop安装教程一、资料二、安装(一)上传文件(二)解压文件,并重命名(三)修改配置文件1、进入到/opt/module/sqoop/conf中2、修改配置文件(1)将sqoop环境的模板文件&#x…

【M2 VMware Ubuntu】全流程安装指南

这里写自定义目录标题VMware Fusion安装M2 VMware Ubuntu 安装安装桌面环境安装 Open VM 工具禁用 Wayland更新 5.14 内核(非必要不要更新)VMware Fusion安装 这里就不再阐述如何安装啦!当然这也不是本文关注重点! M2 VMware Ub…

VB写dll以及调用的具体实例

目录 一.dll的简介 二.VB6中的dll 1.常见的调用的方法: 2.通过vb6写dll: 3.dll的调用 三.出现的一些问题: 一.dll的简介 1.dll被称为动态链接库,是一个可由多个程序或其他dll调用用的代码和的库,使用dll可以让程序可以更加模块化,避免重…

自适应布局和响应式布局

写在前面 我们在开发的时候,经常会听到关于各种布局的概念,而且里面有些概念经常会混淆,这篇文章主要就是介绍一下静态布局、流式布局、自适应布局、响应式布局和弹性布局的特点和应用场景 布局的历史发展 随着互联网和相关设备的发展&#…

C#语言实例源码系列-鼠标设置

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 👉关于作者 众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中…

DDL(保姆级教学)

目录 DDL: 1、数据库的创建: 2、由于重复创建同名数据库会报错 3、注意如果默认字符集为Latin1,其不支持中文,所以改为: 数据库的创建: 数据表的创建 属性的数据类型 1、数值类型: 2、字符串类型&a…

离散数学-用以图转化为矩阵并且求出这个矩阵的最大度最小度

题目: 从键盘输入无向图的邻接矩阵,判断输出该图结点最大度数、最小度数。 问题的分析: 对于一个图的输入,你一定会去使用二维数组来进行数据的存储,那么第一步就是建立一个二维数组,然后来进行输入,我下…

广域网技术——SRv6隧道类型及数据转发

目录 SRv6节点 节点角色 节点行为 SRv6数据转发隧道建立方式 SRv6 BE L3VPNv4 over SRv6 BE EVPN L3VPNv6 over SRv6 BE SRv6 TE Policy SRv6使用IPv6数据平面,基于IPv6扩展头进行扩展实现类似标签转发的处理 SR-MPLS在建立SR-MPLS隧道时,如果有…

Windows版本的Redis(新版本的GitHub地址)

Redis通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型 Redis官网地址:Redis 关于Windows版本 Redis目前提供源码、Docker镜像、云版三种下载形…

利用@Retryable注解实现重试机制

Retryable 它可以作用在方法上&#xff0c;当方法抛出指定的异常时&#xff0c;整个方法将会被重新执行。在使用时需要先在pom.xml中导入相关依赖&#xff0c;再在启动类中添加EnableRetry注释以开启重试功能&#xff0c;最后在相应的方法上添加Retryable注释。 引入依赖 <…

【边缘检测】蚁群算法图像边缘检测【含Matlab源码 1189期】

⛄一、获取代码方式 获取代码方式1&#xff1a; 完整代码已上传我的资源&#xff1a;【边缘检测】基于matlab蚁群算法图像边缘检测【含Matlab源码 1189期】 获取代码方式2&#xff1a; 通过订阅紫极神光博客付费专栏&#xff0c;凭支付凭证&#xff0c;私信博主&#xff0c;可…

12.17 - 每日一题 - 408

每日一句&#xff1a; 我们生活在行动中&#xff0c;而不是生活在岁月里;我们生活在思想中&#xff0c;而不是生活在呼吸里。 数据结构 1 在有向图G的拓扑序列中&#xff0c;若顶点Vi在顶点Vj之前&#xff0c;则下列情形不可能出现的是______ A.G中有弧<Vi,Vj>B.G中有…

sqli-labs 通关笔记详解 Less1 - Less10

文章目录GET显错注入流程前置知识注入步骤GET盲注基本流程前置知识注入步骤Less - 1Less - 2Less - 3Less - 4Less - 5Less - 6Less - 7Less - 8Less - 10做sqli-labs靶场之前建议补一下基础 SQL注入简介和注入方法教学 Web安全基础-SQL MySQL SQLMAP工具 详细使用方法 GET显…

动态规划问题——换钱的最少货币数

题目&#xff1a; 给定数组arr&#xff0c;arr中所有的值都为正数且不重复。每个值代表一种面值的货币&#xff0c;每种面值的货币可以使用任意张&#xff0c;在给定一个整数aim&#xff0c;代表要找的钱数&#xff0c;求组成aim的最少货币数。 示例&#xff1a; arr [5,2,…

自动生成MySQL DDL建表语句

简介项目中大部分情况下都是使用MySQL数据&#xff0c;而且主要使用的数据库类型是char、varchar、date、datetime、timestamp、int、tinyint等几种常见的数据类型&#xff1b;而且进行表设计时&#xff0c;一般都要出一份表设计文档&#xff0c;例如表设计模板如下因为有了如此…

[附源码]Nodejs计算机毕业设计基于移动端的药方收集系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

【Spring】一文带你吃透IOC容器技术

目录 一、前言 二、IOC容器技术 1、ioc概念 2、DI依赖注入 2.1、构造注入依赖 2.2、setter注入依赖 3、ioc底层实现 4、基于xml配置声明Bean以及使用 4.1、根节点标签beans 4.2、声明Bean 4.3、Bean的使用 5、面向接口编程 5.1、新增接口IOrderService 5.2、Order…

非零基础自学Golang 第11章 文件操作 11.2 文件基本操作 11.2.2 文件读取

非零基础自学Golang 文章目录非零基础自学Golang第11章 文件操作11.2 文件基本操作11.2.2 文件读取第11章 文件操作 11.2 文件基本操作 11.2.2 文件读取 想要读取文件可以使用os库中的Read接口&#xff1a; func (f &#xff0a;File) Read(b []byte) (n int, err error)Re…