1987WEB视界-分享互联网热门产品和行业

您现在的位置是:首页 > WEB开发 > 正文

WEB开发

Jenkins共享库应用入门(CI篇)

1987web2023-10-06WEB开发217

前言

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-publichttps://maven.aliyun.com/repository/publicaliyun-centercentralaliyun-centralhttps://maven.aliyun.com/repository/centralaliyun-springspringaliyun-springhttps://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自动拉取代码打包部署,可以大大降低运维的成本。接下来介绍他的下载