基本
https://www.jenkins.io/zh/doc/book/pipeline/shared-libraries/
多个Jenkins工程的流水线可能包含重复代码,因此这些重复代码可以剥离出来从而被共享使用,这种东西叫共享库.
基本结构
(root)
+- src # Groovy 共享库代码
| +- org
| +- devops
| +- tools.groovy # for org.devops.tools class,在Jenkinsfile里通过def tools = new org.devops.tools() 加载共享库代码
+- vars
| +- devops.groovy # for global 'devops' variable
| +- devops.txt # help for 'devops' variable
+- resources # resource files (external libraries only)
| +- org
| +- devops
| +- tools.json # static helper data for org.devops.Bar
基本写法
/src/org/devops/tools.groovy
package org.devops
// 格式化输出, 需要AnsiColor插件支持.
// 接收内容,并输出彩色内容
def myPrint(content, color){
colors = ['red' : "\033[40;31m #############${content}############# \033[0m",
'green' : "\033[40;32m #############${content}############# \033[0m",
'yellow' : "\033[40;33m #############${content}############# \033[0m",
'blue' : "\033[47;34m #############${content}############# \033[0m"]
ansiColor('xterm') {
println(colors[color])
}
}
// 封装chatBot请求, 需要 http request 插件
// 接收http method、http地址、http请求体,返回请求结果
def myChat(reqMode,reqUrl,reqBody){
result = httpRequest httpMode: reqMode,
accept: "APPLICATION_JSON_UTF8",
contentType: "APPLICATION_JSON_UTF8",
consoleLogResponseBody: true,
ignoreSslErrors: true,
requestBody: reqBody,
url: reqUrl
quiet: true
return result
}
//根据标签获取目标机器ip, 并写入到 .hosts 文件中
//ipType: PublicIpAddress PrivateIpAddress
def getEc2Ip(ipType, tagKey, tagValue, Region) {
sh """
export AWS_DEFAULT_REGION=${Regionssss}
aws ec2 describe-instances --filters "Name=tag:${tagKey},Values=${tagValue}" --query 'Reservations[*].Instances[*].[${ipType}]' --output text > .hosts
cat .hosts
"""
}
def getRemoteIP(serverIP) {
sh """
echo ${serverIP} > .hosts
cat .hosts
"""
}
// 获取阿里云 acr 服务的动态 token, 得到全局变量 ACRUSER 和 ACRPWD
// {"data":{"authorizationToken":"abcde123456","tempUserName":"cr_temp_user","expireDate":1612348203000}}
def getAliAcrToken(url) {
sh (
script: """curl -sq $url > acr.token;
cat acr.token | jq -r .'["data"]["tempUserName"]' > acr.user;
cat acr.token | jq -r .'["data"]["authorizationToken"]' >> acr.pwd;
"""
)
}
// 需要提前部署好私钥 /root/.remote.pem
// 对应的公钥需要放置在目标机器的 ${remoteUser} 用户中
// .hosts 存放在工作目录下
def ansible(remoteUser,shellCommand) {
sh """
ansible -i .hosts --private-key /root/.remote.pem -u ${remoteUser} all -m shell -a "${shellCommand}"
"""
}
关联pipeline libraries
jenkins 系统管理-系统配置-Global Pipeline Libraries
这里将共享库放到git上,通过scm从git拉去共享库.
调用pipeline libraries
jenkins工程的pipeline代码开头添加,即jenkinsfile文件中
pipeline {
@Library('jenkinslib') _ //导入lib库, 'jenkinslib' 名就是上一步里Global Pipeline Libraries配置的名
def tools = new org.devops.tools() //加载tools
agent {
...
}
stages {
stage("第一个阶段") {
steps {
tools.myPrint("第一个步骤","green")
}
}
}
post {
...
}
}
问题
可能会遇到jenkins web端编辑器提示无法解析,这种不用处理,只不过是编辑器不支持共享库。