编写脚本自动部署gradle项目到服务器

需求是这样的,我个人要做一个项目demo,是一个 gradle 项目,用到了 kotlin 和 spring-webflux。这个demo需要用到某个 API,API key 是免费的,但是必须绑定一个域名或者 IP 地址,我个人有租一个特别低配的 vps,因此要做的事情就是将代码build之后部署到服务器并且启动。本地应该是没办法调试 API 的了。

当产生这么一个需求的时候,我第一反应是用 Jenkins 来自动构建,然后构建完成后启动,因为我的代码托管到了我 gitlab 上的私有仓库中。于是我真的就这么做了。

因为 webflux 默认是用 Netty 运行的,可以生成一个 bootJar 的 Jar 包来直接用 Java 运行,不用丢到其他容器中,所以为了能够在构建时启动和杀死项目进程,我写了两个简单的脚本。因为脚本被我改过了所以不一定对,但是大概内容如下。

startup.sh

dir = $(pwd)
jar = ${dir}/build/libs/dota-zero-rest-service*.jar
nohup java -jar ${jar} >/data/output.file 2>&1 &
echo $! > /data/dotazero.pid

shutdown.sh

pid=$(cat /data/dotazero.pid)
kill -9 $pid

所做的事情其实就是,jenkins 用户在 gradle build 之后,先杀死原有的项目进程,然后获取 pwd,找到 build 出来的 jar 包,然后后台运行它。

Jenkins 配置基本如下


image.png

然后我就开始尝试构建了。。。。。

在三个小时后,我打消了用 Jenkins 构建的念头,原因如下:


image.png

在经过检查系统资源之后,我发现我的单核1G内存的 vps ,实在是难以支撑 Jenkins + Gradle 同时运行,系统资源直接爆表。


image.png

后来了解了一下发现,一般来说不会在同一台服务器上既 build 又运行服务的。。

既然在服务器上构建是没法继续下去了,那么我换一种思路,在本地 build,然后传到服务器上,再启动服务。

我是在 win10 上开发的,win10 支持 ssh 了,这是好事~

于是我生成了机器的 ssh keygen

ssh-keygen -t rsa

把我的 PC 的 ssh keygen 传给了服务器

ssh-copy-id /.ssh/id_rsa.pub root@******

然后我在项目中写了一个简单的批处理。

deploy.bat

call gradlew.bat build

scp build/libs/dota-zero-rest-service-1.0.0.jar root@******:/data

ssh root@******* "/data/dota-zero-shutdown.sh" 

ssh root@******* "/data/dota-zero-startup.sh" 

服务器上脚本也改了
startup.sh

jar = /data/dota-zero-rest-service*.jar
nohup java -jar ${jar} >/data/output.file 2>&1 &
echo $! > /data/dotazero.pid

执行批处理,总算能满足我要的需求了。。

这是一件很小的事情,总而言之是让我深刻了解到,build 项目真的很吃资源。。。。

你可能感兴趣的:(编写脚本自动部署gradle项目到服务器)