Jenkins shared library 共享库示例

来自linux中国网wiki
Evan讨论 | 贡献2024年9月30日 (一) 15:18的版本 →‎see also
跳到导航 跳到搜索

进阶

Jenkins进行持续集成#进阶

intra_pipe的 有空要提取一下

自己在用的例子有空再放出来

Pre-requisites

Jenkins设置SSH免登录访问远程服务器

Jenkins 配置SSH免密钥

共享库是什么?

pre :

node为根节点的是脚本式语法 ,pipeline为根节点的为声明式语法,这个是推荐的

共享库(shared library)是一些独立的 Groovy 脚本的集合,我们可以在运行 Pipeline 的时候去获取这些共享库代码。使用共享库最好的方式同样是把代码使用 Git 仓库进行托管,这样我们就可以进行版本化管理了。当然我们也需要一些 Groovy 语言的基础,不过并不需要多深入,基本的语法概念掌握即可,可以查看前面我们的 Groovy 简明教程 。

使用共享库一般只需要3个步骤即可:

   首先创建 Groovy 脚本,添加到 Git 仓库中
   然后在 Jenkins 中配置将共享库添加到 Jenkins 中来
   最后,在我们的流水线中导入需要使用的共享库:@Library('your-shared-library'),这样就可以使用共享库中的代码了。


目录结构

共享库的目录结构如下:

(root)
+- src                     # Groovy source files
|   +- org
|       +- foo
|           +- Bar.groovy  # for org.foo.Bar class
+- vars
|   +- foo.groovy          # for global 'foo' variable
|   +- foo.txt             # help for 'foo' variable
+- resources               # resource files (external libraries only)
|   +- org
|       +- foo
|           +- bar.json    # static helper data for org.foo.Bar

 

    src 目录应该看起来像标准的 Java 源目录结构。当执行流水线时,该目录被添加到类路径下。
    vars 目录定义可从流水线访问的全局变量的脚本。 每个 *.groovy 文件的基名应该是一个 Groovy (~ Java) 标识符, 通常是 camelCased。 匹配 *.txt, 如果存在, 可以包含文档, 通过系统的配置标记格式化从处理 (所以可能是 HTML, Markdown 等,虽然 txt 扩展是必需的)。
    resources 目录允许从外部库中使用 libraryResource 步骤来加载有关的非 Groovy 文件。 目前,内部库不支持该特性。

注意:初次使用src、resources目录可以为空,我们可以在vars中定义脚本,使用call方法实现功能

Jenkins Pipeline 流水线语法

Jenkins Pipeline 流水线语法

Groovy

e.g. for example 注意 代码学习从这开始 上面看一下就行

新建一个名为 pipeline-library-demo 的文件夹,将该项目加入到 Git 仓库中。首先创建一个名为 vars 的目录,自定义一个 step 就是在 vars 目录下面的一个 .groovy 文件,这些被称为全局变量,比如我们添加一个 sayHi.groovy 的文件,代码如下所示:

#!/usr/bin/env groovy

def call(String name='evan') {
  echo "Hello, ${name}."
}

需要注意的是需要实现 call 方法,添加了一个名为 name 的参数,具有默认值 evan,可以用 ${name} 来进行访问。

然后创建一个名为 src/com/evan/GlobalVars.groovy 的文件,文件内容如下所示:

#!/usr/bin/env groovy
package com.evan

class GlobalVars {
  static String foo = "bar"

  // 在 Pipeline 中可以引用这里的静态变量:
  // 
  // import com.evan.GlobalVars
  // println GlobalVars.foo
}


evan@myxps:~/data/devops/jenkins/pipeline-library-demo$ tree .
.
├── src
│   └── com
│       └── evan
│           └── GlobalVars.groovy
└── vars
    └── sayHi.groovy

4 directories, 2 files

完整的代码上传到了 GitHub 仓库 or 自己的gitlab http://mygitlab.com/root/pipeline-library-demo 中。

共享库创建完成后,我们需要让 Jenkins 知道这个共享库,我们可以从 Jenkins 的 Web 页面进行添加。在 Jenkins 首页 -> 系统管理 -> 系统配置,在 Global Pipeline Libraries 区域配置共享库:

Name pipeline-library-demo
Default version  main  

Allow default version to be overridden  and Include @Library changes in job recent changes 打勾 

Retrieval method->Modern SCM  -> Git   Project Repository  http://mygitlab.com/root/pipeline-library-demo.git ; Credentials 你在gitlab的用户和密码
 
保存后即可使用配置共享库。接下来新建一个名为 share-lib-demo 的流水线项目,在 Pipeline script 区域添加如下代码

My-pipeline-job01/configure ->Pipeline -> Defination Pipeline script

@Library('pipeline-library-demo')_

import com.evan.GlobalVars

stage('Demo') {
    echo 'Hello world'
    sayHi '子华'
    println GlobalVars.foo
}

需要注意的是 @Library('pipeline-library-demo')_ 最后有一个下划线 _,这个下划线并不是写错了,如果 @Libray 后面紧接的一行不是 import 语句的话,就需要这个下划线,我们这里后面就是一条 import 语句,所以这里可以省略这个下划线。

执行结果

Console Output

Started by user admin
Running in Durability level: MAX_SURVIVABILITY
Loading library pipeline-library-demo@main
Attempting to resolve main from remote references...
 > git --version # timeout=10
 > git --version # 'git version 2.30.2'
using GIT_ASKPASS to set credentials newroot
 > git ls-remote -h -- http://mygitlab.com/root/pipeline-library-demo.git # timeout=10
Found match: refs/heads/main revision 3938b86d02ebad41a19c254b8b2f1c70b4ede838
The recommended git tool is: NONE
using credential 54098e5a-68d7-495f-8b09-2e39b2188b3d
 > git rev-parse --resolve-git-dir /var/lib/jenkins/workspace/My-pipeline-job01@libs/pipeline-library-demo/.git # timeout=10
Fetching changes from the remote Git repository
 > git config remote.origin.url http://mygitlab.com/root/pipeline-library-demo.git # timeout=10
Fetching without tags
Fetching upstream changes from http://mygitlab.com/root/pipeline-library-demo.git
 > git --version # timeout=10
 > git --version # 'git version 2.30.2'
using GIT_ASKPASS to set credentials newroot
 > git fetch --no-tags --force --progress -- http://mygitlab.com/root/pipeline-library-demo.git +refs/heads/*:refs/remotes/origin/* # timeout=10
Checking out Revision 3938b86d02ebad41a19c254b8b2f1c70b4ede838 (main)
 > git config core.sparsecheckout # timeout=10
 > git checkout -f 3938b86d02ebad41a19c254b8b2f1c70b4ede838 # timeout=10
Commit message: "globalvar"
 > git rev-list --no-walk 3938b86d02ebad41a19c254b8b2f1c70b4ede838 # timeout=10
[Pipeline] Start of Pipeline
[Pipeline] stage
[Pipeline] { (Deo)
[Pipeline] echo
Hey world
[Pipeline] echo
Hello, 子华.
[Pipeline] echo
bar
[Pipeline] }
[Pipeline] // stage
[Pipeline] End of Pipeline
Finished: SUCCESS

trouble

ERROR: Library devops expected to contain at least one of src or vars directories

至少一一个 src or vars 里面还要有groovy 文件 ,不然就报错

see also

gitbook.curiouser.top Jenkins Pipeline共享库Shared Libraries

jenkins 扩展共享库

Jenkins 共享库示例

Jenkins Shared Library(解决多个项目使用同一jenkinsfile问题)

springboot 测试的源码项目

Jenkins流水线即代码之扩展共享库初体验