在我们实际写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