Jenkins共享库应用入门(CI篇)
前言
Jenkins在实际的项目使用中,遇到多个 pipeline流水线有比较多重复代码的情况下,每次新增pipeline job时候都需要重新粘贴这些代码,流水线维护变得非常麻烦,可以通过jenkins的共享库来将这些重复的代码整合封装,然后在多个pipeline中进行调用,让流水线代码易于维护和版本化,本文基于jenkins共享库来实现持续集成中的CI部分。
安装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共享库插件List Git Branches ParameterGit扩展插件
创建共享库
准备一个共享库,推送到Git上,目录结构如下;
.├── resources存放构建流程需要用到的文件│ └── build│ └── mvn│ ├── Dockerfile│ └── settings.xml├── src封装一些常用构建方法│ └── org│ └── devops│ ├── GlobalVars.groovy│ └── tools.groovy└── vars存放具体执行的pipeline脚本└── pipeline01
定义常用的构建方法;
$ vim tools.groovy// 导入当前包packageorg.devops// 拉取项目方法defgitCheckout(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提交修改的文件:}// 清理workspacedefcleanWS() {cleanWsdeleteDirs:true,notFailBuild:true}// 创建文件defcreatFile(filename, content) {steps.writeFileencoding:UTF-8,file:"$filename",text:"$content"}// 获取提交iddefcommitId() {String commit = steps.sh(returnStdout:true,script:git rev-parse --short HEAD).trim()returncommit}// 构建项目defbuild(action, commitid, repourl, tag){sh"""buildDOCKER_BUILDKIT=1 docker build --progress=auto \--target=${action} \--build-arg version=${commitid} \-t ${repourl}:${tag} .pushdocker push ${repourl}:${tag} && docker rmi ${repourl}:${tag}"""}// 推送镜像defloginRepo(username, password, repourl){sh"""docker login -u $username -p $password $repourl"""}
$ vim tools.groovypackageorg.devops// 全局变量参数定义classGlobalVars{// 项目仓库地址staticString giturl =https://example.com/example/test.gitstaticString certid =e6655bac-85cc-4a61-9ae3-3eeb02ff2e4c// 镜像仓库staticString imageRepo =harbor.example.cn/publicstaticString pushRepo =harbor.example.cn/public/teststaticString userRepo =rootstaticString passRepo =root1234}
定义pipeline;
$ vim pipeline01// 说明:jenkinslibrary是后面在jenkins中定义的共享库名称// 引用共享库,注意后面的"_"不要漏掉@Library(jenkinslibrary@master) _// 导入构建库defGlobalVars =neworg.devops.GlobalVars()deftools =neworg.devops.tools()// 引用文件defbuildfile = libraryResource"build/mvn/Dockerfile"defmvnconf = libraryResource"build/mvn/settings.xml"// 流水线pipeline {agent any// 运行参数定义options {buildDiscarder logRotator(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 {// 获取提交iddefcommitID = tools.commitId()// 获取构建iddefimagetag = 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 DockerfileFROM docker.io/library/maven:3.8-openjdk-8-slim AS buildENV TZ=Asia/ShanghaiRUN ln -snf /usr/share/zoneinfo/$TZ/etc/localtime && \echo$TZ> /etc/timezoneWORKDIR /buildCOPY settings.xml /root/.m2/COPY . /buildRUN mvn -Dmaven.test.skip=truepackageFROM docker.io/library/eclipse-temurin:8u332-b09-jre-focal AS releaseENV TZ=Asia/ShanghaiARG versionEXPOSE 8080WORKDIR /appCOPY --from=build /build/target/test-0.0.1-SNAPSHOT.jar app.jarENTRYPOINT java -server \${JAVA_OPTS}\-jar /app/app.jar \--user.timezone=GMT+08 \--java.security.egd=file:/dev/./urandom${JAVA_CLI}
$ vim settings.xml"1.0"encoding="UTF-8"?>"http://maven.apache.org/SETTINGS/1.2.0"xmlns:xsi="http://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">aliyun * aliyun-public https://maven.aliyun.com/repository/public aliyun-center central aliyun-central https://maven.aliyun.com/repository/central aliyun-spring spring aliyun-spring https://maven.aliyun.com/repository/spring
添加共享库
在jenkins中添加共享库,找到 "系统设置" -> " Global Pipeline Libraries" ;
配置流水线
创建一个pipeline job,配置Git分支拉取;
配置构建流水线地址;
构建测试job;
(版权归原作者所有,侵删)
将war包部署到tomcat
找到tomcat的目录,进入webapps目录把下载的war包放进去,然后进入bin目录,双击startup.bat启动tomcat服务器。
当看到下图的信息说明Jenkins启动成功。
首次进入网页配置
我们在浏览器输入http://localhost:8080/jenkins/
进入Jenkins的配置界面,首次启动需要解锁Jenkins,我们可以看到初始密码保存在下面的路径中。
我们打开对应的路径,找到initialAdminPassword文件,用记事本打开,复制密码粘贴到上面的密码框中,点击继续。
然后会出现如下界面,我们选择安装推荐的插件,这可能需要一段时间。
Jenkins的下载与安装
Jenkins是一款开源的自动化打包部署的软件,我们可以通过配置远程仓库地址来实现Jenkins自动拉取代码打包部署,可以大大降低运维的成本。接下来介绍他的下载