公司小什麼都要節約一點,全部測試服務器都在公司局域網裏,代碼託管在Gitee當中,自從用了微服務(用SpringBoot拆解業務流程),開發與測試階段部署jar太麻煩了,多早之前就據說過Jenkins,通過不停的踩坑終於完成了初步的Gitee+jenkins+花生殼(內網穿透)+nginx實現自動持續部署。裏面還涉及到一些高級功能只能後面邊使用邊補充html
我在裏面用到了nginx,對於不須要的朋友,直接忽略對應步驟便可,直接將tomcat的監聽端口改成80java
註冊/登陸花生殼linux
購買域名nginx
購買內網穿透git
設置花生殼web
開啓花生殼shell
增長內網穿透映射tomcat
我映射的80端口是被NGINX監聽的(由於Jenkins等其餘web應用也須要經過該域名被外網訪問)服務器
測試。輸入花生殼的域名,看可否訪問到本身的web服務器網頁app
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; } } }
到此爲止花生殼的配置結束了
在官網去下載war包
https://jenkins.io/download/,選擇Long-term Support->Generic Java package
部署到tomcat中,tomcat會自動解壓war並在webapps目錄下生成jenkins文件夾
注意:linux操做系統限制了非root用戶不能監聽1024一下端口號,因此若是tomcat要啓動在80端口,必須用root用戶啓動,不然要修改花生殼的映射(指向內網的非80端口)
登錄root用戶,執行
yum -y install git
安裝完git後,複製出/usr/bin/git,後面設置會用到
由於我本身已經在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)
選擇路徑:「系統管理」-》「系統設置」
設置參考https://gitee.com/oschina/Gitee-Jenkins-Plugin#%E6%8F%92%E4%BB%B6%E5%AE%89%E8%A3%85中的「插件配置-添加碼雲連接配置」章節
設置完後,必定要測試一下是否連接成功
設置界面
Passphrase:生成ssh公鑰私鑰時的密碼,若是使用ssh-keygen沒有輸入,該值不用填。按照本操做文檔弄,就是不用填值
Path to key:私鑰路徑,此配置若是設置了,就能夠不用設置下面Key了。在下面的ssh-keygen執行完後,會輸入私鑰的路徑,複製並粘貼進來
Key:私鑰內容,此配置若是設置了,就能夠不用設置上面的Path to key了
使用root用戶登陸,配置hosts
使用app(本身的非root)用戶,配置ssh免登錄
ssh-keygen,交互的時候直接三次回車
ssh-copy-id,輸入對應用的密碼
添加SSH Server
Name:本身隨便取,可讀性強便可
Hostname:要接收構建後jar包的服務器ip或者域名
Username:遠程主機用戶名
Remote Directory:直接設置根目錄,若是這樣設置,要注意用戶(app)的訪問權限。若是這裏設置了根目錄,後面設置的發送目錄時就能夠直接輸入全路徑,避免形成誤配。這一點很重要,我在測試時候,就踩了這個坑。
弄完以後,點擊測試一下
配置文件
設置maven主目錄
去掉「自動安裝」複選框
設置JDK主目錄
設置Git文件目錄
前往 Jenkins -> New Item , name 輸入 'Gitee Test',選擇 Freestyle project
保存便可建立構建項目
任務全局配置中須要選擇前一步中的碼雲連接。前往某個任務(如'Gitee Test')的 Configure -> General,Gitee connection 中選擇前面所配置的碼雲聯機,如圖:
前往某個任務(如'Gitee Test')的 Configure -> Source Code Management 選項卡
點擊 Git
輸入你的倉庫地址,例如 git@your.gitee.server: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> </securityRealm>