765DevOps

Thinking is the problem, Doing is the answer !

0%

Jenkins共享库使用-初阶

在我们实际写Jenkin pipelines脚本中,可能会出现``java.lang.RuntimeException: Method code too large!,这个时候你就要抽象出一些公共的函数类库,避免项目方重复冗余的脚本代码书写`,在此处我也把我经常使用的一些共享函数库(jenkins-share-library)分享出来,欢迎交流指正哈!

1. 如何使用Jenkins共享库

  • 在Jenkinsfile的脚本文件第一行引入以下代码
1
2
3
4
library 'jenkins-shared-libraries'

pipeline { ... }

  • 调用示例
1
2
3
4
5
6
7
8
stage ("demo") {
steps {
script {
// 调用:共享方法名+入参
demoFunction(params1, params2, ...)
}
}
}

2. 支持的共享库方法

2.1 Git仓库拉取 - gitCodeFetch()

支持基于分支/标签 和 Submodule子仓库拉取以及基于MR拉取分支,源码参考

  • 入参说明
1
2
3
4
5
6
7
8
9
10
11
12
/**
* Git仓库版本拉取 -- 支持基于分支/标签 和 Submodule子仓库拉取以及基于MR拉取分支
*
* @param fetchMode Git代码拉取方式:branch-基于分支; tag-基于标签
* @param gitBranchOrTag Git仓库分支 或 标签
* @param gitRepository Git仓库地址
* @param gitCredentialsId Git拉取凭证ID 【若存在Submodule子仓库,则该凭证需要有子仓库拉取权限】
* @param gitEvent git拉取事件,基于分支或Tag拉取,则置空; MergeRequest则为:"MR"
* @param targetBranch 若gitEvent为"MR",此处为MR目标分支
* @return
*/
void call(String fetchMode,String gitBranchOrTag, String gitRepository, String gitCredentialsId, String gitEvent = '', String targetBranch = '')

2.2 MD5值校验 - md5Check()

文件MD5值check,源码参考

  • 入参说明
1
2
3
4
5
6
7
8
9
10
11
/**
* 文件MD5值check
*
* @param filePath 文件路径
* @param md5 文件md5值
* @param forceCheck 是强制检查,是-必检,否-md5值非空则进行检查
*/
void md5Check(String filePath, String md5, boolean forceCheck = true)

注:forceCheck=true时,校验不通过则报错,流水线终止

2.3 SHA1值校验 - sha1Check()

文件SHA1值check,源码参考

  • 入参说明
1
2
3
4
5
6
7
8
9
10
11
/**
* 文件SHA1值check
*
* @param filePath 文件路径
* @param sha1 文件md5值
* @param forceCheck 是强制检查,是-必检,否-md5值非空则进行检查
*/
void sha1Check(String filePath, String sha1, boolean forceCheck = true)

注:forceCheck=true时,校验不通过则报错,流水线终止

2.4 FTP上传 - ftpUpload()

FTP文件上传 – // 参数参考说明:https://jenkins.io/doc/pipeline/steps/publish-over-ftp

源码参考

  • 入参说明
1
2
3
4
5
6
7
8
9
10
/**
* FTP文件上传 -- // 参数参考说明:https://jenkins.io/doc/pipeline/steps/publish-over-ftp
* @param configName 在Jenkins全局设置的FTP Server名称
* @param sourceFiles 上传源文件,支持正则匹配,如[递归目录层级使用'**']:'**/*.apk,public/**/*'
* @param remoteDir 上传子目录路径,注此路径会追加到全局设置的FTP Server的Remote Directory之后
* @param excludes 排除上传文件,支持正则匹配,如[递归目录层级使用'**']: '**/*.log,**/*.tmp,.git/'
* @param removePrefix 去除上传文件的路径前缀,避免ftp服务器中生成无用的目录路径,注:所有上传文件必须都有该前缀,否则报错
*/
void ftpUpload(String configName, String sourceFiles, String remoteDir = '', String excludes = '', String removePrefix = '')

2.5 Rsync Module远程同步 - rsyncModule()

rsync 使用Module远程同步,源码参考

  • 入参说明
1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* rsync 使用Module远程同步
*
* @param ip rsync服务器IP
* @param port rsync服务器监听端口
* @param path rsync本地同步绝对路径
* @param module rsync同步模块
* @param user rsync同步用户,指定传输文件为指定用户
* @param customParams 定制rsync参数,不允许出现"delete"关键字,如:--exclude=PATTERN --include=PATTERN --exclude-from=FILE --include-from=FILE
* @param bwlimit
*/
void rsyncModule(String ip, int port, String path, String module, String user = '', String customParams = '', int bwlimit = 8192)

2.6 制品上传Nexus - uploadArtifactsToNexus()

如果你是以Nexus作为制品库的话,这个可以作为参考,源码参考

  • 入参说明
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
* 上传制品至Nexus仓库
*
* @param nexusRepository Nexus上传仓库
* @param dir 检索目录
* @param fileMatchRegex 文件正则匹配规则, 支持文件类型、文件前缀、文件全名,
* 如文件:prefix_file.test,
* 匹配规则:
* 文件类型: fileMatchRegex = ".test"
* 文件前缀: fileMatchRegex = "prefix_"
* 文件全名: fileMatchRegex = "prefix_file.test"
* @param uploadSubPath 制品上传路经
* @param isRecursion 是否递归检索子目录,默认:否【注:同名文件会被覆盖】
* @param artifacts 制品存储数据,Map结构,默认:空Map
* @return Map 返回上传制品数据
* eg: [
* 'file1':[
* 'url':'https://nexus.demo.com/.../file1' // 文件在nexus中的上传路径【即下载路径】
* 'md5':'xxxx' // 文件md5值
* 'sha1':'xxxx' // 文件sha1值
* ],
* ]
*/
def uploadArtifactsToNexus(String nexusRepository, String dir, String fileMatchRegex, String uploadPath, boolean isRecursion = false, Map artifacts = [:])

  • Android制品上传Nexus - uploadAndroidArtifacts()

针对Android制品上传,做了一层外围封装,防止不同业务上传仓库紊乱源码参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
* 上传制品至Nexus仓库
*
* @param dir 检索目录
* @param fileMatchRegex 文件正则匹配规则, 支持文件类型、文件前缀、文件全名,
* 如文件:prefix_file.test,
* 匹配规则:
* 文件类型: fileMatchRegex = ".test"
* 文件前缀: fileMatchRegex = "prefix_"
* 文件全名: fileMatchRegex = "prefix_file.test"
* @param uploadSubPath 制品上传路经
* @param isRecursion 是否递归检索子目录,默认:否【注:同名文件会被覆盖】
* @param artifacts 制品存储数据,Map结构,默认:空Map
* @return Map 返回上传制品数据
* eg: [
* 'file1':[
* 'url':'https://nexus.demo.com/.../file1' // 文件在nexus中的上传路径【即下载路径】
* 'md5':'xxxx' // 文件md5值
* 'sha1':'xxxx' // 文件sha1值
* ],
* ]
*/
def uploadAndroidArtifacts(String dir, String fileMatchRegex, String uploadPath, boolean isRecursion = false, Map artifacts = [:])

2.7 流水线结果回调 - callBackAction()

Jenkins pipeline结果回调通知(这个其实有个Plugin支持,Job Notification,但是我觉得不够灵活),这边我自定义了一个通用回调,可以防止在任何位置,源码参考

  • 入参说明
1
2
3
4
5
6
7
8
9
/**
* 流水线执行结果回调操作
*
* @param callBackUrlsJson 回调Url地址Json数据
* @param artifacts 制品存储数据
* @return
*/
void callBackAction(String callBackUrlsJson, Map artifacts = [:])

  • 使用示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
pipeline {
agent any

stages {...}

post {
always {
// 回调Api通知对接JOB执行结果
script {
if (!binding.variables.containsKey("ARTIFACTS")) {
ARTIFACTS = [:]
}
callBackAction(params.CALLBACK_URLS_JSON, ARTIFACTS)
}

echo "I will be executed while failed or succeed"
}
}
}

5 引用

官方参考,Extending with Shared Libraries