需求是這樣的,我個人要做一個項目demo互订,是一個 gradle 項目叠赦,用到了 kotlin 和 spring-webflux。這個demo需要用到某個 API牲蜀,API key 是免費的笆制,但是必須綁定一個域名或者 IP 地址,我個人有租一個特別低配的 vps涣达,因此要做的事情就是將代碼build之后部署到服務器并且啟動在辆。本地應該是沒辦法調(diào)試 API 的了证薇。
當產(chǎn)生這么一個需求的時候,我第一反應是用 Jenkins 來自動構建匆篓,然后構建完成后啟動浑度,因為我的代碼托管到了我 gitlab 上的私有倉庫中。于是我真的就這么做了鸦概。
因為 webflux 默認是用 Netty 運行的箩张,可以生成一個 bootJar 的 Jar 包來直接用 Java 運行,不用丟到其他容器中窗市,所以為了能夠在構建時啟動和殺死項目進程先慷,我寫了兩個簡單的腳本。因為腳本被我改過了所以不一定對咨察,但是大概內(nèi)容如下熟掂。
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 構建的念頭,原因如下:
在經(jīng)過檢查系統(tǒng)資源之后牡借,我發(fā)現(xiàn)我的單核1G內(nèi)存的 vps 拳昌,實在是難以支撐 Jenkins + Gradle 同時運行,系統(tǒng)資源直接爆表钠龙。
后來了解了一下發(fā)現(xiàn)炬藤,一般來說不會在同一臺服務器上既 build 又運行服務的。碴里。
既然在服務器上構建是沒法繼續(xù)下去了沈矿,那么我換一種思路,在本地 build咬腋,然后傳到服務器上羹膳,再啟動服務。
我是在 win10 上開發(fā)的根竿,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
執(zhí)行批處理,總算能滿足我要的需求了蠢壹。嗓违。
這是一件很小的事情,總而言之是讓我深刻了解到图贸,build 項目真的很吃資源蹂季。。疏日。偿洁。