从零到一:Linux 项目部署与 Jenkins 自动化实战
操作步骤
1.1 安装JDK
课程资料中已经提供:jdk-11.0.16_linux-x64_bin.tar.gz
JDK具体安装步骤如下:
1). 上传安装包
使用FinalShell自带的上传工具将jdk的二进制发布包上传到Linux(箭头里面指向的jdk8只是个示例,传自己需要的安装包即可)
由于上述在进行文件上传时,选择的上传目录为/root,上传完毕后,进入到/root目录查看上传的安装包。

2). 解压安装包
执行如下指令,将上传上来的压缩包进行解压,并通过-C参数指定解压文件存放目录为 /usr/local。
tar -zxvf jdk-11.0.16_linux-x64_bin.tar.gz -C /usr/local
3). 配置环境变量
使用vim命令修改/etc/profile文件,在文件末尾加入如下配置
JAVA_HOME=/usr/local/jdk-11.0.16
PATH=$JAVA_HOME/bin:$PATH具体操作指令如下:
1). 编辑/etc/profile文件,进入命令模式
vim /etc/profile
2). 在命令模式中,输入指令 G , 切换到文件最后
G
3). 在命令模式中输入 i/a/o 进入插入模式,然后切换到文件最后一行
i
4). 将上述的配置拷贝到文件中
JAVA_HOME=/usr/local/jdk-11.0.16
PATH=$JAVA_HOME/bin:$PATH
5). 从插入模式,切换到指令模式
ESC
6). 按:进入底行模式,然后输入wq,回车保存
:wq4). 重新加载profile文件
为了使更改的配置立即生效,需要重新加载profile文件,执行命令:
source /etc/profile5). 检查安装是否成功
java -version
1.2 安装MySQL(废弃)
1.2.1 MySQL安装
对于MySQL数据库的安装,我们将要使用前面讲解的第二种安装方式rpm进行安装。那么首先我们先了解一下什么rpm?
RPM:全称为 Red-Hat Package Manager,RPM软件包管理器,是红帽Linux用于管理和安装软件的工具。
我们要通过rpm,进行MySQL数据库的安装,主要的步骤如下:
1). 检测当前系统是否安装过MySQL相关数据库
需要通过rpm相关指令,来查询当前系统中是否存在已安装的mysql软件包,执行指令如下:
rpm -qa 查询当前系统中安装的所有软件
rpm -qa | grep mysql 查询当前系统中安装的名称带mysql的软件
rpm -qa | grep mariadb 查询当前系统中安装的名称带mariadb的软件通过rpm -qa 查询到系统通过rpm安装的所有软件,太多了,不方便查看,所以我们可以通过管道符 | 配合着grep进行过滤查询。

通过查询,我们发现在当前系统中存在mariadb数据库,是CentOS7中自带的,而这个数据库和MySQL数据库是冲突的,所以要想保证MySQL成功安装,需要卸载mariadb数据库。
2). 卸载现有的MySQL数据库
在rpm中,卸载软件的语法为:
rpm -e --nodeps 软件名称那么,我们就可以通过指令,卸载 mariadb,具体指令为:
rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64
我们看到执行完毕之后, 再次查询 mariadb,就查不到了,因为已经被成功卸载了。
3). 将资料中提供的MySQL安装包上传到Linux并解压
A. 上传MySQL安装包
在课程资料中,提供的有MySQL的安装包 ,我们需要将该安装包上传到Linux系统的root目录 下面。


B. 解压到/usr/local/mysql
执行如下指令:
mkdir /usr/local/mysql
tar -zxvf mysql-5.7.25-1.el7.x86_64.rpm-bundle.tar.gz -C /usr/local/mysql
4). 安装顺序安装rpm安装包
cd /usr/local/mysql
rpm -ivh mysql-community-common-5.7.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-devel-5.7.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-compat-5.7.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.25-1.el7.x86_64.rpm
yum install net-tools
yum -y install numactl
rpm -ivh mysql-community-server-5.7.25-1.el7.x86_64.rpm如果报错:

先执行:sudo yum install -y libaio
再执行:rpm -ivh mysql-community-server-5.7.25-1.el7.x86_64.rpm
1.2.2 MySQL启动
MySQL安装完成之后,会自动注册为系统的服务,服务名为mysqld。那么,我们就可以通过systemctl指令来查看mysql的状态、启动mysql、停止mysql。
systemctl status mysqld 查看mysql服务状态
systemctl start mysqld 启动mysql服务
systemctl stop mysqld 停止mysql服务
说明:
可以设置开机时启动mysql服务,避免每次开机启动mysql。执行如下指令:
systemctl enable mysqld
我们可以通过如下两种方式,来判定mysql是否启动:
netstat -tunlp 查看已经启动的服务
netstat -tunlp | grep mysql 查看mysql的服务信息
ps –ef|grep mysql 查看mysql进程
备注:
A. netstat命令用来打印Linux中网络系统的状态信息,可让你得知整个Linux系统的网络情况。
参数说明:
-l或--listening:显示监控中的服务器的Socket;
-n或--numeric:直接使用ip地址,而不通过域名服务器;
-p或--programs:显示正在使用Socket的程序识别码和程序名称;
-t或--tcp:显示TCP传输协议的连线状况;
-u或--udp:显示UDP传输协议的连线状况; B. ps命令用于查看Linux中的进程数据。
1.2.3 MySQL登录
1.2.3.1 查阅临时密码
MySQL启动起来之后,我们就可以测试一下登录操作,但是我们要想登录MySQL,需要一个访问密码,而刚才在安装MySQL的过程中,并没有看到让我们设置访问密码,那这个访问密码是多少呢? 那实际上,对于rpm安装的mysql,在mysql第一次启动时,会自动帮我们生成root用户的访问密码,并且输出在mysql的日志文件 /var/log/mysqld.log中,我们可以查看这份日志文件,从而获取到访问密码。
可以执行如下指令:
1). cat /var/log/mysqld.log

这种方式,可以看到所有的日志数据,文件比较大时,很不方便查看数据。我们可以通过管道符 | 配合grep来对数据进行过滤。
2). cat /var/log/mysqld.log | grep password
我们可以通过上述指令,查询日志文件内容中包含password的行信息。

1.2.3.2 登录MySQL
获取到root用户的临时密码之后,我们就可以登录mysql数据库,修改root的密码,为root设置一个新的密码。并且我们还需要开启root用户远程访问该数据库的权限,这样的话,我们就可以在windows上来访问这台MySQL数据库。
执行如下指令:
①. 登录mysql(复制日志中的临时密码登录)
mysql -uroot -p
②. 修改密码
set global validate_password_length=4; 设置密码长度最低位数
set global validate_password_policy=LOW; 设置密码安全等级低,便于密码可以修改成root
set password = password('Rootitcast'); 设置密码为root
3.允许远程访问
use mysql # 进入mysql库
select host,user from user; # 查看用户权限表
update user set host = '%' where user = 'root'; # 设置root用户的权限允许非localhost登录(% 代表所有)
FLUSH PRIVILEGES; # 刷新数据库配置操作完上述的指令之后,数据库root用户的密码以及远程访问我们就配置好了,接下来,可以执行exit退出mysql,再次通过新的密码进行登录。

当然我们也可以使用安装在windows系统中的sqlyog或者Navicat来远程连接linux上的MySQL。

注意: 要想在windows上能够访问MySQL,还需要开放防火墙的3306端口
1.3 安装Redis
1.3.1 redis安装
Redis的安装和上述JDK的安装采用相同的方式,都是使用二进制发布包的形式进行安装,在我们的资料目录下,也已经准备了安装包:
redis-6.2.6.tar.gz
具体安装步骤如下:
1). 上传安装包
使用FinalShell自带的上传工具将redis上传到服务器任意目录。
2). 解压安装包
进入到对应目录,将上传上来的安装包解压,执行命令为
tar -vxzf redis-6.2.6.tar.gz3). 移动redis目录,一般都会将redis目录放置到 /usr/local/redis目录
mv redis-6.2.6 /usr/local/redis4). 进入redis安装目录,执行make命令编译redis
cd /usr/local/redis
make如果执行make命令报错:cc 未找到命令,原因是虚拟机系统中缺少gcc,执行下面命令安装gcc:
yum -y install gcc automake autoconf libtool make
如果执行make命令报错:致命错误:jemalloc/jemalloc.h: 没有那个文件或目录,则需要在make指定分配器为libc。执行下面命令即可正常编译:
make MALLOC=libc
make命令执行完,redis就编译完成了
5). 执行下面命令安装redis,并指定安装目录
make install PREFIX=/usr/local/redis6).修改redis.conf,使其支持其他IP地址能访问,否则只有本机可以访问
vi redis.conf搜索(命令模式下输入/):bind 127.0.0

在bind前面加#
把保护模式更改为no

启用redis密码,稍微复杂点,切记!!!(否则会被黑客攻击)

1.3.2 redis启动
1、进入redis安装目录,执行下面命令启动redis服务
./bin/redis-server redis.conf但这种启动方式不能退出控制台,如果退出,那么redis服务也会停止。如果想要redis以后台方式运行,需要修改redis的配置文件:redis.conf。将该配置文件中的daemonize no改为daemonize yes即可
修改完成后,重新执行启动命令启动redis。
可以通过命令:ps -ef | grep redis 查看结果
云主机注意开放6379端口!!!
1.4 安装nginx
安装EPEL存储库
sudo yum install epel-release安装nginx
sudo yum install nginx启动
sudo systemctl start nginx验证nginx是否启动
sudo systemctl status nginx
浏览器访问:http://ip (ip为自己服务器IP)

显示这页面是因为nginx的默认页面长这样
1.5 安装lrzsz(选装)
lrzsz 是用于在Linux系统中文件上传下载的软件。大家可能会存在疑问,我们用finalShell图形化界面就可以很方便的完成上传下载,为什么还要使用这个软件来完成上传下载呢?实际上是这样的,Linux的远程连接工具有很多,而finalShell只是其中的一种,而还有很多的远程连接工具并没有上传下载的功能,这个时候就需要依赖于lrzsz这个软件了。
对于lrzsz的安装,我们需要通过第三种软件安装方式yum来进行安装。这里,我们先对yum做一个简单介绍。
Yum: (Yellow dog Updater,Modified),是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。
安装lrzsz的步骤如下:
1). 搜索lrzsz安装包
yum list lrzsz
2). 在线安装lrzsz
yum install lrzsz.x86_64
3). 测试
在命令行中输入 rz , 就会自动打开一个文件选择的窗口,然后选择要上传的文件。

yum拓展知识:
1). 如果在不更改软件来源的情况下,是需要联网才能使用yum的,那么我们安装的软件是从哪儿下载的呢,这里就涉及到一个概念: yum源。
2). 我们可以通过一个指令,来检查当前的yum源
image-20210816192200749 从图中,我们可以看到我们安装的 CentOS7 采用的是网易的163yum源。
3). 网络 yum 源配置文件位于 /etc/yum.repos.d/ 目录下,文件扩展名为"*.repo"
image-20210816193941094 可以看到,该目录下有 7 个 yum 配置文件,通常情况下 CentOS-Base.repo 文件生效。
4). 添加阿里云yum源
A. 先通过
yum install wget,安装wget命令 B. 备份默认的网易163的yum源,执行指令 :
切换目录: cd /etc/yum.repos.d/
创建备份目录: mkdir bak
移动现有的yum源文件到bak: mv *.repo bak/
C. 下载阿里云的yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
D. 执行命令,重新生成cache
yum clean all
yum makecache
E. 再次查看yum源
image-20210816214230609 之后,我们通过yum命令安装软件,就是从阿里云下载的。
2. 项目部署(上线)
之前我们讲解Linux操作系统时,就提到,我们服务端开发工程师学习Linux系统的目的就是将来我们开发的项目绝大部分情况下都需要部署在Linux系统中。
那么在本章节,我们将通过两种方式,来演示项目部署(部署苍穹外卖项目),分别:手动部署项目 和 基于jenkins自动部署。
部署(上线)方案
1.直接自己打包自己扔到生产环境,然后重启(mini公司)
2.公司自研的发布系统,由测试人员进入编译、打包、发布(稍微有点实力的公司、大厂);
3.Jenkins发布
4.其他devops平台(阿里云效平台、禅道、TPAD、k8s、宝塔)
2.1 手动部署项目
部署后端
1). 项目需要的软件安装
比如:mysql、redis、JDK等
2).修改项目配置文件
新增生产环境配置文件application-prod.yml,并将application.yml中的active改为prod

3).将项目打包
执行package或者install

4). 将jar包上传到Linux服务器
将打好的jar包上传至Linux服务器的 /root/app 目录下。 先执行指令创建app目录。

5).启动项目
执行命令:
java -jar sky-server-1.0-SNAPSHOT.jar可以看到当前启用的配置文件为prod,以及启动成功标志(标红线部分)

6).访问测试
首先保证需要访问的端口是通的

7). 后台运行项目
当前这个苍穹外面后端工程我们已经部署成功了,并且我们也可以访问项目了。但是这个工程目前是存在问题的,就是当前我们项目启动的这个窗口被霸屏占用了,如果我们把这个窗口关闭掉(或ctrl+c),当前服务也就访问不到了,我们可以试一下。

目前程序运行的问题:
A. 线上程序不会采用控制台霸屏的形式运行程序,而是将程序在后台运行
B. 线上程序不会将日志输出到控制台,而是输出到日志文件,方便运维查阅信息
后台运行程序:
要想让我们部署的项目进行后台运行,这个时候我们需要使用到linux中的一个命令 nohup ,接下来,就来介绍一下nohup命令。
nohup命令:英文全称 no hang up(不挂起),用于不挂断地运行指定命令,退出终端不会影响程序的运行
语法格式: nohup Command [ Arg … ] [&]
参数说明:
Command:要执行的命令
Arg:一些参数,可以指定输出文件
&:让命令在后台运行
举例:
nohup java -jar boot工程.jar &> hello.log &
上述指令的含义为: 后台运行 java -jar 命令,并将日志输出到hello.log文件
那么经过上面的介绍,我们可以推测中,我们要想让当前部署的项目后台运行,就可以使用下面的指令:
nohup java -jar sky-server-1.0-SNAPSHOT.jar &> sky.log &我们可以通过ps指令,查看到系统的进程。

一般还有去看下启动日志,看下是否正常
tail -f sky.log接下来,我们再次访问我们的项目,来看看服务是否可用。

也可以用tail命令查看系统实时日志:
tail -f sky.log
8). 停止SpringBoot项目

9).最佳实践
用脚本的方式启动项目,将资料里面的service.sh上传到jar包所在目录,并赋予执行权限
chmod +x service.sh
启动项目用命令:
./service.sh restart
用tail命令去servcie.sh配置的日志目录下查看启动日志

可以看出,当前启动日志在当前目录下的logs文件夹下的run.out
tail -f logs/run.out注意:每次手动发版上传jar包前先备份,以便当前发版失败好快速回滚,一般按日期备份,比如:
cp sky-server-1.0-SNAPSHOT.jar sky-server-1.0-SNAPSHOT.jar.20230905

启动项目报如下错误解决方案:
Caused by: java.lang.NullPointerException: null
at java.desktop/sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1262)
at java.desktop/sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:225)
依次执行下面两个命令:
yum install fontconfig
fc-cache
然后重启java服务
部署前端
将前端静态资源文件打包上传到目录 /usr/share/nginx/html

解压缩sky.zip
cd /usr/share/nginx/html
unzip sky.zip 修改nginx.conf配置文件
cd /etc/nginx
#先备份,以防修改错误方便回滚
cp nginx.conf nginx.conf.bak
vim nginx.conf新增反向代理部分:
# 反向代理,处理管理端发送的请求
location /api/ {
proxy_pass http://localhost:8080/admin/;
}

然后重新加载nginx配置使其生效
nginx -s reload打开前端页面,测试系统,nginx配置的默认端口是80(如果打不开,注意核对在云服务器管理端安全组开放80端口),直接在浏览器中输入IP即可


2.2 基于jenkins自动部署
基于人工部署操作步骤如下:
1). 在本地打可运行的jar包
2). 上传代码到服务器
3). 然后启动项目
有没有办法能自动完成这个操作?
2.2.1 介绍

2.2.2 安装jenkins
1). jenkins安装包下载
走国外官网很慢,可在国内清华的镜像上下载,地址:https://mirrors.tuna.tsinghua.edu.cn/

点击war,下载对应的版本,可选最新版

或者资料里面提供已经下载好的jenkins.war包
2).上传jenkins.war到服务器/root目录下(非必须此目录)
3). 启动jenkins
cd root
#注意端口冲突 jenkins默认是8080端口,可以指定端口启动
java -jar jenkins.war --httpPort=8081如果报错:

原因:缺少字体
解决方案:
yum install fontconfig然后再重新执行命令:java -jar jenkins
启动过程中会提示Jenkins的root用户的默认密码在哪里

3). 访问jenkins
IP:8081,即可访问Jenkins,第一次初始化比较耗时需要耐心等待

从控制台复制密码填入
最好选择自定义插件,推荐的插件太多,下载慢

点击“无”,去掉默认勾选的插件

点击安装,然后继续下一步
可以直接选择使用管理员账户继续,也可以创建一个账户:
建议使用admin账户继续,登陆后修改一下密码即可

安装必要的插件

安装git插件

安装ssh插件

安装maven插件

2.2.3 Git安装
1). Git软件安装
通过yum命令在线安装git,执行如下指令:
yum list git 列出git安装包
yum install git 在线安装git通过上述指令,安装好git之后,我们就可以通过 git --version去验证git的环境。

2.2.4 Maven安装
由于我们的工程是maven工程,我们要想进行项目的编译打包,需要用到maven的指令,所以需要安装maven。具体操作步骤如下:
1). 上传资料中提供的maven的安装包
通过rz指令上传课程资料中的maven安装包


2). 解压maven安装包到/usr/local目录
tar -zxvf apache-maven-3.5.4-bin.tar.gz -C /usr/local
3). 在/etc/profile配置文件中配置环境变量
vim /etc/profile
修改配置文件,进入到命令模式,按G切换到最后一行,按a/i/o进入插入模式,然后在最后加入如下内容 :
export MAVEN_HOME=/usr/local/apache-maven-3.5.4
export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH
然后按ESC进入到命令模式,输入 :wq 保存并退出
要想让配置的环境变量生效,还需要执行如下指令:
source /etc/profile
4). 修改maven的settings.xml配置文件,配置本地仓库地址
A. 切换目录
cd /usr/local/apache-maven-3.5.4/confB. 编辑settings.xml配置文件
vim settings.xml在其中增加如下配置,配置本地c仓库地址:
<localRepository>/usr/local/repo</localRepository>
并在settings.xml中的
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror> 
2.2.5 配置jenkins
1.配置jdk git maven




2.配置git凭据



3).配置远程服务器



2.26 创建发布任务


打包跳过test:

post-steps选择:Send files or execute commands over SSH

点击build now开始部署




