如何实现项目代码的自动拉取、打包并部署?

1. 概述

如果是个人开发者,并且您只有一个项目或者两个项目,而且项目是单体项目,那么该方式会很适合您。通过一系列步骤可以很好的解放您的双手。经过配置后您只需要在服务器执行一个脚本即可。

2. 配置

  • 一台Linux centos的云服务器。(如果您是为了学习需求,那么可以去腾讯云白嫖一个月的服务器使用,也可以自己搭建虚拟机,是mac可以直接进行下面的步骤)。

  • 云服务器配置了MySQL、Redis环境。

    这里强烈建议使用docker容器去使用MySQL和Redis,非常爽。

  • 一个个人可以运行的单体项目。

  • maven环境。

  • Git

    直接使用yum一键安装。yum install git

  • java11环境

    直接使用yum一键安装。yum install java-11-openjdk.x86_64

  • xshell

    可以去官网获取教育版,免费。

  • xftp

    可以去官网获取教育版,免费。

  • vim的基本使用。

  • git clone下自己的项目。

3. 安装docker

**您也可以直接在您的服务器上面安装MySQL、Redis,此步骤是可选。**个人建议使用docker,非常方便,省去很多配置,开箱即用。

docker的安装也非常的简单,下面给出官方提供的步骤,只需要一条一条执行命令即可完成按照。

shell命令:

shell 复制代码
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun # 耐心等待
systemctl start docker

注意:请勿重复安装docker!

设置docker镜像加速**(可选)**

前往阿里云控制台获取您的专属加速地址:阿里云docker镜像获取

四步命令执行:

第一步一般安装docker是会默认创建,您需要检查以下是否已经创建,在觉得是否需要执行第一步。注意要换成自己的id。

shell 复制代码
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://{YourId}.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker

3. 在docker中使用MySQL与Redis

3.1 安装MySQL

您可以去docker hub上面选择合适的版本:mysql docker hub

我这里使用的是8.0.12。

shell命令:

shell 复制代码
# 拉取镜像
docker pull mysql:8.0.12
# 创建映射目录
mkdir -p /soft/mysql/
mkdir -p /soft/mysql/data/
mkdir -p /soft/mysql/logs/
mkdir -p /soft/mysql/conf/
# 拉取成功后运行
docker run --restart=always --privileged=true  \
-v /soft/mysql/data/:/var/lib/mysql \
-v /soft/mysql/logs/:/var/log/mysql \
-v /soft/mysql/conf/:/etc/mysql \
-v /soft/mysql/my.cnf:/etc/mysql/my.cnf  \
-p 3306:3306 --name mysql \
-e MYSQL_ROOT_PASSWORD=root -d mysql:8.0.12
# 可以使用docker ps是否运行成功
# 设置远程可以登录(可选)
# 进入容器
docker exec -it mysql bash
# 登录mysql
mysql -uroot -p
输入密码

我的应用和服务都在一台服务器上面所以就没有设置远程连接,有需求的朋友可以在登录mysql后修改成远程连接。

可选:登录mysql后设置远程登录用户(我个人直接在服务器上使用的本地root用户)

shell 复制代码
#添加远程登录用户
CREATE USER 'admin'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%';
flush privileges;

参数说明请看下面redis安装。

3.2 安装Redis

Redis docker hub

我是使用的tag是latest,最新版的Redis。

下载redis.conf,可以在官方仓库中下载 redis github

shell 复制代码
# 拉取镜像
docker pull redis:latest
mkdir -p /soft/redis/
mkdri -p /soft/redis/data/
# 将下载redis.conf上传到服务器的/soft/redis/目录下
# 运行容器
docker run -d --privileged=true -p 6379:6379 --restart always -v /soft/redis/redis.conf:/etc/redis/redis.conf -v /soft/redis/data:/data --name redis redis redis-server /etc/redis/redis.conf --appendonly yes
# 使用docker ps命令查看安装成功后测试功能
docker exec -it redis bash
redis-cli
ping
# 如果显示pong则表示容器运行成功。

redis.conf配置文件中需要修改的内容:

shell 复制代码
# bind 127.0.0.1 注掉

protected-mode no # yes改为no

注意:每一行配置的最后不要额外添加空格!

参数说明:

  • docker run: 运行 Docker 容器的命令。
  • -d: 表示以后台(守护进程)模式运行容器。
  • --privileged=true: 以特权(privileged)模式运行容器。这授予容器更多的权限,通常在需要执行某些系统级操作时使用。在这种情况下,可能是因为 Redis 可能需要进行一些特权操作。
  • -p 6379:6379: 这是端口映射选项,将容器内的 Redis 服务端口 6379 映射到主机的端口 6379。这允许从主机以及外部网络访问 Redis 服务。
  • --restart always: 设置容器在退出时自动重启。无论出于什么原因容器停止,Docker 会自动重新启动它。
  • -v /soft/redis/redis.conf:/etc/redis/redis.conf: 这是将主机上的 Redis 配置文件 /soft/redis/redis.conf 映射到容器内的 /etc/redis/redis.conf 文件。这允许你在主机上修改配置文件并将其传递给容器,以便 Redis 使用自定义配置。
  • -v /soft/redis/data:/data: 这是将主机上的 Redis 数据目录 /soft/redis/data 映射到容器内的 /data 目录。这是为了持久化 Redis 数据,以便数据在容器重新启动时不会丢失。
  • --name redis: 为容器指定一个名称,这里将容器命名为 "redis"。
  • redis: 这是所使用的 Redis 镜像名称。
  • redis-server /etc/redis/redis.conf: 这是容器启动命令,它告诉 Redis 在容器内使用指定的配置文件 /etc/redis/redis.conf 运行。
  • --appendonly yes: 这是 Redis 配置选项,用于开启 AOF(Append-Only File)持久化模式,它会将每个写操作追加到文件,以确保数据的持久性。这是 Redis 配置的一部分,以确保 Redis 在容器内使用指定的配置。

可以按照自己的需要修改配置。

4. 安装Maven

首先去官网下载对应的压缩包。官网下载地址

下载完成后使用xftp7上传到自己服务器的/soft目录下。(个人习惯将软件安装到soft目录下)(soft目录是自己创建的,请先创建这个目录)

上传完成后进行解压:tar -zxvf 压缩包名称,工作目录要在/soft

解压完成后进入解压缩后的目录,在进入conf目录去编辑setting.xml设置加速。

这里设置本地仓库地址:

xml 复制代码
<localRepository>/root/maven_repo</localRepository>

注意:这个目录必须在您的服务器上面存在!

设置镜像:

xml 复制代码
<mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>central</mirrorOf>
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

配置环境变量

我个人喜欢在/etc/profile.d/下管理环境变量。因为刷新环境变量时会执行source /etc/profile,而profile中有一段脚本会扫描profild.d下的所有sh文件,并加以配置,所以我在profile.d下创建my_env.sh管理自己安装的一些软件的环境变量。

my_env.sh内容:(这里使用了vim创建my_env.sh文件并追加下面的内容)

sh 复制代码
export MAVEN_HOME=/opt/apache-maven-3.9.5(您自己的Maven地址)
export PATH=$PATH:$MAVEN_HOME/bin

保存退出后执行source /etc/profile

在shell上输入mvn -version查看是否安装成功。

profile中的一段脚本:

配置Maven可以指定不同的配置文件去打包:

笔者项目中的文件有生产环境的文件和开发用的文件:

在application.properties中指定的是dev配置文件,所以我想在打包时就可以指定使用哪一个文件,这样就无需自己手动更改了。

首先在pom.xml中加入如下内容:

xml 复制代码
<profiles>
        <profile>
            <!-- 开发环境 -->
            <id>dev</id>
            <properties>
                <profileActive>dev</profileActive>
            </properties>
            <!-- 默认环境 -->
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <!-- 生产环境 -->
            <id>prod</id>
            <properties>
                <profileActive>prod</profileActive>
            </properties>
        </profile>
</profiles>
<build>
        <finalName>${project.artifactId}-${profileActive}</finalName>
</build>

在application.properties中:

properties 复制代码
spring.profiles.active=@profileActive@

进行这样的配置后就可以指定配置文件进行打包,非常方便。

使用mvn -f 你的项目目录/pom.xml package -P prod可以指定prod的配置文件,如果在项目目录下,可以省略-f

5. 功能实现

对于简单的单体项目,部署可以分为以下步骤:

1.从GitHub上拉取代码。

2.使用Maven进行打包。

3.删除旧的项目进程。

4.运行打包后的jar包。

脚本位置在:/root/project/deploy.sh

说明:项目目录是apply-room-record,打包工作目录是applyRoomRecord请根据个人的环境进行修改,包括jar包名称、目录、以及文件位置。

shell 复制代码
#!/bin/bash
appPid=$(ps -ef | grep apply-room-record.jar | grep -v grep | awk '{print $2}')
kill -9 ${appPid}
echo 'kill old process:'${appPid}
echo '---拉取项目最新代码---'
cd /root/project/apply-room-record/
git pull origin master
echo '---项目更新完成---'
mvn clean
echo '--mvn clean执行完成---'
mvn package -P prod
echo '---打包完成---'
echo '---删除旧的jar包---'
rm -rf ../applyRoomRecord/apply-room-record.jar ../applyRoomRecord/nohup.out
echo '---拷贝jar包到工作目录---'
cp ./target/apply-room-record.jar ../applyRoomRecord/
echo '---进入工作目录---'
cd ../applyRoomRecord/
echo '---开始部署程序---'
nohup java -jar apply-room-record.jar &
echo '---执行成功,日志输出文件:nohup.out---'
echo '---部署成功---'

解释获取PID的命令,实际上就是grep的应用,首先ps -ef 命令是获取所有的进程信息,形式如下

|是一个管道符号,grep是过滤含有某些字符的数据,| grep /home/projects/apply-room-record/target/apply-room-record-prod.jar就是指过滤含有/home/projects/apply-room-record/target/apply-room-record-prod.jar字符的数据,

现在还需要过滤掉箭头所指的那一条数据,该条数据里面含有grep,所以在前面结果的基础上面继续进行过滤,| grep -v grep-v命令是指取相反的结果,也就是不含有grep字符串的数据,这样我没就能正确获取到自己想要的数据了,然后在以上结果的基础上获取数据的第二行数据 | awk '{print $2}')并打印。

这样就拿到了PID。

注意:脚本中的一些目录和位置请按照自己的实际情况进行配置!

如果是第一次使用,建议先git clone下您的项目,在项目中执行mvn package命令安装新依赖。

6. 一些问题

6.1 Git

我们连接过程可能有网路问题,偶尔出现失败的情况,我们可以通过在自己服务器设置代理解决,具体方法:

1.GitHub设置代理项目一键使用,具体步骤查看下方的readme。超级简单方便。

2.安装成功后测试。

相关推荐
suweijie7683 小时前
SpringCloudAlibaba | Sentinel从基础到进阶
java·大数据·sentinel
公贵买其鹿4 小时前
List深拷贝后,数据还是被串改
java
xlsw_7 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
神仙别闹8 小时前
基于java的改良版超级玛丽小游戏
java
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭8 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
暮湫8 小时前
泛型(2)
java
超爱吃士力架8 小时前
邀请逻辑
java·linux·后端
南宫生8 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石9 小时前
12/21java基础
java
李小白669 小时前
Spring MVC(上)
java·spring·mvc