一、背景引入

在咱们开发团队里,每次构建和部署项目的时候,大家写的 Pipeline 代码那叫一个五花八门。不同的人有不同的写法,这就导致代码很难统一管理,而且维护起来特别麻烦。就好比你去一个城市,有的路修得规规矩矩,有的路却弯弯曲曲,找个地方都费劲。这时候,Jenkins 共享库就像一个交通规划师,能帮咱们把这些 Pipeline 代码变得整齐有序。

二、Jenkins 共享库是什么

Jenkins 共享库其实就是一个可以被多个 Jenkins Pipeline 项目共享的代码库。它把一些常用的功能封装起来,就像一个工具箱,里面装着各种工具,咱们需要的时候直接拿出来用就行。比如说,你要在多个项目里都进行代码检查、测试、部署这些操作,就可以把这些操作的代码放到共享库里,然后在每个项目的 Pipeline 里引用这个共享库,这样就不用每个项目都写一遍相同的代码啦。

三、搭建 Jenkins 共享库

1. 创建 Git 仓库

首先,咱们得有个地方来存放这个共享库的代码,就像你得有个柜子来放工具一样。这里我们选择用 Git 仓库,因为它方便版本管理。你可以在 GitLab 或者 GitHub 上创建一个新的仓库,比如叫 jenkins-shared-library

2. 目录结构

在这个仓库里,我们要按照一定的目录结构来组织代码。一般来说,有这么几个重要的目录:

  • vars 目录:用来存放全局变量和函数,就像工具箱里的各种工具。
  • src 目录:用来存放 Groovy 类,这是共享库的核心代码。
  • resources 目录:用来存放一些配置文件或者模板。

下面是一个简单的目录结构示例:

jenkins-shared-library/
├── src
│   └── com
│       └── example
│           └── MyClass.groovy
├── vars
│   ├── myFunction.groovy
└── resources
    └── config.properties

3. 编写共享库代码

vars 目录下,我们可以编写一些全局函数。比如我们写一个简单的函数来打印日志:

// 技术栈:Groovy
// 这个函数用于打印一条日志信息
def call(String message) {
    println "Log: ${message}"
}

把上面的代码保存为 log.groovy 文件,放到 vars 目录下。这个函数的名字就是文件名去掉 .groovy 后缀,这里就是 log,以后在 Pipeline 里就可以直接调用 log('这是一条日志信息')

四、在 Jenkins Pipeline 里使用共享库

1. 配置 Jenkins

在 Jenkins 的系统配置里,找到 “Global Pipeline Libraries” 这一项,添加我们刚才创建的共享库。填写仓库的 Git 地址、凭证等信息,然后给这个共享库取个名字,比如叫 my-shared-library

2. 编写 Pipeline 脚本

现在我们可以在 Pipeline 脚本里使用共享库啦。下面是一个简单的 Pipeline 示例:

// 技术栈:Groovy
@Library('my-shared-library') _

pipeline {
    agent any
    stages {
        stage('Print Log') {
            steps {
                // 调用共享库里的 log 函数
                log('开始执行 Pipeline')
            }
        }
    }
}

这个 Pipeline 脚本里,@Library('my-shared-library') _ 这一行表示引入我们配置好的共享库。然后在 steps 里调用了共享库里的 log 函数,就这么简单。

五、应用场景

1. 代码检查

在很多项目里,都需要对代码进行静态检查,比如检查代码的格式、语法错误等。我们可以把代码检查的操作封装到共享库里,然后在每个项目的 Pipeline 里调用。这样就不用每个项目都写一遍代码检查的脚本了。

// 技术栈:Groovy
// 这个函数用于进行代码检查
def call() {
    sh 'eslint src' // 假设使用 ESLint 进行代码检查
    log('代码检查完成')
}

把上面的代码保存为 codeCheck.groovy 放到 vars 目录下,然后在 Pipeline 里调用:

// 技术栈:Groovy
@Library('my-shared-library') _

pipeline {
    agent any
    stages {
        stage('Code Check') {
            steps {
                codeCheck()
            }
        }
    }
}

2. 测试

同样的,测试也是很多项目都要做的事情。我们可以把单元测试、集成测试等操作封装到共享库里。

// 技术栈:Groovy
// 这个函数用于执行单元测试
def call() {
    sh 'npm test' // 假设使用 npm 运行单元测试
    log('单元测试完成')
}

保存为 unitTest.groovy 放到 vars 目录下,在 Pipeline 里调用:

// 技术栈:Groovy
@Library('my-shared-library') _

pipeline {
    agent any
    stages {
        stage('Unit Test') {
            steps {
                unitTest()
            }
        }
    }
}

3. 部署

部署操作也可以封装到共享库里。比如把代码部署到测试环境或者生产环境。

// 技术栈:Groovy
// 这个函数用于部署代码到测试环境
def call() {
    sh 'kubectl apply -f deployment.yaml' // 假设使用 Kubernetes 进行部署
    log('代码部署到测试环境完成')
}

保存为 deployToTest.groovy 放到 vars 目录下,在 Pipeline 里调用:

// 技术栈:Groovy
@Library('my-shared-library') _

pipeline {
    agent any
    stages {
        stage('Deploy to Test') {
            steps {
                deployToTest()
            }
        }
    }
}

六、技术优缺点

优点

  • 提高代码复用性:就像前面说的,把常用的功能封装到共享库里,多个项目可以直接引用,避免了重复编写代码。
  • 统一开发流程:所有项目都使用共享库里的代码,这样大家的开发流程就统一了,管理和维护起来更方便。
  • 便于维护:如果某个功能需要修改,只需要在共享库里修改一次,所有引用这个共享库的项目都会生效。

缺点

  • 学习成本:对于新手来说,理解和使用共享库可能需要一些时间,尤其是 Groovy 语言的使用。
  • 依赖管理复杂:如果共享库依赖了其他的工具或者库,管理这些依赖可能会比较麻烦。

七、注意事项

1. 版本管理

共享库的代码也需要进行版本管理,就像其他代码一样。每次修改共享库的代码后,都要打一个新的版本号,这样在 Pipeline 里可以指定使用哪个版本的共享库。

2. 错误处理

在共享库的代码里,要做好错误处理。比如在执行代码检查、测试、部署等操作时,如果出现错误,要能正确地捕获并处理,避免影响整个 Pipeline 的执行。

// 技术栈:Groovy
// 这个函数用于进行代码检查,并处理可能出现的错误
def call() {
    try {
        sh 'eslint src'
        log('代码检查完成')
    } catch (Exception e) {
        log("代码检查失败: ${e.message}")
        currentBuild.result = 'FAILURE'
    }
}

3. 安全性

共享库的代码可能会涉及到一些敏感信息,比如数据库密码、API 密钥等。要注意保护这些信息,避免泄露。可以使用 Jenkins 的凭证管理功能来安全地存储和使用这些信息。

八、文章总结

通过使用 Jenkins 共享库,我们可以把团队里的 Pipeline 开发流程标准化,提高代码复用性,统一开发流程,便于管理和维护。虽然它有一些缺点,比如学习成本和依赖管理复杂,但只要我们注意版本管理、错误处理和安全性等问题,就能很好地发挥它的优势。希望大家在实际开发中能尝试使用 Jenkins 共享库,让我们的开发工作变得更高效。