在我们实际写Jenkin pipelines脚本中,可能会出现``java.lang.RuntimeException: Method code too large!,这个时候你就要抽象出一些公共的函数类库,避免项目方重复冗余的脚本代码书写`,在此处我也把我经常使用的一些共享函数库(jenkins-share-library)分享出来,欢迎交流指正哈!
 1. 如何使用Jenkins共享库
- 在Jenkinsfile的脚本文件第一行引入以下代码
| 12
 3
 4
 
 | library 'jenkins-shared-libraries'
 pipeline { ... }
 
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 
 | stage ("demo") {steps {
 script {
 // 调用:共享方法名+入参
 demoFunction(params1, params2, ...)
 }
 }
 }
 
 | 
 2. 支持的共享库方法
 2.1 Git仓库拉取 - gitCodeFetch()
支持基于分支/标签 和 Submodule子仓库拉取以及基于MR拉取分支,源码参考
| 12
 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,源码参考
| 12
 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,源码参考
| 12
 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
源码参考
| 12
 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远程同步,源码参考
| 12
 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作为制品库的话,这个可以作为参考,源码参考
| 12
 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制品上传,做了一层外围封装,防止不同业务上传仓库紊乱,源码参考
| 12
 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,但是我觉得不够灵活),这边我自定义了一个通用回调,可以防止在任何位置,源码参考
| 12
 3
 4
 5
 6
 7
 8
 9
 
 | /*** 流水线执行结果回调操作
 *
 * @param callBackUrlsJson 回调Url地址Json数据
 * @param artifacts 制品存储数据
 * @return
 */
 void callBackAction(String callBackUrlsJson, Map artifacts = [:])
 
 
 | 
| 12
 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