2.3.1、概述

共享库这并不是一个全新的概念,其实具有编程能力的同学应该清楚一些。例如在编程语言Python中,我们可以将Python代码写到一个文件中,当代码数量增加,我们可以将代码打包成模块然后再以import的方式使用此模块中的方法。

在Jenkins中使用Groovy语法,共享库中存储的每个文件都是一个groovy的类,每个文件(类)中包含一个或多个方法。每个方法包含groovy语句块。

我把共享库代码上传到了github,大家可以参考demo共享库

2.3.2、共享库内容

这是一个demo演示的共享库,大家可以看到仓库的结构与内容。这个仓库中包含了很多类,例如:我将kubernetes中的API方法封装在了kubernetes.groovy文件中,便于后面引用。在此你只需要知道共享库的结构 ,具体该如何创建共享库后面会讲述**😀**

  1. ── docs
  2. └── README.mdREADME.md
  3. ├── src
  4. └── org
  5. └── devops
  6. └── tools.groovy
  7. └── vars

src目录主要存放我们要编写的groovy类,执行流水线时,此目录将添加到class_path中。 vars目录主要存放脚本文件,这些脚本文件在流水线中作为变量公开。 resources目录允许从外部库中使用步骤来加载相关联的非Groovy文件。

2.3.3、创建共享库

新建文件src/org/devops/tools.groovy, 在此我将这个文件定义为扩展工具类,主要放一些扩展方法。

例如:在构建日志中查看流水线详细日志会很乱,我们可以在日志中将重点步骤通过不同的颜色高亮显示,便于排错。 我们开始写这样的一个方法PrintMes(),包含两个参数,输出内容value和内容的颜色color

注意: 我们需要安装 插件AnsiColor,这样才能使用ansiColor()方法,可以在片段生成器查看更多的用法。

  1. package org.devops
  2. //格式化输出
  3. def PrintMes(value,color){
  4. colors = ['red' : "\033[40;31m >>>>>>>>>>>${value}<<<<<<<<<<< \033[0m",
  5. 'blue' : "\033[47;34m ${value} \033[0m",
  6. 'green' : ">>>>>>>>>>${value}>>>>>>>>>>",
  7. 'green1' : "\033[40;32m >>>>>>>>>>>${value}<<<<<<<<<<< \033[0m" ]
  8. ansiColor('xterm') {
  9. println(colors[color])
  10. }
  11. }

2.3、Jenkins共享库应用 - 图2

创建文件Jenkinslib/vars/hello.groovy

  1. def call(){
  2. println("hello")
  3. }

2.3、Jenkins共享库应用 - 图3

2.3.4、使用共享库

我们导航到 系统配置 -> Global Pipeline Libraries

首先,我们为共享库设置一个名称jenkinslib,注意这个名称后续在Jenkinsfile中引用。 再设置一个默认的版本,这里的版本是分支的名称。我默认配置的是master版本。

接下来我们配置共享库的仓库地址,我的仓库在github中,所以这里我填写的是github的方式。(如果你用的是gitlab可以使用gitlab方式或者git方式)。如果仓库是私有的方式,需要在jenkins的凭据中添加一个账号用于下载共享库。

2.3、Jenkins共享库应用 - 图4

好,到此共享库在Jenkins的配置就完成了,接下来测试在Jenkinsfile中引用。

在Jenkinsfile中使用@Library('jenkinslib') _来加载共享库,注意后面符号_用于加载。 类的实例化def tools = new org.devops.tools(),使用类中的方法tools.PrintMes("获取代码",'green')

这里使用def tools = new org.devops.tools() 会出现命名冲突问题,需要改成其他名称。

  1. #!groovy
  2. @Library('jenkinslib') _
  3. def mytools = new org.devops.tools()
  4. pipeline {
  5. agent { node { label "master" }}
  6. stages {
  7. //下载代码
  8. stage("GetCode"){
  9. steps{
  10. timeout(time:5, unit:"MINUTES"){
  11. script{
  12. mytools.PrintMes("获取代码",'green')
  13. }
  14. }
  15. }
  16. }
  17. }
  18. }

接下来在你的Jenkins上面运行一下吧,测试一下是否能够看到带有绿色的文字呢?

2.3.5、jenkinsfile模板

  1. #!groovy
  2. //引用Library库
  3. @Library('jenkinslib') _
  4. def mytools = new org.devops.tools()
  5. String workspace = "/opt/jenkins/workspace"
  6. //Pipline
  7. pipeline {
  8. agent {
  9. node {
  10. label "master" //指定运行节点的标签或者名称
  11. customWorkspace "${workspace}"
  12. }
  13. }
  14. //string 字符串类型的参数, 例如:
  15. parameters {
  16. string(name: 'DEPLOY_ENV', defaultValue: 'staging', description: '')
  17. }
  18. triggers {
  19. cron('H */4 * * 1-5')
  20. }
  21. options {
  22. timestamps() //日志会有时间
  23. skipDefaultCheckout() //删除隐藏checkout scm语句
  24. disableConcurrentBuilds() //禁止并行
  25. timeout(time: 1, unit: 'HOURS') //流水线超时设置1h
  26. }
  27. stages {
  28. //下载代码
  29. stage("GetCode"){//阶段名称
  30. when {
  31. environment name: 'test', value: 'abcd' //当test值=abcd时,执行下面step操作
  32. }
  33. input {
  34. message "Should we continue?"
  35. ok "Yes, we should."
  36. submitter "alice,bob"
  37. parameters {
  38. string(name: 'PERSON', defaultValue: 'Mr Jenkins', description: 'Who should I say hello to?')
  39. }
  40. }
  41. steps{//步骤
  42. timeout(time:5, unit: "MINUTES"){//步骤超时时间
  43. script{//填写运动代码
  44. println('获取代码')
  45. println("${test}")
  46. echo "Hello ${params.DEPLOY_ENV}"
  47. mvnHome = tool "m2"
  48. javaHome = tool "jdk"
  49. println(mvnHome)
  50. sh "${mvnHome}/bin/mvn --version"
  51. echo "Hello, ${PERSON}, nice to meet you."
  52. mytools.PrintMes("获取代码",'green1')//引用Library库方法
  53. }
  54. }
  55. }
  56. }
  57. //构建
  58. stage("Build"){//阶段名称
  59. steps{//步骤
  60. timeout(time:20, unit: "MINUTES"){//步骤超时时间
  61. script{//填写运动代码
  62. println('应用打包')
  63. }
  64. }
  65. }
  66. }
  67. //并行构建
  68. stage("Buildmerge"){//阶段名称
  69. failFast true // 当其中一个进程失败时,强制所有的 parallel 阶段都被终止
  70. parallel {
  71. stage("Build01"){//阶段名称
  72. steps{//步骤
  73. timeout(time:20, unit: "MINUTES"){//步骤超时时间
  74. script{//填写运动代码
  75. println('应用打包并行一')
  76. }
  77. }
  78. }
  79. }
  80. stage("Build02"){//阶段名称
  81. steps{//步骤
  82. timeout(time:20, unit: "MINUTES"){//步骤超时时间
  83. script{//填写运动代码
  84. println('应用打包并行二')
  85. }
  86. }
  87. }
  88. }
  89. }
  90. }
  91. //代码扫描
  92. stage("CodeScan"){//阶段名称
  93. steps{//步骤
  94. timeout(time:30, unit: "MINUTES"){//步骤超时时间
  95. script{//填写运动代码
  96. println('代码扫描')
  97. }
  98. }
  99. }
  100. }
  101. }
  102. post {
  103. always {
  104. script {
  105. println("always")
  106. }
  107. }
  108. success {
  109. script {
  110. currentBuild.description = "\n 构建成功"
  111. }
  112. }
  113. failure {
  114. script {
  115. currentBuild.description = "\n 构建失败"
  116. }
  117. }
  118. aborted {
  119. script {
  120. currentBuild.description = "\n 构建取消"
  121. }
  122. }
  123. }
  124. }

结果验证

2.3、Jenkins共享库应用 - 图5

2.3.6、使用github存jenkinsfile

2.3、Jenkins共享库应用 - 图6

2.3、Jenkins共享库应用 - 图7