需求是这样的,我个人要做一个项目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 配置基本如下
然后我就开始尝试构建了。。。。。
在三个小时后,我打消了用 Jenkins 构建的念头,原因如下:
在经过检查系统资源之后,我发现我的单核1G内存的 vps ,实在是难以支撑 Jenkins + Gradle 同时运行,系统资源直接爆表。
后来了解了一下发现,一般来说不会在同一台服务器上既 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 项目真的很吃资源。。。。