1. 程式人生 > >Jenkins+花生殼+nginx實現內網穿透的Springboot專案持續部署

Jenkins+花生殼+nginx實現內網穿透的Springboot專案持續部署

嘮叨一段

公司小什麼都要節約一點,所有測試伺服器都在公司局域網裡,程式碼託管在Gitee當中,自從用了微服務(用SpringBoot拆解業務流程),開發與測試階段部署jar太麻煩了,多早以前就聽說過Jenkins,經過不停的踩坑終於完成了初步的Gitee+jenkins+花生殼(內網穿透)+nginx實現自動持續部署。裡面還涉及到一些高階功能只能後面邊使用邊補充

我在裡面用到了nginx,對於不需要的朋友,直接忽略對應步驟即可,直接將tomcat的監聽埠改為80

註冊與配置花生殼

  1. 註冊/登入花生殼

  2. 購買域名

  3. 購買內網穿透

  4. 設定花生殼

    • 開啟花生殼

    • 增加內網穿透對映

      我對映的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

    我下載的http://mirrors.jenkins.io/war-stable/latest/jenkins.war

  • 部署到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 選項卡

  1. 點選 Git

  2. 輸入你的倉庫地址,例如 [email protected]:gitee_group/gitee_project.git

    • 點選 Advanced 按鈕, Name 欄位中輸入 originRefspec 欄位輸入 +refs/heads/:refs/remotes/origin/ +refs/pull//MERGE:refs/pull//MERGE

  3. Branch Specifier 選項,根據實際情況輸入,我自己輸入的*/master

  4. 其他是選擇的預設值

新增證書

最終設定完如圖:

設定構建目標

測試構建

此刻的構建只是從Gitee上拉取程式碼並進行打包,還不具備push程式碼觸發構建的能力

進入到任務介面,點選“立即構建”

點選進度條,進入詳情頁面,點選“Console Output”,可以檢視打包的日誌輸出

第一次構建,會下載很多包,過程比較漫長

打包完會輸出如下日誌

觸發設定

  1. 生成Gitee WebHook 密碼

  2. 在Gitee中設定WebHook密碼

  3. 其他全部預設值

  4. 測試觸發是否成功

    在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,全部通過。。。

補充:

  1. 為了能在Jenkins控制檯觀察到啟動日誌,可以修改restart,將

    java -jar $APP_HOME/$JAR_NAME> $APP_HOME/app.log

    改為

    java -jar $APP_HOME/$JAR_NAME

    效果如下:

    圖片最下面的圈圈,表示還在等待接收新的輸入流做顯示

  2. 為了不讓Jenkins等待應用伺服器的輸出,則可以修改restart.sh,將

    java -jar $APP_HOME/$JAR_NAME> $APP_HOME/app.log

    改為

    nohup java -jar $APP_HOME/$JAR_NAME> $APP_HOME/app.log &

到底使用哪種方式,看自己喜好吧。

其他

忘記密碼

  1. 找回admin密碼

    使用jenkins啟動使用者登入主機,執行如下命令:

    cd

    cd .jenkins/secrets

    cat initialAdminPassword

    裡面的內容便是admin的密碼

  2. 取消密碼登入

    使用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