Jenkins共享库应用
前言
Jenkins在实际的项目使用中,遇到多个 pipeline流水线有比较多重复代码的情况下,每次新增pipeline job时候都需要重新粘贴这些代码,流水线维护变得非常麻烦,可以通过jenkins的共享库来将这些重复的代码整合封装,然后在多个pipeline中进行调用,让流水线代码易于维护和版本化。
安装jenkins
- 首先需要准备一个jenkins,这里使用compose方式运行;
$mkdir jenkins &&cdjenkins/$sudo mkdir -p data$sudo chown 1000.1000 -R data$vim docker-compose.yml
version:3.9services:jenkins-master:image:docker.io/jenkins/jenkins:2.377-jdk17container_name:jenkinshostname:jenkinsrestart:alwaysprivileged:truenetwork_mode:hostvolumes:-/etc/localtime:/etc/localtime:ro-./data:/var/jenkins_homeenvironment:-JAVA_OPTS=-Djava.util.logging.config.file=/var/jenkins_home/log.properties-TZ=Asia/Shanghai
- 启动成功后,安装如下插件;
Pipeline: Groovy Libraries共享库插件ListGit Branches ParameterGit扩展插件
创建共享库
- 准备一个共享库,推送到Git上,目录结构如下;
.
├── resources存放构建流程需要用到的文件│ └── build
│ └── mvn
│ ├── Dockerfile
│ └── settings.xml
├── src封装一些常用构建方法│ └── org
│ └── devops
│ ├── GlobalVars.groovy
│ └── tools.groovy
└── vars存放具体执行的pipeline脚本└── pipeline01
- 定义常用的构建方法;
$ vim tools.groovy
// 导入当前包
package org.devops
// 拉取项目方法
def gitCheckout(URL, credentialsId) {
steps.checkout(
[$class:GitSCM,
branches: [[name:\$BRANCH]],
extensions: [],
userRemoteConfigs: [[credentialsId:"${credentialsId}",
url:"${URL}"]]
]
)
}
// 获取git提交
defgitMsg() {
shgit show --stat --format=提交日期:%ci,%n提交人:%cn,%n提交备注:%s,%n提交Hash:%H,%n提交分支:%d,%n%b%n提交修改的文件:}
// 清理workspace
defcleanWS() {
cleanWs deleteDirs:true, notFailBuild:true}
// 创建文件
def creatFile(filename, content) {
steps.writeFile encoding:UTF-8, file:"$filename", text:"$content"}
// 获取提交id
defcommitId() {
String commit = steps.sh(returnStdout:true, script:git rev-parse --short HEAD).trim()returncommit
}
// 构建项目
def build(action, commitid, repourl, tag){
sh"""
build
DOCKER_BUILDKIT=1 docker build --progress=auto \
--target=${action}\
--build-arg version=${commitid}\
-t${repourl}:${tag}.
push
docker push${repourl}:${tag}&& docker rmi${repourl}:${tag}"""}
// 推送镜像
def loginRepo(username, password, repourl){
sh"""
docker login -u$username-p$password$repourl"""}
$ vim tools.groovy
package org.devops// 全局变量参数定义classGlobalVars{// 项目仓库地址staticStringgiturl =https://example.com/example/test.gitstaticStringcertid =e6655bac-85cc-4a61-9ae3-3eeb02ff2e4c// 镜像仓库staticStringimageRepo =harbor.example.cn/publicstaticStringpushRepo =harbor.example.cn/public/teststaticStringuserRepo =rootstaticStringpassRepo =root1234}
- 定义pipeline;
$ vim pipeline01// 说明:jenkinslibrary是后面在jenkins中定义的共享库名称// 引用共享库,注意后面的"_"不要漏掉@Library(jenkinslibrary@master) _// 导入构建库def GlobalVars =neworg.devops.GlobalVars()
def tools =neworg.devops.tools()// 引用文件def buildfile = libraryResource"build/mvn/Dockerfile"def mvnconf = libraryResource"build/mvn/settings.xml"// 流水线pipeline {
agent any// 运行参数定义options {buildDiscarderlogRotator(artifactDaysToKeepStr:, artifactNumToKeepStr:, daysToKeepStr:5, numToKeepStr:5)// 保留历史构建数和记录disableConcurrentBuilds()// 设置job不能够同时运行disableResume()// 如果控制器重启,不允许管道恢复skipDefaultCheckout()// 跳过默认的代码检出timestamps()// 为控制台输出增加时间戳}// 步骤定义stages{
stage("拉取代码") {
steps {// 在script中执行script {
tools.gitCheckout(GlobalVars.giturl, GlobalVars.certid)
tools.gitMsg()
}
}
}
stage("构建镜像"){
steps {
script {// 获取提交iddef commitID = tools.commitId()// 获取构建iddef imagetag = currentBuild.id// 创建文件tools.creatFile("settings.xml", mvnconf)
tools.creatFile("Dockerfile", buildfile)// 执行构建tools.loginRepo(GlobalVars.userRepo, GlobalVars.passRepo, GlobalVars.imageRepo)
tools.build("release", commitID, GlobalVars.pushRepo, imagetag)
}
}
}
}
post {
always {
script {// 清理构建文件tools.cleanWS()
}
}
}
}
- 定义构建文件
$vim DockerfileFROMdocker.io/library/maven:3.8-openjdk-8-slim AS buildENVTZ=Asia/ShanghaiRUNln -snf /usr/share/zoneinfo/$TZ /etc/localtime && \
echo $TZ > /etc/timezoneWORKDIR/buildCOPYsettings.xml /root/.m2/COPY. /buildRUNmvn -Dmaven.test.skip=true packageFROMdocker.io/library/eclipse-temurin:8u332-b09-jre-focal AS releaseENVTZ=Asia/ShanghaiARGversionEXPOSE8080WORKDIR/appCOPY--from=build /build/target/test-0.0.1-SNAPSHOT.jar app.jarENTRYPOINTjava -server \
${JAVA_OPTS} \
-jar /app/app.jar \
--user.timezone=GMT+08 \
--java.security.egd=file:/dev/./urandom ${JAVA_CLI}
$ vim settings.xml<settingsxmlns="http://maven.apache.org/SETTINGS/1.2.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd"><mirrors><mirror><id>aliyunid><mirrorOf>*mirrorOf><name>aliyun-publicname><url>https://maven.aliyun.com/repository/publicurl>mirror><mirror><id>aliyun-centerid><mirrorOf>centralmirrorOf><name>aliyun-centralname><url>https://maven.aliyun.com/repository/centralurl>mirror><mirror><id>aliyun-springid><mirrorOf>springmirrorOf><name>aliyun-springname><url>https://maven.aliyun.com/repository/springurl>mirror>mirrors>settings>
添加共享库
- 在jenkins中添加共享库,找到 "系统设置" -> " Global Pipeline Libraries" ;
配置流水线
- 创建一个pipeline job,配置Git分支拉取;
- 配置构建流水线地址;
- 构建测试job;
end ~
安装完成后,通过命令启动并验证Jenkins的状态
systemctl start jenkinssystemctl status jenkins
上面的输出显示Jenkins已启动并正在运行。
配置防火墙(可选)
阿里云、腾讯云的云主机就不需要配置了,不过需要在安全策略里打开可访问的端口。
玩转jenkins-在自己的服务器上安装jenkins

持续集成整合使用篇之Jenkins设置
关注腾飞开源,一起共同成长!