【Linux实用篇】项目部署 基于Shell脚本自动部署

news2024/11/19 22:43:18

目录

1. 项目部署

1.1 手动部署项目

1.2 基于Shell脚本自动部署

1.2.1 介绍

1.2.2 推送代码到远程

1.2.3 Git操作

1.2.4 Maven安装

1.2.5 Shell脚本准备

1.2.6 Linux权限

1.2.7 授权并执行脚本

1.2.8 设置静态IP


1. 项目部署

之前我们讲解Linux操作系统时,就提到,我们服务端开发工程师学习Linux系统的目的就是将来我们开发的项目绝大部分情况下都需要部署在Linux系统中。那么在本章节,我们将通过两种方式,来演示项目部署,分别是:手动部署项目 和 基于shell脚本自动部署。

1.1 手动部署项目

1). 在IDEA中开发SpringBoot项目并打成jar包

执行package指令,进行打包操作,将当前的springboot项目,打成一个jar包。

2). 将jar包上传到Linux服务器

通过 rz 指令,将打好的jar包上传至Linux服务器的 /usr/local/app 目录下。 先执行指令创建app目录。

A. 在/usr/local下创建目录app
mkdir /usr/local/app
​
B. 切换到app目录下
cd /usr/local/app
​
C. 执行指令,进行jar包上传
rz

此时这个jar包就上传到 /usr/local/app 目录了。

3). 启动SpringBoot程序

由于我们的项目已经打成jar包上传上来到Linux服务器,我们只需要运行这个jar包项目就启动起来了,所以只需要执行如下指令即可:

java -jar helloworld-1.0-SNAPSHOT.jar

==注意: 由于前面安装的Tomcat在启动时,会占用端口号8080,而当前springboot项目我们没有配置端口号,默认也是8080,所以我们要想启动springboot项目,需要把之前运行的Tomcat停止掉。==

4). 检查防火墙,确保8080端口对外开放,访问SpringBoot项目

firewall-cmd --zone=public --list-ports

如果防火墙没有放开8080端口,还需要放开对应的端口号,执行如下指令:

firewall-cmd --zone=public --add-port=8080/tcp --permanent

5). 访问测试

http://192.168.138.130:8080/hello

6). 后台运行项目

当前这个demo工程我们已经部署成功了,并且我们也可以访问项目了。但是这个工程目前是存在问题的,就是当前我们项目启动的这个窗口被霸屏占用了,如果我们把这个窗口关闭掉(或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 helloworld-1.0-SNAPSHOT.jar &> hello.log &

这样的话,我们的项目就已经启动成功了,我们可以通过ps指令,查看到系统的进程。

接下来,我们再次访问我们的项目,来看看服务是否可用。

7). 停止SpringBoot项目

1.2 基于Shell脚本自动部署

1.2.1 介绍

前面介绍的项目部署是手动部署,也就是部署过程中的每一步操作都需要我们手动操作。接下来,我们需要再讲解一下项目的自动部署,从而来简化项目部署的操作,那么我们先来整体上了解一下项目自动部署的流程及操作步骤。

操作步骤如下:

1). 在Gitee上创建远程仓库,并将本地的项目代码推送到远程仓库中

2). 在Linux中安装Git,克隆代码

3). 在Linux中安装maven

4). 编写Shell脚本(拉取代码、编译、打包、启动)

5). 为用户授予执行Shell脚本的权限

6). 执行Shell脚本

1.2.2 推送代码到远程

这部分操作,大家只需要参考之前讲解的Git,来完成helloworld工程代码推送即可。

A. 创建远程仓库

B. 将idea中的代码提交并推送到远程仓库

1.2.3 Git操作

1). Git软件安装

通过yum命令在线安装git,执行如下指令:

yum list git            列出git安装包
yum install git         在线安装git

通过上述指令,安装好git之后,我们就可以通过 git --version去验证git的环境。

2). Git克隆代码

cd /usr/local/
git clone https://gitee.com/ChuanZhiBoKe/helloworld.git

1.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/conf

B. 编辑settings.xml配置文件

vim settings.xml

在其中增加如下配置,配置本地仓库地址:

<localRepository>/usr/local/repo</localRepository>

并在settings.xml中的<mirrors>标签中,配置阿里云的私服(==选做==):

<mirror> 
    <id>alimaven</id> 
    <mirrorOf>central</mirrorOf> 
    <name>aliyun maven</name> 
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror> 

1.2.5 Shell脚本准备

Shell脚本(shell script),是一种Linux系统中的脚本程序。使用Shell脚本编程跟 JavaScript、Java编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。

对于Shell脚本编写不作为本课程重点内容,直接使用课程资料中提供的脚本文件bootStart.sh即可。

在/usr/local/目录下创建一个目录 sh(mkdir sh),并将shell脚本上传到该目录下。或者直接在sh目录下创建一个脚本bootStart.sh,然后将资料中的bootStart.sh文件打开,内容拷贝过来即可。

脚本解读:

1.2.6 Linux权限

前面我们已经把Shell脚本准备好了,但是Shell脚本要想正常的执行,还需要给Shell脚本分配执行权限。 由于linux系统是一个多用户的操作系统,并且针对每一个用户,Linux会严格的控制操作权限。接下来,我们就需要介绍一下Linux系统的权限控制。

1). ==chmod==(英文全拼:change mode)命令是控制用户对文件的权限的命令

2). Linux中的权限分为三种 :读(r)、写(w)、执行(x)

3). Linux文件权限分为三级 : 文件所有者(Owner)、用户组(Group)、其它用户(Other Users)

4). 只有文件的所有者和超级用户可以修改文件或目录的权限

5). 要执行Shell脚本需要有对此脚本文件的执行权限(x),如果没有则不能执行

Linux系统中权限描述如下:

解析当前脚本的权限情况:

chmod命令可以使用八进制数来指定权限(0 - 代表无 , 1 - 执行x , 2 - 写w , 4 - 读r):

权限rwx
7读 + 写 + 执行rwx
6读 + 写rw-
5读 + 执行r-x
4只读r--
3写 + 执行-wx
2只写-w-
1只执行--x
0---

举例:

chmod 777 bootStart.sh   为所有用户授予读、写、执行权限
chmod 755 bootStart.sh   为文件拥有者授予读、写、执行权限,同组用户和其他用户授予读、执行权限
chmod 210 bootStart.sh   为文件拥有者授予写权限,同组用户授予执行权限,其他用户没有任何权限

==注意:==

三个数字分别代表不同用户的权限

  • 第1位表示文件拥有者的权限

  • 第2位表示同组用户的权限

  • 第3位表示其他用户的权限

1.2.7 授权并执行脚本

在测试阶段,我们可以给所有的人都赋予执行该shell脚本的权限。所以可以执行如下指令:

chmod 777 bootStart.sh

权限解读:

A. 第一个7,代表当前文件所有者root用户,对该文件具有读写执行权限;

B. 第二个7,代表当前文件所有者所属组的用户,对该文件具有读写执行权限;

B. 第三个7,代表其他用户,对该文件具有读写执行权限;

执行该shell脚本:

==注意: 在执行maven指令进行打包时,第一次执行可能会耗时比较长,因为在进行maven工程的打包时,需要到中央仓库下载工程依赖的jar包和插件(可以在settings.xml中配置阿里云私服加速下载)。==

启动完成之后, 我们可以查看java进程:

访问项目:

1.2.8 设置静态IP

我们目前安装的Linux操作系统,安装完毕之后并没有配置IP地址,默认IP地址是动态获取的,那如果我们使用该Linux服务器部署项目,IP动态获取的话,也就意味着,IP地址可能会发生变动,那我们访问项目的话就会非常繁琐,所以作为服务器,我们一般还需要把IP地址设置为静态的。

1). 设置静态IP

设置静态ip,我们就需要修改 /etc/sysconfig/network-scripts/ifcfg-ens33 配置文件,内容如下:

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
IPADDR="192.168.138.100"        # 设置的静态IP地址
NETMASK="255.255.255.0"         # 子网掩码
GATEWAY="192.168.138.2"         # 网关地址
DNS1="192.168.138.2"            # DNS服务器
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=afd0baa3-8bf4-4e26-8d20-5bc426b75fd6
DEVICE=ens33
ONBOOT=yes
ZONE=public

上述我们所设置的网段为138,并不是随意指定的,需要和我们虚拟机中的虚拟网络编辑器中的NAT模式配置的网关保持一致。

2). 重启网络服务

ip地址修改完毕之后,需要重启网络服务,执行如下指令:

systemctl restart network

==注意:重启完网络服务后ip地址已经发生了改变,此时FinalShell已经连接不上Linux系统,需要创建一个新连接才能连接到Linux。==

再次连接上Linux之后,我们再次查看IP地址,就可以看到我们所设置的静态IP:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1389602.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于拓扑图与领导跟随法的编队控制算法

matlab2020可运行 https://download.csdn.net/download/ljjjjjjjjjjj/88750436

导航与定位技术已成为移动机器人的核心技术之一

随着移动机器人技术的不断发展和应用领域的扩大&#xff0c;导航与定位技术已成为移动机器人的核心技术之一。本文将介绍移动机器人导航与定位技术的发展现状、技术前沿和面临的挑战。 ​ 一、导航与定位技术的发展现状 移动机器人的导航与定位技术是实现自主移动的关键。目前…

Vscode——运行java项目

1、安装JDK&#xff08;已安装请忽略&#xff09; 教程&#xff1a;https://blog.csdn.net/qq812457115/article/details/117451011 验证是否已安装&#xff0c;命令符输入 java -version2、安装Maven&#xff08;已安装请忽略&#xff09; 教程&#xff1a;https://blog.csdn…

LeetCode刷题---反转链表II

LeetCode官方给出的解题思路 在需要反转的区间里&#xff0c;每遍历到一个节点&#xff0c;让这个新节点来到反转部分的起始位置。 使用了三指针的思想。 定义三个节点: curr&#xff1a;指向待反转区域的第一个节点 left&#xff1b; next&#xff1a;永远指向 curr 的下一个节…

怎样实现安全便捷的网间数据安全交换?

数据安全交换是指在数据传输过程中采取一系列措施来保护数据的完整性、机密性和可用性。网间数据安全交换&#xff0c;则是需要进行跨网络、跨网段甚至跨组织地进行数据交互&#xff0c;对于数据的传输要求会更高。 大部分企业都是通过网闸、DMZ区、VLAN、双网云桌面等方式实现…

电脑软件:沙盒 Sandboxie 快速上手使用教程

目录 一、软件简介 二、软件功能 三、安装步骤 四、 软件使用 一、软件简介 沙盘Sandboxie中文版是一款非常好用的系统安全工具软件&#xff0c;沙盘Sandboxie中文版能够很好的进行安全测试&#xff0c;拥有一个安全的环境&#xff0c;你不用担心自己的浏览记录被曝光&am…

用 YAML 文件配置 CI/CD 管道

MSBuild 参数: 在使用 MSBuild 命令行生成打包项目(就像在 Visual Studio 中使用向导生成项目一样)之前,生成过程可以通过编辑 Package.appxmanifest 文件中 Package 元素的 Version 属性,来对生成的 MSIX 包进行版本控制。 在 Azure Pipelines 中,可以使用某个表达式来…

【第七在线】打破传统束缚:智能商品计划助力服装企业创新发展

在当今快速变化的市场环境中&#xff0c;服装企业面临着前所未有的挑战和机遇。传统的商品管理模式已无法满足现代市场的需求&#xff0c;企业需要寻求创新的发展路径。智能商品计划作为数字化转型的核心要素&#xff0c;正在为服装企业提供强大的助力&#xff0c;帮助企业打破…

linux基础学习(2):磁盘管理、分区、格式化

1.一些基本概念 一块磁盘从加入到可使用&#xff0c;需要经过3个阶段&#xff1a;分区-格式化-挂载。 1.1分区方式 linux有2种分区方式&#xff1a; &#xff08;1&#xff09;mbr&#xff1a;最大支持2.1T硬盘&#xff0c;最多支持4个分区。这4个分区可以全部为主分区&…

基于位的权限系统

基于位的权限系统是一种利用二进制位运算进行权限管理的技术。在这种系统中&#xff0c;不同的权限被编码为2的幂次方 (例如1、2、4、8等)&#xff0c;每个权限对应一个独立的二进制位&#xff08;可想而知运算速度是非常快的&#xff09;。通过将这些权限值组合在一起形成一个…

[ceph] ceph之分布式存储

分布式存储的类型 ●块存储&#xff08;例如硬盘&#xff0c;一般是一个存储被一个服务器挂载使用&#xff0c;适用于容器或虚拟机存储卷分配、日志存储、文件存储&#xff09; 就是一个裸设备&#xff0c;用于提供没有被组织过的存储空间&#xff0c;底层以分块的方式来存储数…

04-《人月神话》有礼貌的固执-中译本纠错及联想

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 2001年&#xff0c;我们翻译《人月神话》的时候&#xff0c;由于水平有限&#xff0c;译文中存在不少错误。 这些年&#xff0c;随着阅历的增长&#xff0c;在重读的时候偶尔也会有“…

Python GUI库大汇总

所有程序都是基于命令行的&#xff0c;这些程序可能只有一些“专业”的计算机人士才会使用。例如前面编写的五子棋等程序&#xff0c;恐怕只有程序员自己才愿意玩这么“糟糕”的游戏&#xff0c;很少有最终用户愿意对着黑乎乎的命令行界面敲命令。 相反&#xff0c;如果为程序…

Kafka 的 Consumer Group 解读

作为一份笔记&#xff0c;本文再次梳理一下 Kafka 的 Consumer Group。我们知道&#xff0c;一个 Topic 往往会有多个 Partition&#xff0c;一条消息只会被写到一个 Kafka 的 Partition 中&#xff0c;那 Consumer 是怎么消费 Message 的呢&#xff1f; Consumer Group 又从中…

Linux用户提权

新建用户 用root账户修改文件&#xff0c;添加信任用户 使用sudo提权&#xff0c;可以使用 **root删除新建账户**

写点东西《最佳 Web 框架不存在 》

写点东西《&#x1f947;最佳 Web 框架不存在 &#x1f6ab;》 TLDR&#xff1b;您选择的 Web 应用程序框架并不重要。嗯&#xff0c;它很重要&#xff0c;但并不像其他人希望您相信的那样重要。 2024 年存在如此多的库和框架&#xff0c;而且最好的库和框架仍然备受争议&…

Java_线程池

一、线程池 4.1 线程池概述 线程池就是一个可以复用线程的技术。 要理解什么是线程复用技术&#xff0c;我们先得看一下不使用线程池会有什么问题&#xff0c;理解了这些问题之后&#xff0c;我们在解释线程复用同学们就好理解了。 假设&#xff1a;用户每次发起一个请求给…

硬盘重新分区怎么恢复分区之前的文件?

分区是常见的故障&#xff0c;通常由多种原因引起。一方面&#xff0c;硬盘老化或者受到损坏可能会导致分区表出现问题&#xff1b;另一方面&#xff0c;用户误操作&#xff0c;如格式化或分区不当&#xff0c;也可能导致分区丢失。针对此问题&#xff0c;解决方法包括使用专业…

无人超市系统的设计与实现:从需求分析到实际应用

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

在vue3+vite中使用svg-sprite-loader,antdv修改菜单icon

1. 安装 npm install vite-plugin-svg-icons -D 2. 在vite.config.js的plugins中添加配置项 import { createSvgIconsPlugin } from vite-plugin-svg-icons;createSvgIconsPlugin({iconDirs: [resolve(process.cwd(), src/components/svgIcon/svg)], // icon存放的目录&…