1. 程式人生 > 程式設計 >高效部署Springboot的三種方式。

高效部署Springboot的三種方式。

文章目的: 自動化,提高生產效率。

第一種方式:使用Idea deployment工具半自動化。

idea new 一個 springboot專案,勾選 spring web依賴。

(1):編寫一個Controller,記得在要啟動函式的同一子包下面,不然掃包找不到,需要手動新增掃包地址。

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloCtl
{ @GetMapping("/hello") private String hello(){ return "來自idea deployment的問候"; } } 複製程式碼

(2):配置devployment地址和檔案關係對映。

使用Maven打包一下。 連線成功即可配置檔案對映關係。

即可完成上傳,不知道idea為啥不能檢測到jar的更新,並自動上傳新jar包,但是程式碼的更新就可以做到自動上傳,有人知道如何解決嗎?

java -jar ***.jar
複製程式碼

自行訪問下 主機:8080/hello。 至於如何自動化啟動新jar包,可以通過shell或python指令碼解決。

  • while迴圈判斷檔案是否更新。
  • 更新及kill當前springboot程式,並重啟新jar包。
  • 好像不是特別規範,這樣更新。

第二種:通過Docker

(1):同樣新建一個Springboot,配置docker,配置dockerfile。

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloCtl {
    
    @GetMapping
public String hello(){ return "來自docker的問候"; } } 複製程式碼

配置idea的docker

將Springboot打成jar包,maven package。並提前把openjdk:8這個映象pull下來

docker pull openjdk:8
複製程式碼

在target目錄下新增Dockerfile檔案。

FROM openjdk:8
COPY demo-0.0.1-SNAPSHOT.jar /tmp/app.jar
WORKDIR /tmp
ENTRYPOINT ["java","-jar","app.jar"]
複製程式碼

記住上面的 demo-0.0**.jar包是對應你自己的jar包記得修改下。

(2):新增一個docker 執行的上下文環境。

配置好執行環境後,點選執行即可
使用瀏覽器訪問 localhost:8080,即可收到來自docker的問候。

(3):push 構建好的Image到docker hub或docker私服,在伺服器端部署

docker pull 你的映象
docker run -p 8080:8080 你的映象
複製程式碼

第三種方式(推薦方式): CI(持續整合) Jenkins+Gitlab+Docker

這種方式簡單來說,傳統部署流程中 git Push新程式碼->拉取新程式碼->Maven構建產生新Image->拉取新Image->刪除舊Image,刪除舊容器->執行新Image->通過http或者瀏覽器檢查專案是否正常。而CI中,開發人員只需要關心git Push新程式碼和檢查專案是否執行正常,中間繁瑣重複的勞動由自動化構建工具Jenkins+Gitlab+Docker完成,開發人員只需要通過簡單配置,實現高度定製的的自動化部署。

(1)(可選,可以選擇不搭,直接用已有github或者其他git平臺):搭gitlab私服,我想搭github來著,找了半天沒有解決。

docker pull gitlab/gitlab‐ce:latest
複製程式碼

gitlab有點大,需要耐心等下。
docker 加速(可選)

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["你的docker加速地址,比如https://skdgjskd.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
複製程式碼

加速地址領取地址https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors。

建立掛載資料夾和啟動容器

#建立掛載資料夾
mkdir -p /opt/gitlab/etc
mkdir -p /opt/gitlab/log
mkdir -p /opt/gitla/data
#gitlab
docker run \
    --detach \
    --publish 8443:443 \
    --publish 8090:80 \
    --name gitlab \
    --restart always \
    -v /opt/gitlab/etc:/etc/gitlab \
    -v /opt/gitlab/log:/var/log/gitlab \
    -v /opt/gitlab/data:/var/opt/gitlab \
    gitlab/gitlab‐ce:latest
#修改配置
 vi /opt/gitlab/etc/gitlab.rb
 #開啟之後修改 external_url 'http://{這裡填你的宿主機的ip地址}'  
vi /opt/gitlab/data/gitlab-rails/etc/gitlab.yml
#開啟以後找到
# gitlab:
#     ## Web server settings (note: host is the FQDN,do not include http://)
#     host: {這裡填你的宿主機地址}
#     port: {這裡填8090}
#     https: false

#最後瀏覽器訪問 主機ip地址:8090,即可驗證是否搭建成功。
#設定root密碼,並可以用root賬戶登入
複製程式碼

(2) 搭建Jenkins,必須要搭。

docker run -p 8080:8080 -p 50000:50000 -v jenkins_data:/var/jenkins_home -v jenkinsci/blueocean 
#jenkin容器啟動需要時間
複製程式碼

#上面說到要你去輸入jenkin密碼,需要我們進入jenkin容器進行檢視。
docker exec -it 7f485bd95c3b  /bin/bash 進入jenkins容器 
cat /var/jenkins_home/secrets/initialAdminPassword
複製程式碼

輸入密碼後,進入jenkins,選擇推薦安裝,可以選擇直接使用admin賬戶登入,密碼就是上面cat到的。

(3) 搭建docker私服(可選,可以用公服)

docker run ‐‐name docker‐registry ‐d ‐p 5000:5000 registry
vi /etc/docker/daemon.json
#新增以下內容
#{ "insecure‐registries":["宿主機IP地址:5000"]}
#新增完成後,systemctl restart docker並啟動容器即可。
複製程式碼

(4) 配置Jenkins JDK,Maven,Docker, Git及外掛環境。

#進入jenkins容器
ssh-keygen -t rsa
cat /var/jenkins_home/.ssh/id_rsa.pub 
複製程式碼

新增cat到的公鑰

配置jenkin的jdk, Maven, Docker,gitlab外掛,Maven外掛, SSH外掛,設定完儲存即可

下載安裝ssh是為了等下遠端登入docker宿主機,關閉舊容器,啟動新容器做的。安裝gitlab外掛是為了等下有個觸發器。如果你用的是github請安裝github的外掛。安裝maven是為了那些不使用docker部署的人,來自動化構建專案。安裝外掛選項在Manage Jenkins裡。 在jenkins中新建一個item

(5)配置gitlab Webhook,配置Jenkin匿名登陸.

在Gitlab上建立一個專案,在mytest的配置項中配置遠端倉庫地址,以及使用者名稱和密碼。

配置Jenkins的匿名登陸。
點選系統管理->全域性安全配置->勾選 匿名使用者具有可讀許可權

點選系統管理->系統設定->點掉圖中圈出的。

到此對於Webhook Jenkin所需要配置的就完成了。

在Gitlab上配置你的Webhook。
取消對本地url的限制(因為我的jenkins和gitlab搭建在同一個機器上)

在Gitlab倉庫中進行Webhook的設定。url為你的jenkin地址/project/你的jenkins專案名。

(6)配置Jenkins的構建指令碼。

第一個指令碼主要幹這幾件事情

  • ssh登入docker宿主機
  • 停止並刪除舊的Springboot容器
  • 刪除舊Springboot Image

首先給Jenkins配置ssh憑證

在SSH 外掛配置,hostname填docker宿主機的地址(就是你springboot 容器跑的蘇主機地址)。

配置完成後,給你的mytest專案進行構建的配置。

第一個指令碼模板為

#!/bin/bash 
result=$(docker ps | grep "{指定你的舊springboot容器名字,或者id}") 
if [[ "$result" != "" ]] 
then 
echo "stop old container" 
docker stop {指定你的舊容器} 
fi
result1=$(docker ps ‐a | grep "{指定你的舊springboot容器名字,或者id}") 
if [[ "$result1" != "" ]] 
then 
echo "rm old container" 
docker rm {容器名} 
fi
result2=$(docker images | grep "{舊Image名}")
if [[ "$result2" != "" ]] 
then 
echo "rm old image" 
docker rmi {舊Image名}
fi
複製程式碼

還有兩個指令碼,我們待會再說。相信看到這裡了,大概瞭解了Jenkins是個啥東西了,其實就是一個視覺化的排程工具,幫我門管理一些構建過程。
好接下來我們建立一個idea中springboot專案,新增程式碼。

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloCtl {

    @GetMapping("/hello")
    private String hello(){
        return "來自jenkins的問候";
    }
}
複製程式碼

配置pom,新增docker打包外掛(Google開源Java容器管理工具 Jib,更多詳細配置參考github官網 github.com/GoogleConta…

<properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>com.google.cloud.tools</groupId>
                <artifactId>jib-maven-plugin</artifactId>
                <version>1.7.0</version>
                <configuration>
                    <!--配置基本映象-->
                    <from>
                        <image>openjdk:8-jdk-alpine</image>
                    </from>
                    <!--配置最終推送的地址,倉庫名,映象名-->
                    <to>
                        <!--這裡我配置的是私服,如何配置公服地址請參考我的《如何使用docker打包Springboot的四種方式》文章 -->
                        <image>192.168.208.102:5000/test1</image>
                        <tags>
                            <tag>idea</tag>
                        </tags>
                    </to>
                    <!--這裡是必須要配置的,因為私服是http不是https,預設jib不給你推送到非https的私服-->
                    <allowInsecureRegistries>true</allowInsecureRegistries>
                </configuration>
            </plugin>
        </plugins>
    </build>
複製程式碼

將Maven專案推送到Docker宿主機,在docker宿主機內嘗試構建。在Pom目錄下,輸入構建命令

mvn compile jib:build
複製程式碼

可以看到,構建Image成功,並推送到私服。

好的,現在我們的程式碼沒問題了,接下來,我們編寫後兩個任務指令碼。 繼續開啟mytest的Jenkins任務配置表。

其中最後一個指令碼任務為

  • 從私服拉取新Image
  • 執行新Image
#idt 是指定拉取地址
docker run --name {自己取名字,與第一個指令碼要可以對應起來} -p 8081:8081 -idt 192.168.101.64:5000/{這裡填你自己的Imaga:Tag}
docker log -f test1
複製程式碼

配置完後我們儲存,到這裡,我們push我們之前寫好的程式碼上私服,即刻看到Jenkins自動幫我們執行3個指令碼,實現了全自動化部署。

最後總結

ssh方式過於簡單我就不說了。
idea視覺化構建Docker,也是比較簡單的,只需要你去配置,而且都是視覺化的。
docker+jenkins+gitlab,jenkins其實就是個視覺化構建指令碼的管理工具,大家只需要按照我給出的步驟去配置就可以了。
有啥問題,留言就完事了。
如果這篇文章對你有所幫助,給小小的點贊可以嗎?