从零学习Jenkins部署SpringBoot项目

简介: 从零学习Jenkins部署SpringBoot项目

1.jpg

前言


之前项目中虽然使用过 Jenkins,但是都只是使用,没有自己搭建过,完整部署一个项目。既然工作中没有独立部署过,那么就只能自己动手实操一番,技多不压身嘛。

一开始是在本机上下载安装 Jenkins,然后将本地项目上传到 Gitlab 上,期望在 Jenkins 上构建项目,然后进行项目的部署和发布。但是在动手过程中发现本机 Jenkins 新建任务时走不通,要么就搭建虚拟机,或者搞台服务器,刚好手头有一台自己玩的服务器,刚好也刚贴合实际生产,所以才有了下文。


准备工作


JDK


准备java环境,jdk1.8


检查java是否安装,如果没有则先安装java环境:java -version


查看 jdk 安装路径:echo $JAVA_HOME


[root@iZ8vbf6lodiycfjz81qhkyZ home]# echo $JAVA_HOME
/usr/java/jdk1.8.0_251-amd64
复制代码


配置环境变量


JAVA_HOME=/usr/java/jdk1.8.0_251-amd64
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME
export PATH
export CLASSPATH
复制代码


然后生效配置文件,


注意


如果不配置环境变量,结果会是这样


[root@iZ8vbf6lodiycfjz81qhkyZ alternatives]# java -version
openjdk version "1.8.0_302"
OpenJDK Runtime Environment (build 1.8.0_302-b08)
OpenJDK 64-Bit Server VM (build 25.302-b08, mixed mode)
复制代码


Git


通过 yum 命令安装 yum install git。


git --version
#查看安装位置
which git
复制代码


maven


yum -y install maven 
mvn -v  # 注: 是mvn不是maven,用错的话,还以为没有配置maven环境变量呢,错误用法:maven -v
Apache Maven 3.0.5 (Red Hat 3.0.5-17)
Maven home: /usr/share/maven
Java version: 1.8.0_302, vendor: Red Hat, Inc.
Java home: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.302.b08-0.el7_9.x86_64/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-1160.11.1.el7.x86_64", arch: "amd64", family: "unix"
复制代码


修改配置文件,如下命令:


vi /usr/share/maven/conf/settings.xml
#然后添加阿里云镜像地址
<mirror>
  <id>alimaven</id>
  <name>aliyun maven</name>
  <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  <mirrorOf>central</mirrorOf>
</mirror>
#设置本地仓库
<localRepository>/home/maven/repository</localRepository>
复制代码


配置环境变量,


vi ~/.bash_profile
#追加如下内容
export M3_HOME=/usr/share/maven
export PATH=$M3_HOME/bin:$PATH
复制代码


Gradle


本文使用 Gradle 的最新版本是7.2。在继续下一步之前,您应该检查 Gradle版本页面,以查看是否有较新的版本。


首先使用以下wget命令在/tmp目录中下载仅Gradle Binary zip文件:


wget https://services.gradle.org/distributions/gradle-7.2-bin.zip -P /tmp
复制代码


下载完成后,解压缩/opt/gradle目录中的zip文件:


sudo unzip -d /home/gradle /tmp/gradle-7.2-bin.zip
复制代码


通过列出/opt/gradle/gradle-7.2目录来验证是否提取了Gradle文件:


ls /home/gradle/gradle-7.2
bin  init.d  lib  LICENSE  NOTICE  README
复制代码


配置环境变量,


vi ~/.bash_profile
#追加如下内容
GRADLE_HOME=/home/gradle/gradle-7.2
export GRADLE_HOME
export PATH=$PATH:$GRADLE_HOME/bin
复制代码


查看版本号


gradle -v
复制代码


安装jenkins


(1)安装稳定版


sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat-stable/jenkins.repo
sudo rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
sudo yum install jenkins
复制代码


(2)安装最新版,默认安装最新的


wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo 
rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
yum install -y jenkins
复制代码


安装完成后,如果想查看 jenkins 版本,按照网上的说法是去 /var/lib/jenkins 目录下执行下述命令:


cat config.xml|grep version
复制代码


不过我自己服务器的输出结果有点问题。


自动安装的话,默认用户名为 jenkins,端口为8080,默认目录:

  • 安装目录:/var/lib/jenkins
  • 日志目录:/var/log/jenkins/jenkins.log
  • 默认配置目录:/etc/sysconfig/jenkins


可修改jenkins用户为root用户、修改端口等


vim /etc/sysconfig/jenkins
service jenkins restart
复制代码


卸载jenkins


卸载yum方式安装的jenkins(默认安装主目录是在/var/lib/jenkins/


service jenkins stop
yum clean all
yum -y remove jenkins
复制代码


初始化


激活jenkins


首先启动 jenkins,执行下述命令:


service jenkins start
复制代码


然后访问 http::/ip:8080,


首次登录需要输入密码,看页面提示:


/var/lib/jenkins/secrets/initialAdminPassword
复制代码


最后成功登录。


浏览器进入Jenkins


(1)登录:http://自己的IP:8081/

(2)关闭:http://自己的IP:8081/exit

(3)重启:http://自己的IP:8081/restart

(4)重新加载:http://自己的IP:8081/reload


启动与关闭


service jenkins start
service jenkins stop
#如果遇到warning
systemctl start jenkins
systemctl stop jenkins
复制代码


插件安装


Authorize Project


给项目配置授权。


Gitlab Hook Plugin


当Github有代码提交时触发自动构建


SSH Slaves plugin


更新-2020-4-21:

1.26 还叫SSH slave

1.31.2 已经更新为SSH build Agents


Gitlab


当有新的commit push到gitlab时,jenkins可以自动触发构建过程。除了需要 gitlab-hook-plugin 插件,还需要 Gitlab 插件。


Deploy to container


与Gitlab关联


配置SSH


如果要通过 git 协议拉取代码,需要建立 Jenkins 服务器和 Gitlab 服务器的无密码通信,我们首先要生存一组密钥对。


[root@iZ8vbf6lodiycfjz81qhkyZ tmp]# ssh-keygen -t rsa -C "你的邮箱(随意)"Generating public/private rsa key pair.Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa.Your public key has been saved in /root/.ssh/id_rsa.pub.The key fingerprint is:SHA256:D998pKifmjJgSmUcNNlaEDAdhB/UU4wr+QkPVMkd1KU xxxxxThe key's randomart image is:+---[RSA 2048]----+|  oBOX.B+o ..    ||  ..*.O o ..     ||   + * o  E      ||    @ .          ||   o * .S     .  ||  . o +  + + o   || . o .    + + .  ||  .   o  o . .   ||       o+oo      |+----[SHA256]-----+
复制代码


完成后在/root/.ssh/ 会生成2个文件。id_rsa 和 id_rsa.pub。前者是私钥,注意保管,后者是公钥。


添加SSH Key到GitLab


登录GitLab之后: Profile Settings => SSH Keys => Add SSH key

输入之前生成的公钥,标题自定义。


推荐阅读:持续集成之 Jenkins 如何通过 Gitlab 上的权限认证(三)


Gitlab令牌


关于 jenkins 中配置 gitlab access token 的步骤推荐阅读:如何获取 GitLab Token?

Jenkins安装与Gitlab项目部署详解

GitLab+Jenkins持续集成


新建任务


在新建任务前,需要配置好 SSH。


1、新建任务


2.jpg


2、General


3.jpg


其中 Gitlab Connection 是在获取 Gitlab 令牌时配置的。JDK 可以选择服务器上的路径,我们之前在全局工具配置那里配置过。


3、源码管理


4.jpg


此时点击添加按钮,会有个 jenkins 选项,然后进入到该页面:


5.jpg


类型选项可以选择 Username with password,或者 SSH,选择前者,则输入 gitlab 的账号和密码,选择后者,则在 private key 配置私钥,也就是配置 SSH 时 id_rsa 文件中的内容。


配置成功后


6.jpg


如果你的账号、密码、仓库地址均正确,则错误提示消失。


4、构建触发器


7.jpg


我们勾选 "Build whenever a SNAPSHOT dependency is built" 。同时需要配置 Gitlab 的 webhook,将上述红框标注的地址配置到 gitlab 中。


8.jpg

9.jpg


可以点击测试按钮试一下,选择 pubsh events 即可。


5、构建环境


10.jpg


6、Build


11.jpg


Build是当把代码拉下来之后需要做的操作,由于是一个maven项目,因此我们需要指定编译打包的命令,这里是:


clean package -Dmaven.test.skip=true
复制代码


7、Post Steps


12.jpg


这一步最为关键,能否成功全看这里的配置了,首先给出对应的 shell 脚本:


#!/bin/bash 
echo '开始maven 构建服务'
#export BUILD_ID=dontKillMe这一句很重要,这样指定了,项目启动之后才不会被Jenkins杀掉。
export BUILD_ID=dontKillMe
mvn clean install
#指定最后编译好的jar存放的位置
www_path=/home/wwwroot/jenkins
#Jenkins中编译好的jar位置
jar_path=/var/lib/jenkins/workspace/Mybatis-Generate/target
cd  ${jar_path}
#获取Jenkins中编译好的jar名称,其中XXX为你的pom文件中的artifactId的值,这一步主要是为了根据项目版本号动态获取项目文件名
#jar_name=`ls |grep XXX-|grep -v original`
jar_name=`ls |grep mybatis-generator-|grep -v original`
#jar_name=mybatis-generator-1.0-SNAPSHOT.jar
#需要注意的是,初次构建时并没有对应的pid,所以需要判断一下是否存在该文件
#获取运行编译好的进程ID,便于我们在重新部署项目的时候先杀掉以前的进程
if [ -f "/home/wwwroot/jenkins/Mybatis-Generate.pid" ];then
  pid=$(cat /home/wwwroot/jenkins/Mybatis-Generate.pid)
  #杀掉以前可能启动的项目进程
  kill -9 ${pid}
fi
#进入最后指定存放jar的位置
cd  ${www_path}
#先删除原来的jar文件
rm -rf ./${jar_name}
#进入指定的编译好的jar的位置
cd  ${jar_path}
#将编译好的jar复制到最后指定的位置
cp  -r ${jar_path}/${jar_name} ${www_path}
#进入最后指定存放jar的位置
cd  ${www_path}
#启动jar,指定SpringBoot的profiles为beta,后台启动
#java -jar -Dspring.profiles.active=beta ${jar_name} &
java -jar ${jar_name} &
#将进程ID存入到ufind-web.pid文件中
echo $! > /home/wwwroot/jenkins/Mybatis-Generate.pid
复制代码


关于上述脚本,我们该如何配置呢?


jar_path


首先在服务器中找到 jenkins 的安装地址,上文提到过,位于 /var/lib/jenkins。


在该目录下有 workspace 文件夹,其中 Mybatis-Generate 是我们任务的名称,最终这就构成了我们的 jar_path,mvn 执行命令后会生成对应的 jar 包,并存放在 target 目录下。


www_path


我们后序会将 jar 包复制一份到另外一个文件夹中,所以根据自己的习惯来创建这个文件夹。


8、构建设置,配置 email,额外功能,不影响项目的构建


首先需要下载两个插件:Email Extension, Email Extension Template,这两个插件可以帮助我们进行邮件的编写发送以及格式化。


具体操作步骤网上有很多,这里推荐阅读:03-Jenkins之Email配置与任务邮件发送实践与踩坑


网易163免费邮箱相关服务器信息:


13.jpg


参考文献


使用Jenkins自动化部署SpringBoot项目

使用Jenkins配置SpringBoot的自动化构建


问题记录


解决jenkins内存占用过高


  • 修改配置文件vim /etc/sysconfig/jenkins
  • 内容如下:


# JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true"
JENKINS_JAVA_OPTIONS="-XX:MaxPermSize=512m -Djava.awt.headless=true"
复制代码


  • 重启jenkins


Java 11 is the recommended version to run Jenkins on;


分为两种环境,linux 中,以及 macOS 中通过 brew 安装的 jenkins。


一、linux


vi /etc/init.d/jenkins
复制代码


修改如下部分:


candidates="
/etc/alternatives/java
/usr/lib/jvm/java-1.8.0/bin/java
/usr/lib/jvm/jre-1.8.0/bin/java
/usr/lib/jvm/java-11.0/bin/java
/usr/lib/jvm/jre-11.0/bin/java
/usr/lib/jvm/java-11-openjdk-amd64
/usr/bin/java
"
复制代码


追加本机安装的 jdk


/usr/java/jdk1.8.0_251-amd64/bin/java
复制代码


此法不通,则推荐阅读:stackoverflow.com/questions/5…


二、macOS


尝试在 jenkins 中安装 gitlab-hook 插件,而在安装 ruby-runtime 时它会引发错误


java.lang.RuntimeException: unsupported Java version: 11 at org.jruby.RubyInstanceConfig.initGlobalJavaVersion(RubyInstanceConfig.java:1674) at org.jruby.RubyInstanceConfig.<clinit>(RubyInstanceConfig.java:1387) Caused: java.lang.ExceptionInInitializerError at org.jruby.embed.internal.AbstractLocalContextProvider.<init>(AbstractLocalContextProvider.java:42)
复制代码


1、打开文件 vi /usr/local/opt/jenkins/homebrew.mxcl.jenkins.plist


2、修改 java 配置


/Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home/bin/java
复制代码


参考文献:

github.com/elvanja/jen…


jenkins.service changed on disk. Run 'systemctl daemon-reload' to reload units


[root@izm5e1qim1yoreb6toj6d9z local]# service jenkins start
Starting jenkins (via systemctl):  Warning: jenkins.service changed on disk. Run 'systemctl daemon-reload' to reload units.
                                                           [  OK  ]
[root@izm5e1qim1yoreb6toj6d9z local]# systemctl daemon-reload
[root@izm5e1qim1yoreb6toj6d9z local]# systemctl restart jenkins
复制代码


Jenkins 中创建项目时没有Maven项目怎么办


下载插件:Maven Integration


jenkins构建时错误 Failed to create parent directories for tracking file


14.jpg


使用jenkins构建时提示如下错误,原因是maven仓库的权限不够,解决办法增加文件夹权限:


chmod 777 maven仓库路径,如:


chmod 777 /home/maven/repository
复制代码


jenkins构建报错Failed to create /home/jenkins/.m2


15.jpg

chmod 777 /home/jenkins
复制代码


总结



回顾上文,看起来很简单,只是安装必要的工具,然后配置一下 Jenkins 即可,但是实际操作却花了不少的时间,有些时候就只是那么一丁点的问题,但是自己不明白,去网上各种查找资料,往往需要翻阅很多文章,相互对比结合起来才能找到正确的答案。

也许找个有经验的人指导着做,很快就能完成了,但并不是每个人身边恰巧有这样的大佬。


还是那句话,好记性不如烂笔头,做一遍,写下来,踩踩坑,会留下很深的印象。

目录
相关文章
|
20天前
|
前端开发 Java 数据库
SpringBoot学习
【10月更文挑战第7天】Spring学习
33 9
|
15天前
|
自然语言处理 jenkins 测试技术
Jenkins适合什么样的项目
【10月更文挑战第18天】Jenkins适合什么样的项目
25 3
|
21天前
|
XML Java 数据格式
Spring学习
【10月更文挑战第6天】Spring学习
19 1
|
25天前
|
Java 测试技术 开发者
springboot学习四:Spring Boot profile多环境配置、devtools热部署
这篇文章主要介绍了如何在Spring Boot中进行多环境配置以及如何整合DevTools实现热部署,以提高开发效率。
51 2
|
25天前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
46 1
|
25天前
|
Java API Spring
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中拦截器的入门教程和实战项目场景实现的详细指南。
17 0
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
|
25天前
|
Java API Spring
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中过滤器的基础知识和实战项目应用的教程。
21 0
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
|
25天前
|
Java 关系型数据库 MySQL
springboot学习五:springboot整合Mybatis 连接 mysql数据库
这篇文章是关于如何使用Spring Boot整合MyBatis来连接MySQL数据库,并进行基本的增删改查操作的教程。
40 0
springboot学习五:springboot整合Mybatis 连接 mysql数据库
|
25天前
|
Java 关系型数据库 MySQL
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
这篇文章是关于如何使用Spring Boot框架通过JdbcTemplate操作MySQL数据库的教程。
19 0
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
|
25天前
|
Java 测试技术 Spring
springboot学习三:Spring Boot 配置文件语法、静态工具类读取配置文件、静态工具类读取配置文件
这篇文章介绍了Spring Boot中配置文件的语法、如何读取配置文件以及如何通过静态工具类读取配置文件。
33 0
springboot学习三:Spring Boot 配置文件语法、静态工具类读取配置文件、静态工具类读取配置文件