Jenkins一键打包部署SpringBoot应用
作者:_kairui 发布时间:2022-08-03 16:37:18
一般而言,一个项目部署的由:拉取代码->构建->测试->打包->部署等过程组成,如果我们经常需要部署项目,特别是在微服务时代,服务特别多的情况下,不停的测试打包部署,那估计得有个人一整天专门做这事了,而这事又是繁琐的重复无意义的,所以就需要一套能够持续集成、持续交付、持续部署的自动化构建流程。
Jenkins是开源CI&CD软件领导者,提供超过1000个插件来支持构建、部署、自动化,满足任何项目的需要。我们可以用Jenkins来构建和部署我们的项目,比如说从我们的代码仓库获取代码,然后将我们的代码打包成可执行的文件,之后通过远程的ssh工具执行脚本来运行我们的项目
一、准备工作
真正的生产环境上,可能是有多台服务器,但是我是用来练手,手头没有多余的服务器,只有一台。所以我就将 Jenkins 和我的 Spring Boot 项目都部署到一台服务器上。
由于本次是使用Docker安装Jenkins,所以需要服务器上提前安装好JDK,Maven,Doker三个必备的环境配置。这里就不过多赘述这三个环境的安装了,可以自行查询资料安装
1、检查 JDK 环境
java -version
[root@liulihui home]# java -version
java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode)
[root@liulihui home]#
2、检查 Maven 环境
[root@liulihui home]# mvn -v
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /usr/local/maven/apache-maven-3.6.3
Java version: 1.8.0_231, vendor: Oracle Corporation, runtime: /usr/local/java/jdk/jdk1.8.0_231/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-1160.80.1.el7.x86_64", arch: "amd64", family: "unix"
[root@liulihui home]#
3、检查 Docker 环境
[root@liulihui home]# docker version
Client: Docker Engine - Community
Version: 20.10.21
API version: 1.41
Go version: go1.18.7
Git commit: baeda1f
Built: Tue Oct 25 18:04:24 2022
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.21
API version: 1.41 (minimum version 1.12)
Go version: go1.18.7
Git commit: 3056208
Built: Tue Oct 25 18:02:38 2022
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.12
GitCommit: a05d175400b1145e5e6a735a6710579d181e7fb0
runc:
Version: 1.1.4
GitCommit: v1.1.4-0-g5fd4c4d
docker-init:
Version: 0.19.0
GitCommit: de40ad0
[root@liulihui home]#
二、Jenkins的安装及配置
1、Docker 搜索 jenkins 镜像
[root@liulihui home]# docker search jenkins
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
jenkins DEPRECATED; use "jenkins/jenkins:lts" instead 5585 [OK]
jenkins/jenkins The leading open source automation server 3330
jenkins/jnlp-slave a Jenkins agent which can connect to Jenkins… 153 [OK]
jenkins/inbound-agent 81
bitnami/jenkins Bitnami Docker Image for Jenkins 58 [OK]
jenkins/agent 49
jenkins/slave base image for a Jenkins Agent, which includ… 48 [OK]
jenkins/ssh-slave A Jenkins slave using SSH to establish conne… 38 [OK]
jenkins/ssh-agent Docker image for Jenkins agents connected ov… 28
jenkins/jnlp-agent-docker 8
jenkins/jnlp-agent-maven A JNLP-based agent with Maven 3 built in 7
jenkins/pct Plugin Compat Tester 5 [OK]
jenkins/evergreen An automatically self-updating Jenkins distr… 5
jenkins/jnlp-agent-python A JNLP-based agent with Python built in 3
jenkins/jenkins-experimental Experimental images of Jenkins. These images… 3 [OK]
jenkins/jnlp-agent-alpine 2
jenkins/jnlp-agent-coresdk 2
rancher/jenkins-jenkins 1
jenkins/jnlp-agent-node 1
jenkins/jenkinsfile-runner Jenkinsfile Runner packages 1
jenkins/core-pr-tester Docker image for testing pull-requests sent … 1
jenkins/ath Jenkins Acceptance Test Harness 1 [OK]
jenkins/jnlp-agent-ruby 1
rancher/jenkins-slave Jenkins Build Slave 0 [OK]
rancher/jenkins-jnlp-slave
2、Docker 下载jenkins 镜像
[root@liulihui home]# docker pull jenkins/jenkins:lts
lts: Pulling from jenkins/jenkins
647acf3d48c2: Pull complete
832e288237bc: Pull complete
ea194d1bd1da: Pull complete
98569593b9fd: Pull complete
dfe249e8cdf2: Pull complete
0f6f2e6d37bb: Pull complete
07fcb98649b6: Pull complete
1e33c26b1882: Pull complete
7b24f0e29fe1: Pull complete
4d90ef3a8f3b: Pull complete
d98c8e675bea: Pull complete
b45fc2bf9fd7: Pull complete
d6e1fda9effc: Pull complete
3635a44047f2: Pull complete
486e1776d3bc: Pull complete
41233d151800: Pull complete
14a67803c2b3: Pull complete
Digest: sha256:c1d02293a08ba69483992f541935f7639fb10c6c322785bdabaf7fa94cd5e732
Status: Downloaded newer image for jenkins/jenkins:lts
docker.io/jenkins/jenkins:lts
# 查看镜像
[root@liulihui home]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
jenkins/jenkins lts 2a4bbe50c40b 13 months ago 441MB
java 8 d23bdf5b1b1b 5 years ago 643MB
[root@liulihui home]#
3、Docker容器中运行Jenkins
# 命令如下:
docker run -p 9080:8080 --name liulihui-jenkins \
-u root \
-v /mydata/jenkins_home:/var/jenkins_home \
-v /usr/local/java/jdk/jdk1.8.0_231:/usr/local/jdk1.8 \
-v /usr/local/maven/apache-maven-3.6.3:/usr/local/apache-maven-3.6.3 \
-v $(which docker):/usr/bin/docker \
-v /var/run/docker.sock:/var/run/docker.sock \
-d jenkins/jenkins:lts
# 参数说明:
-p 9080:8080端口映射(将容器的8080端口【后面的8080】映射到服务器的9080端口【前面的9080】,云服务器需要开通9080端口供外网访问)
--name容器名字
-u root用户名
-v /mydata/jenkins_home:/var/jenkins_home 将配置文件夹挂在到主机(:前面的是主机目录,后面的是容器目录)
-v /usr/local/java/jdk/jdk1.8.0_231:/usr/local/jdk1.8是把linux下的jdk和容器内的关联(配置Jenkins时使用,:前面的是主机目录,后面的是容器目录)
-v /usr/local/maven/apache-maven-3.6.3:/usr/local/apache-maven-3.6.3是把linux下的maven和容器内的关联(配置Jenkins时使用,:前面的是主机目录,后面的是容器目录)
-v $(which docker):/usr/bin/docker是可以在Jenkins容器里使用我们Linux下的docker
-v /var/run/docker.sock:/var/run/docker.sock是可以在Jenkins容器里使用我们Linux下的docker
-d jenkins/jenkins:lts后台启动 Jenkins镜像(最新版)
# 查看docker 正在运行的容器
[root@liulihui home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9363f69cc773 jenkins/jenkins:lts "/sbin/tini -- /usr/…" 19 seconds ago Up 17 seconds 50000/tcp, 0.0.0.0:9080->8080/tcp, :::9080->8080/tcp liulihui-jenkins
4、Jenkins的配置
运行成功后访问该地址登录Jenkins,第一次登录需要输入管理员密码:http://你的ip:9080/
使用管理员密码进行登录,可以使用以下命令从容器启动日志中获取管理密码:
# 查看日志,获取管理员密码
[root@liulihui home]# docker logs liulihui-jenkins
Running from: /usr/share/jenkins/jenkins.war
webroot: EnvVars.masterEnvVars.get("JENKINS_HOME")
2023-01-05 06:02:04.057+0000 [id=1]INFOorg.eclipse.jetty.util.log.Log#initialized: Logging initialized @707ms to org.eclipse.jetty.util.log.JavaUtilLog
2023-01-05 06:02:04.141+0000 [id=1]INFOwinstone.Logger#logInternal: Beginning extraction from war file
2023-01-05 06:02:09.723+0000 [id=1]WARNINGo.e.j.s.handler.ContextHandler#setContextPath: Empty contextPath
2023-01-05 06:02:09.829+0000 [id=1]INFOorg.eclipse.jetty.server.Server#doStart: jetty-9.4.43.v20210629; built: 2021-06-30T11:07:22.254Z; git: 526006ecfa3af7f1a27ef3a288e2bef7ea9dd7e8; jvm 11.0.13+8
2023-01-05 06:02:10.641+0000 [id=1]INFOo.e.j.w.StandardDescriptorProcessor#visitServlet: NO JSP Support for /, did not find org.eclipse.jetty.jsp.JettyJspServlet
2023-01-05 06:02:10.757+0000 [id=1]INFOo.e.j.s.s.DefaultSessionIdManager#doStart: DefaultSessionIdManager workerName=node0
2023-01-05 06:02:10.757+0000 [id=1]INFOo.e.j.s.s.DefaultSessionIdManager#doStart: No SessionScavenger set, using defaults
2023-01-05 06:02:10.758+0000 [id=1]INFOo.e.j.server.session.HouseKeeper#startScavenging: node0 Scavenging every 660000ms
2023-01-05 06:02:11.848+0000 [id=1]INFOhudson.WebAppMain#contextInitialized: Jenkins home directory: /var/jenkins_home found at: EnvVars.masterEnvVars.get("JENKINS_HOME")
2023-01-05 06:02:12.155+0000 [id=1]INFOo.e.j.s.handler.ContextHandler#doStart: Started w.@216914{Jenkins v2.319.1,/,file:///var/jenkins_home/war/,AVAILABLE}{/var/jenkins_home/war}
2023-01-05 06:02:12.204+0000 [id=1]INFOo.e.j.server.AbstractConnector#doStart: Started ServerConnector@72cf2de5{HTTP/1.1, (http/1.1)}{0.0.0.0:8080}
2023-01-05 06:02:12.204+0000 [id=1]INFOorg.eclipse.jetty.server.Server#doStart: Started @8856ms
2023-01-05 06:02:12.219+0000 [id=23]INFOwinstone.Logger#logInternal: Winstone Servlet Engine running: controlPort=disabled
2023-01-05 06:02:12.576+0000 [id=30]INFOjenkins.InitReactorRunner$1#onAttained: Started initialization
2023-01-05 06:02:12.620+0000 [id=28]INFOjenkins.InitReactorRunner$1#onAttained: Listed all plugins
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.google.inject.internal.cglib.core.$ReflectUtils$2 (file:/var/jenkins_home/war/WEB-INF/lib/guice-4.0.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)
WARNING: Please consider reporting this to the maintainers of com.google.inject.internal.cglib.core.$ReflectUtils$2
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
2023-01-05 06:02:14.226+0000 [id=28]INFOjenkins.InitReactorRunner$1#onAttained: Prepared all plugins
2023-01-05 06:02:14.231+0000 [id=28]INFOjenkins.InitReactorRunner$1#onAttained: Started all plugins
2023-01-05 06:02:14.249+0000 [id=28]INFOjenkins.InitReactorRunner$1#onAttained: Augmented all extensions
2023-01-05 06:02:15.935+0000 [id=30]INFOjenkins.InitReactorRunner$1#onAttained: System config loaded
2023-01-05 06:02:15.936+0000 [id=30]INFOjenkins.InitReactorRunner$1#onAttained: System config adapted
2023-01-05 06:02:15.936+0000 [id=30]INFOjenkins.InitReactorRunner$1#onAttained: Loaded all jobs
2023-01-05 06:02:15.937+0000 [id=30]INFOjenkins.InitReactorRunner$1#onAttained: Configuration for all jobs updated
2023-01-05 06:02:16.146+0000 [id=44]INFOhudson.model.AsyncPeriodicWork#lambda$doRun$1: Started Download metadata
2023-01-05 06:02:16.212+0000 [id=44]INFOhudson.util.Retrier#start: Attempt #1 to do the action check updates server
2023-01-05 06:02:19.033+0000 [id=28]INFOjenkins.install.SetupWizard#init:
*************************************************************
*************************************************************
*************************************************************
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:
f8bf269a288f4cdd92710f2d41eed6a1
This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
*************************************************************
*************************************************************
*************************************************************
2023-01-05 06:03:41.112+0000 [id=44]INFOh.m.DownloadService$Downloadable#load: Obtained the updated data file for hudson.tasks.Maven.MavenInstaller
2023-01-05 06:03:41.113+0000 [id=44]INFOhudson.util.Retrier#start: Performed the action check updates server successfully at the attempt #1
2023-01-05 06:03:41.115+0000 [id=44]INFOhudson.model.AsyncPeriodicWork#lambda$doRun$1: Finished Download metadata. 84,965 ms
2023-01-05 06:03:41.912+0000 [id=30]INFOjenkins.InitReactorRunner$1#onAttained: Completed initialization
2023-01-05 06:03:41.930+0000 [id=22]INFOhudson.WebAppMain$3#run: Jenkins is fully up and running
[root@liulihui home]#
输入管理员密码后,就进入安装界面,选择安装插件方式,这里我们直接安装推荐的插件
安装完成后,创建管理员账号:
进入插件安装界面,联网等待插件安装:
进行实例配置:
点击保存并完成,Jenkins就安装已完成
进入Jenkins,点击系统管理->插件管理,进行一些自定义的插件安装
修改插件的站点,把原站点:https://updates.jenkins.io/update-center.json 改为:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json 可以更快的下载插件
确保以下插件被正确安装,未安装的在可选插件中搜索安装即可:
(1)根据角色管理权限的插件:Role-based Authorization Strategy
(2)把 Jenkins 打包好的 jar 上传到应用服务器上:Publish Over SSH
已安装插件Role-based Authorization Strategy
已安装插件Publish Over SSH
安装完成后需要重启一下jenkins,在连接后面加restart就可以重启jenkins了,或者使用命令:docker restart 容器名字
http://ip:9080/restart 或者 docker restart 容器名字(这里是 http://ip:9080/restart )
5、配置JDK和Maven
通过系统管理->全局工具配置来进行全局工具的配置,路径都是jenkins里面的路径;
jdk配置
maven配置
系统管理->系统配置,找到 Publish Over SSH,配置好要连接的应用服务器(在后面的操作中需要使用jenkins远程ssh连接到应用服务器,进行构建后的应用部署运行。用户名密码会导致 jar 包上传失败,要在应用服务器上生成 ssh 密钥对。)
Centos 7 上创建SSH密钥查看:https://www.jb51.net/article/170446.htm
Jenkins使用ssh就可以执行远程的linux脚本了:
进入系统管理->凭据中,添加Gitee登录账号凭据。接下来配置 Gitee 的凭证,要根据这些凭证,才能从 Gitee 上拉取代码下来
填写完成后选择该凭据,就可以正常连接git仓库了;
所有配置工作都做完了,接下来我们就可以开始构建一个项目了。
三、打包部署SpringBoot应用
1、在Jenkins中创建执行任务
设置任务名称后,选择构建一个自由风格的软件项目:
2、添加git凭据
添加gitee登录账号凭据。接下来配置 gitee 的凭证,要根据这些凭证,才能从 gitee 上拉取代码下来。(如果前面添加了凭证,这里直接选择就行)
填写完成后选择该凭据,就可以正常连接git仓库了;
3、添加maven构建
maven 构建
选择我们的maven版本,然后设置maven命令和指定pom文件位置:
增加 构建后操作步骤:
因为前面运行jenkins的时候已经做了目录的映射,所以jenkins打完包后其实是会把包同步到服务映射的目录里的。所以这里不需要上传jar包,直接执行xshell命令,进入jar包的目录,执行jar包即可
shell脚本:
#第一步是进入到服务器中生成好的jar包的目录下
cd /mydata/jenkins_home/workspace/demo/target/
#第二步是根据jar包的名字获取运行的pid,并且将该进程杀死
ps -ef | grep demo-0.0.1-SNAPSHOT.jar | grep -v grep | awk '{printf $2}' | xargs kill -9
#执行 前加载一下环境变量,否则不会执行java -jar 命令
source /etc/profile
#最后一步就是将这个jar后台启动了,并且将日志输出到warpper.log中。
nohup java -jar demo-0.0.1-SNAPSHOT.jar >demo.log &2>1 &
#睡眠1秒
sleep 1
#输出内容,可不加
echo "启动完成>>>>"
四、立即构建
配置完成后,点击立即构建,可以看到控制台输出成功
选择项目打包分支:
分支配置:
服务部署成功,测试接口返回成功:
来源:https://blog.csdn.net/liulihui1988/article/details/128590305
猜你喜欢
- 在互联网的服务端开发的时候,我们很经常要在一个项目中去调用不同的数据库。在这种情况下,必然要涉及到多数据源问题。那么,我们该如何解决多数据源
- C++虚类相当于java中的抽象类,与接口的不同之处是:1.一个子类只能继承一个抽象类(虚类),但能实现多个接口2.一个抽象类可以有构造方法
- AOP注解无效,切面不执行的解决想做一个api请求日志,想到使用aop,配置过程中遇到了一个坑,aop不起作用,我的aop是这样的:pack
- 前言微服务架构,前后端分离目前已成为互联网项目开发的业界标准,其核心思想就是前端(APP、小程序、H5页面等)通过调用后端的API接口,提交
- 前言Java 中常规的集合工具,相比大家都熟练于胸,但是如果说有一个集合类你不一定知道或者说肯定没用过,你相不相信呢?今天跟大家介绍的就是&
- Java BufferWriter写文件之后文件是空的或者数据不全在编程的过程中,读写文件是非常常见的操作,在这里我问介绍一下最近我遇到的集
- 本文实例为大家分享了java实现幸运抽奖功能的具体代码,供大家参考,具体内容如下本系统较为简单,未使用是什么多的算法,也未添加保存文件读取文
- 最近这款“跳一跳”很火,在段子里面看到有人才放了张画着坐标的纸在手机上,说根据
- 近期,Apache SkyWalking 修复了一个隐藏了近4年的Bug - TTL timer 可能失效问题,这个 bug 在 SkyWa
- 每种编程语言都有自己操作内存中元素的方式,例如在 C 和 C++ 里是通过指针,而在 Java 中则是通过“引用”。在 JDK.1.2 之后
- 本文实例讲述了Java模拟死锁发生之演绎哲学家进餐问题。分享给大家供大家参考,具体如下:一 点睛常见的死锁形式:当线程1已经占据资源R1,并
- 本文实例讲述了Java定义泛型方法。分享给大家供大家参考,具体如下:一 点睛1 如果定义类、接口是没有使用类型形参,但定义方法时想自己定义类
- 最新开发新项目的时候,要做分享项目,要求分享有微信,微信朋友圈,QQ,QQ空间,新浪微博这五个,所分享内容包括,分享纯图片,纯文字,图文类型
- 第1部分 TreeSet介绍TreeSet简介TreeSet 是一个有序的集合,它的作用是提供有序的Set集合。它继承于AbstractSe
- * 是许多框架底层实现的基础,比如Spirng的AOP等,其实弄清楚了 * 的实现原理,它就没那么神奇了,下面就来通过案例和分析JDK
- 今天一个读者问我关于Android通过调用Webservice实现天气预报这篇文章的源码下载后出现的错误Could not find cla
- 目的官方的Drools范例大都是基于纯Java项目或Maven项目,而基于Spring Boot项目的很少。本文介绍如何在Spring Bo
- 目录不含return的执行顺序finally子句含return的执行顺序返回类型是对象类型时值的变化结论不含return的执行顺序执行顺序为
- 前言最近被问到了这个问题,第一次回答的也是很不好,在此参考网上答案进行整理记录。供大家学习参考。Synchronized修饰非静态方法Syn
- switch结构(开关语句)的语法switch(表达式 ){--->类型为int、char case 常量1 :---&g