springboot 使用 wagon 持續整合(自動上傳伺服器,執行指令碼(實現重啟等操作)),不限於springboot
轉自:使用maven自動上傳、執行jar包 - _lemonV - 部落格園 (cnblogs.com)
1 應用背景
對於大型的專案,現在有很多CI/CD 持續整合/部署方式。如下圖:
但是對於小型專案來說,其實有時候用不到這麼多東西。專案的體量、以及更新迭代、維護等方面,都不至於做如此自動化的流程。殺雞焉用宰牛刀嘛。
不知道大家有沒有遇到過這樣的場景: 總是要用maven打包好專案,再用SSH 連線Linux伺服器 ,再上傳jar包,然後使用shell命令啟動java應用。
為了避免這一重複操作,為大家介紹一款maven外掛。可以一鍵上傳、部署執行java專案。
2. wagon-maven-plugin 外掛自動打包部署jar包
2.1 配置Linux伺服器使用者名稱和密碼
在maven 的 settings.xml中新增:
<!--這一步可以省略:使用者名稱密碼可以手動輸入;也可以在下面配置伺服器url的時候加上使用者名稱和密碼 -->
<servers>
<server>
<id>linux-server-dev</id>
<username>root</username>
<password>123456</password>
</server>
</servers>
2.2 新增依賴
<dependency>
<groupId>org.codehaus.mojo</groupId>
<artifactId>wagon-maven-plugin</artifactId>
<version>2.0.0</version>
</dependency>
2.3 首先實現打包後,自動上傳jar包
編輯pom.xml中的標籤
<build>
<extensions>
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ssh</artifactId>
<version>2.8</version>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>wagon-maven-plugin</artifactId>
<version>1.0</version>
<configuration>
<!-- serverId即在settings.xml中配置的service的id -->
<serverId>linux-server-dev</serverId>
<!-- 要上傳到伺服器的檔案,一般來說是jar或者war包 -->
<fromFile>target/project_name.jar</fromFile>
<!-- 配置伺服器的地址以及檔案上傳的目錄。 -->
<!-- 如果2.1 serverId配置省略了,可以這麼寫:
scp://user:[email protected]/home/project_name/ -->
<!-- 注意上傳的路徑中不能帶有橫槓'-',例如/home/project-name ,否則會導致無法執行遠端shell命令 -->
<url>scp://192.168.1.1/home/project_name/</url>
</configuration>
</plugin>
</plugins>
</build>
配置完成後,在cmd終端 cd到 專案pom.xml檔案同一級, 執行命令:mvn clean package wagon:upload-single
打包並上傳。
2.4 實現自動啟動/重啟java應用
編輯pom.xml中的標籤:
<build>
<extensions>
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ssh</artifactId>
<version>2.8</version>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>wagon-maven-plugin</artifactId>
<version>1.0</version>
<configuration>
<serverId>linux-server-dev</serverId>
<fromFile>target/project_name.jar</fromFile>
<url>scp://192.168.20.128/home/project_name/</url>
<commands>
<!-- 啟動/重啟jar包的shell指令碼,需要自己編寫,放在/home/project_name 目錄下即可-->
<command>sh ./restart.sh</command>
<!-- 也可以直接執行命令-->
<command><![CDATA[nohup java -jar /home/project_name/xx.jar &]]><command>
</commands>
<!-- 顯示執行命令的輸出結果 -->
<displayCommandOutputs>true</displayCommandOutputs>
</configuration>
</plugin>
</plugins>
</build>
執行命令:mvn clean package wagon:upload-single wagon:sshexec
打包、上傳、執行shell指令碼或者命令
2.5 maven install 一鍵打包、部署
如果覺得每次輸入mvn clean package wagon:upload-single wagon:sshexec
還是很麻煩的話。可以配置execution
<build>
<extensions>
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ssh</artifactId>
<version>2.8</version>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>wagon-maven-plugin</artifactId>
<version>1.0</version>
<executions>
<execution>
<id>upload-deploy</id>
<!-- 執行package打包的同時執行upload-single和sshexec -->
<phase>package</phase>
<goals>
<goal>upload-single</goal>
<goal>sshexec</goal>
</goals>
<configuration>
<serverId>linux-server-dev</serverId>
<fromFile>target/project_name.jar</fromFile>
<url>scp://192.168.20.128/home/project_name/</url>
<commands>
<!-- 啟動/重啟jar包的shell指令碼,需要自己編寫,放在/home/project_name 目錄下即可-->
<command>sh ./restart.sh</command>
<!-- 也可以直接執行命令-->
<command><![CDATA[nohup java -jar /home/project_name/xx.jar &]]><command>
</commands>
<!-- 顯示執行命令的輸出結果 -->
<displayCommandOutputs>true</displayCommandOutputs>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
配置完後mvn clean package
即可 一鍵打包部署。
我用的是spring tools suite (其實就是eclipse )開發,右鍵專案-> Run as -> maven install 就直接一鍵 打包部署了。因為maven install 裡包含了 package 這個命令。關於shell
3.後記
3.1使用的時候遇到了一個小問題
就是總是讓我輸入伺服器密碼。提示:
Keyboard interactive required, supplied password is ignored
互動式面板,提供的密碼被忽略。google了一下。
在StackOverflow找到了一篇問答。
vi /etc/ssh/sshd_config
service sshd restart 修改之後重啟服務
3.2 shell命令參考
這裡提供 殺掉 老的服務啟動程序命令。jar包的啟動命令自己新增。
如果有啟動程序才執行kill ,這樣判斷的好處是,如果沒有服務執行,執行kill指令碼,不會再提示引數不夠了。
#killold.sh
if [[ -n $(ps -ef | grep 專案的部分名稱* | grep -v grep ) ]]; then
echo 'kill old process'
ps -ef | grep 專案的部分名稱* | grep -v grep | awk '{print $2}' | xargs kill -9
fi
以下我的具體配置。 為什麼java -jar 啟動命令 沒有和 killold.sh 寫在同一個指令碼呢? 一開始是寫在一起的叫 restart.sh 不過新的服務總是啟動不了。就拆開寫了。讀者可以自己試一試。