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

嘮叨一段

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

我在裏面用到了nginx,對於不須要的朋友,直接忽略對應步驟便可,直接將tomcat的監聽端口改成80java

註冊與配置花生殼

  1. 註冊/登陸花生殼linux

  2. 購買域名nginx

  3. 購買內網穿透git

  4. 設置花生殼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; 
          }
      }
      }

    到此爲止花生殼的配置結束了

安裝與配置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. 輸入你的倉庫地址,例如 git@your.gitee.server: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>
      </securityRealm>
相關文章
相關標籤/搜索