美文网首页
编写脚本自动部署gradle项目到服务器

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

作者: beetlebum | 来源:发表于2018-10-15 13:06 被阅读0次

    需求是这样的,我个人要做一个项目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项目到服务器

          本文链接:https://www.haomeiwen.com/subject/svkfzftx.html