从零学习Jenkins部署SpringBoot项目

hresh 689 0

从零学习Jenkins部署SpringBoot项目

前言

之前项目中虽然使用过 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、新建任务

Jenkins构建maven项目

2、General

Jenkins构建maven项目

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

3、源码管理

Jenkins构建maven项目

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

Jenkins构建maven项目

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

配置成功后

Jenkins构建maven项目

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

4、构建触发器

构建触发器

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

构建触发器

构建触发器

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

5、构建环境

构建环境

6、Build

Build

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

clean package -Dmaven.test.skip=true

7、Post Steps

Post Steps

这一步最为关键,能否成功全看这里的配置了,首先给出对应的 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免费邮箱相关服务器信息:

从零学习Jenkins部署SpringBoot项目

参考文献

使用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

此法不通,则推荐阅读:https://stackoverflow.com/questions/55243120/jenkins-add-jdk-11-to-jdk-list

二、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

参考文献:

https://github.com/elvanja/jenkins-gitlab-hook-plugin/issues/78

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

jenkins构建报错

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

chmod 777 maven仓库路径,如:

chmod 777 /home/maven/repository

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

jenkins构建报错

chmod 777 /home/jenkins

总结

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

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

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

发表评论 取消回复
表情 图片 链接 代码

分享