Jenkins+花生殼+nginx實現內網穿透的Springboot專案持續部署
嘮叨一段
公司小什麼都要節約一點,所有測試伺服器都在公司局域網裡,程式碼託管在Gitee當中,自從用了微服務(用SpringBoot拆解業務流程),開發與測試階段部署jar太麻煩了,多早以前就聽說過Jenkins,經過不停的踩坑終於完成了初步的Gitee+jenkins+花生殼(內網穿透)+nginx實現自動持續部署。裡面還涉及到一些高階功能只能後面邊使用邊補充
我在裡面用到了nginx,對於不需要的朋友,直接忽略對應步驟即可,直接將tomcat的監聽埠改為80
註冊與配置花生殼
-
註冊/登入花生殼
-
購買域名
-
購買內網穿透
-
設定花生殼
-
開啟花生殼
-
增加內網穿透對映
我對映的80埠是被NGINX監聽的(因為Jenkins等其他web應用也需要通過該域名被外網訪問)
-
測試。輸入花生殼的域名,看能否訪問到自己的web伺服器網頁
nginx配置:
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; access_log /home/app/proc/nginx/logs/access.log; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # location /jenkins{ proxy_pass http://192.168.2.23:8080; } } }
到此為止花生殼的配置結束了
-
安裝與配置Jenkins
安裝Jenkins
-
在官網去下載war包
https://jenkins.io/download/,選擇Long-term Support->Generic Java package
-
部署到tomcat中,tomcat會自動解壓war並在webapps目錄下生成jenkins資料夾
注意:linux作業系統限制了非root使用者不能監聽1024一下埠號,所以如果tomcat要啟動在80埠,必須用root使用者啟動,否則要修改花生殼的對映(指向內網的非80埠)
安裝Git
登陸root使用者,執行
yum -y install git
安裝完git後,複製出/usr/bin/git,後面設定會用到
配置Jenkins
初始化Jenkins
因為我自己已經在nginx上配置了Jenkins的代理,所以直接用如下地址訪問:
http://xxx.xxx.ecip.vip/jenkins
剛開始會出來一個提示頁面,告訴你Jenkins還在準備中,過1分鐘左右可以自己重新整理頁面,便會出來如下介面
圈出來的部分是下面要輸入的密碼儲存位置
去LINUX主機上獲取密碼
cat /root/.jenkins/secrets/initialAdminPassword
輸入密碼,點選下一步
然後過幾分鐘會提示你安裝外掛,選擇按照推薦的安裝。
補充:可能會有朋友遇到這個頁面出不來,提示連線失敗,可以直接跳過,後面直接去“外掛管理”裡面選擇對應外掛進行安裝。網上也有說去外掛中心修改https為http,我試了一下不知道為什麼不行,就選擇了前面的本辦法。
在不斷的安裝進行中
只安裝這點外掛還不夠,等會還要補充安裝別的外掛。
這一步完成之後,會提示建立使用者,如果是生產環境,建議建立一個使用者給予相應的許可權。我自己繼續使用的admin使用者。最終進入主頁
補充別的外掛
選擇路徑:“系統管理”-》“外掛管理”
安裝Deploy to container\Gitee\Publish Over SSH\Maven Integration外掛
注:可以選擇完所有外掛後,在點選安裝(install without restart)
系統設定
選擇路徑:“系統管理”-》“系統設定”
設定Gitee
設定參考https://gitee.com/oschina/Gitee-Jenkins-Plugin#%E6%8F%92%E4%BB%B6%E5%AE%89%E8%A3%85中的“外掛配置-新增碼雲連結配置”章節
設定完後,一定要測試一下是否連結成功
設定PUSH SSH OVER
設定介面
Passphrase:生成ssh公鑰私鑰時的密碼,如果使用ssh-keygen沒有輸入,該值不用填。按照本操作文件弄,就是不用填值
Path to key:私鑰路徑,此配置如果設定了,就可以不用設定下面Key了。在下面的ssh-keygen執行完後,會輸入私鑰的路徑,複製並貼上進來
Key:私鑰內容,此配置如果設定了,就可以不用設定上面的Path to key了
設定ssh免登陸
使用root使用者登入,配置hosts
使用app(自己的非root)使用者,配置ssh免登陸
ssh-keygen,互動的時候直接三次回車
ssh-copy-id,輸入對應用的密碼
新增SSH Server
Name:自己隨便取,可讀性強即可
Hostname:要接收構建後jar包的伺服器ip或者域名
Username:遠端主機使用者名稱
Remote Directory:直接設定根目錄,如果這樣設定,要注意使用者(app)的訪問許可權。如果這裡設定了根目錄,後面設定的傳送目錄時就可以直接輸入全路徑,避免造成誤配。這一點很重要,我在測試時候,就踩了這個坑。
弄完之後,點選測試一下
全域性工具設定
設定MAVEN
配置檔案
設定maven主目錄
去掉“自動安裝”複選框
設定JDK
設定JDK主目錄
設定GIT
設定Git檔案目錄
新建並構建任務
新建任務
前往 Jenkins -> New Item , name 輸入 'Gitee Test',選擇 Freestyle project
儲存即可建立構建專案
任務全域性配置
Gitee連結設定
任務全域性配置中需要選擇前一步中的碼雲連結。前往某個任務(如'Gitee Test')的 Configure -> General,Gitee connection 中選擇前面所配置的碼雲聯機,如圖:
原始碼管理配置
前往某個任務(如'Gitee Test')的 Configure -> Source Code Management 選項卡
-
點選 Git
-
輸入你的倉庫地址,例如
[email protected]:gitee_group/gitee_project.git
-
點選 Advanced 按鈕, Name 欄位中輸入
origin
, Refspec 欄位輸入 +refs/heads/:refs/remotes/origin/ +refs/pull//MERGE:refs/pull//MERGE
-
-
Branch Specifier 選項,根據實際情況輸入,我自己輸入的*/master
-
其他是選擇的預設值
新增證書
最終設定完如圖:
設定構建目標
測試構建
此刻的構建只是從Gitee上拉取程式碼並進行打包,還不具備push程式碼觸發構建的能力
進入到任務介面,點選“立即構建”
點選進度條,進入詳情頁面,點選“Console Output”,可以檢視打包的日誌輸出
第一次構建,會下載很多包,過程比較漫長
打包完會輸出如下日誌
觸發設定
-
生成Gitee WebHook 密碼
-
在Gitee中設定WebHook密碼
-
其他全部預設值
-
測試觸發是否成功
在Gitee中點選
觀察Jenkins是否觸發新的構建
可以看到確實觸發了新的構建
構建動作設定
其中包含Pre steps/Post steps,兩者的作用類似於動態代理的invoke方法的前後執行的動作,或者Spring攔截器中的preHandle和afterHandle。
Pre steps:構建前執行的步驟,比如可以執行別的shell操作完成很多複雜的動作
Post steps:構建後執行的步驟
還有一個Post-build Actions
只是為了實現構建後進行檔案傳送和部署,設定Post steps/Post-build Actions都可以,我自己使用的Post-build Actions
restart.sh指令碼內容,該指令碼是選擇傳送過來的jar包列表中最近被修改的作為啟動項
#!/bin/sh #設定環境變數 export JAVA_HOME=/home/app/proc/jdk1.8.0_181 export PATH=$JAVA_HOME/bin:$PATH #設定程式主目錄 APP_HOME=/home/app/app/hello #進入程式主目錄 cd $APP_HOME #找出最近被修改的jar包 JAR_NAME=`ls -lot *.jar|head -n 1|awk '{print $8}'` #啟動專案 java -jar $APP_HOME/$JAR_NAME> $APP_HOME/app.log
測試一下
在Gitee的WebHook中點選測試
觀察Jenkins中的HelloWorld專案是否被觸發構建
檢視構建日誌
檢視程序是否啟動起來了
驗證應用是否正常
發現錯別字了吧,笑一笑也不錯
OK,全部通過。。。
補充:
-
為了能在Jenkins控制檯觀察到啟動日誌,可以修改restart,將
java -jar $APP_HOME/$JAR_NAME> $APP_HOME/app.log
改為
java -jar $APP_HOME/$JAR_NAME
效果如下:
圖片最下面的圈圈,表示還在等待接收新的輸入流做顯示
-
為了不讓Jenkins等待應用伺服器的輸出,則可以修改restart.sh,將
java -jar $APP_HOME/$JAR_NAME> $APP_HOME/app.log
改為
nohup java -jar $APP_HOME/$JAR_NAME> $APP_HOME/app.log &
到底使用哪種方式,看自己喜好吧。
其他
忘記密碼
-
找回admin密碼
使用jenkins啟動使用者登入主機,執行如下命令:
cd
cd .jenkins/secrets
cat initialAdminPassword
裡面的內容便是admin的密碼
-
取消密碼登入
使用jenkins啟動使用者登入主機,執行如下命令:
cd
cd .jenkins
vi config.xml
修改<useSecurity>true</useSecurity>為<useSecurity>false</useSecurity>
使用<!-- -->註釋掉下面的內容:
<authorizationStrategy class="hudson.security.FullControlOnceLoggedInAuthorizationStrategy"> <denyAnonymousReadAccess>true</denyAnonymousReadAccess> </authorizationStrategy> <securityRealm class="hudson.security.HudsonPrivateSecurityRealm"> <disableSignup>true</disableSignup> <enableCaptcha>false</enableCaptcha> </securityRea