Jenkins 进阶01 共享库share Library封装常用模块
Jenkins共享库实践
共享库这并不是一个全新的概念,其实在编程语言Python中,我们可以将Python代码写到一个文件中,当代码数量增加,我们可以将代码打包成模块然后再以import的方式使用此模块中的方法。
在Jenkins中使用Groovy语法,共享库中存储的每个文件都是一个groovy的类,每个文件(类)中包含一个或多个方法。每个方法包含groovy语句块。
创建共享库,共享库的目的就是将一些反复使用的模块进行封装,比如拉取代码模块,邮件通知模块,这样使得你的Jenkinsfile看起来更加简洁,减少代码量。
可以在Git等版本控制系统中创建一个项目用于存储共享库。共享流水线有助于减少冗余并保持代码整洁。
总结就是将所有的工具以共享库的方式封装起来
属性:
- 共享库名称
- 共享库版本
- 共享库地址
├── src
│ └── org
│ └── devops
│ └── tools.groovy
├── vars
│ └── GetHosts.groovy
│ └── GetCommitId.groovy
│
└── resources
│ └── org
│ └── devops
│ └── config.json
gitlab上面创建共享仓库(封装常用的函数代码块)
共享库内容分析
builds.groovy 存放构件相关的代码配置
- 这里面定义了一个
Build
函数, 接受两个参数buildTools
和buildType
, 前者定义的是一个构建工具的位置map,后者是定义的构建类型例如maven/ant/gradle/web/golang
。 - 代码主体是根据不同的构建类型执行不同的构建命令,默认打印信息。
package org.devops
// 构建函数
def Build(buildTools,buildType){
switch(buildType){
case "maven":
sh "${buildTools["maven"]}/bin/mvn clean package"
break
case "gradle":
sh "${buildTools["gradle"]}/bin/gradle build -x test"
break
case "golang":
sh "${buildTools["golang"]}/bin/go build demo.go"
break
case "web":
sh """ ${buildTools["web"]}/bin/npm install && ${buildTools["web"]}/bin/npm run build """
break
default :
println("buildType ==> [maven|gralde|golang|web]")
break
}
}
mytools.groovy用于存放一些小工具, 这里定义了 GetCode
函数用于下载代码,接受三个参数:
srcType
代码库类型(git/svn)- branchName 代码库的分支名称
- gitHttpURL 代码库的地址
- credentialsId 存放凭据ID
EmailUser
函数用于发送邮件通知, 接受两个参数:
- userEmail 邮件接收人(多个使用逗号分隔)
- status 作业状态(成功、失败)
创建mytools.groovy
以后把所有的工具都放在这里面
mytools.groovy里面内容。封装的拉取代码和邮件通知
package org.devops
def GetCode(srcType,branchName,gitHttpURL,credentialsId){
if (srcType == "git"){
println("下载代码 --> 分支: ${branchName}")
checkout([$class: 'GitSCM', branches: [[name: "${branchName}"]],
extensions: [],
userRemoteConfigs: [[credentialsId: "${credentialsId}",
url: "${gitHttpURL}"]]])
}
}
def EmailUser(userEmail,status){
emailext body: """
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4" offset="0">
<img src="http://192.168.1.200:8080/static/0eef74bf/images/headshot.png">
<table width="95%" cellpadding="0" cellspacing="0" style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
<tr>
<td><br />
<b><font color="#0B610B">构建信息</font></b>
</td>
</tr>
<tr>
<td>
<ul>
<li>项目名称:${JOB_NAME}</li>
<li>构建编号:${BUILD_ID}</li>
<li>构建状态: ${status} </li>
<li>项目地址:<a href="${BUILD_URL}">${BUILD_URL}</a></li>
<li>构建日志:<a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
</ul>
</td>
</tr>
<tr>
</table>
</body>
</html> """,
subject: "Jenkins-${JOB_NAME}项目构建信息 ",
to: userEmail
}
最近共享库目录结构如下
配置共享库到Jenkins
Jenkins系统配置 -> Global Pipeline Libraries
首先,我们为共享库设置一个名称 devopslib
(自定义,无需与github仓库一致),注意这个名称后续在Jenkinsfile中引用。 再设置一个默认的版本,这里的版本是分支的名称。我默认配置的是main
版本。(github默认版本必须是main)
进入Jenkins 设置, 定义共享库名称 devopslib
默认的版本 master
。
接下来我们配置共享库的仓库地址,我的仓库在github中,所以这里我填写的是github的方式。(如果你用的是gitlab可以使用gitlab方式或者git方式)。如果仓库是私有的方式,需要在jenkins的凭据中添加一个账号用于下载共享库。
设置共享库的Git地址 , 设置共享库的凭据。(如果没有提前创建好凭据,需要先去创建好然后再重新配置这个页面。)
保存设置,共享库就配置好了。
测试共享库
在Jenkinsfile中使用@Library('mylib') _
来加载共享库,注意后面符号_
用于加载。
类的实例化: def mytools = new org.devops.jenkinstest()
使用类中的方法: mytools.PrintMsg(msg)
Jenkinsfile内容如下所示
// 加载名称为devopslib的共享库的master版本
@Library("devopslib@master") _
//导入共享库中的方法类
def mytools = new org.devops.mytools()
def builds = new org.devops.builds()
//定义构建工具类型与路径map
def buildTools = [ "maven": "/usr/local/apache-maven-3.8.1",
"gradle": "/usr/local/gradle-6.8.3/",
"golang": "/usr/local/go",
"web" : "/usr/local/node-v14.16.1-linux-x64/"]
//定义UI上面的参数(用户去选择构建那个项目的那个分支的构建类型)
String branchName = "${env.branchName}"
String gitHttpURL = "${env.gitHttpURL}"
String buildType = "${env.buildType}"
String credentialsId = "${env.credentialsId}"
// 以下是流水线阶段
pipeline {
agent { label "build" }
options {
skipDefaultCheckout true
}
stages {
stage("GetCode"){
steps{
script{
// 调用GetCode方法进行代码下载
mytools.GetCode("git",branchName,gitHttpURL,credentialsId)
}
}
}
stage("Build"){
steps {
script {
// 调用Build方法进行代码构建
builds.Build(buildTools, buildType)
}
}
}
}
post {
always {
script{
echo "always......"
}
}
success {
script {
echo "success....."
}
}
}
}
最后构建如下
我这里用的是docker注意git的版本,docker jenkins容器里面自带的gitd的版本是1.18版本,先宿主机升级然后挂载到容器目录下使用
目录 返回
首页