高效部署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打包一下。 鏈接成功便可配置文件映射關係。java

便可完成上傳,不知道idea爲啥不能檢測到jar的更新,並自動上傳新jar包,可是代碼的更新就能夠作到自動上傳,有人知道如何解決嗎?python

java -jar ***.jar
複製代碼

自行訪問下 主機:8080/hello。 至於如何自動化啓動新jar包,能夠經過shell或python腳本解決。git

  • 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的dockergithub

將Springboot打成jar包,maven package。並提早把openjdk:8這個鏡像pull下來

docker pull openjdk:8
複製代碼

在target目錄下添加Dockerfile文件。web

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包記得修改下。spring

(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完成,開發人員只須要經過簡單配置,實現高度定製的的自動化部署。docker

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

docker pull gitlab/gitlab‐ce:latest
複製代碼

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

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。json

建立掛載文件夾和啓動容器瀏覽器

#建立掛載文件夾
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其實就是個可視化構建腳本的管理工具,你們只須要按照我給出的步驟去配置就能夠了。 有啥問題,留言就完事了。 若是這篇文章對你有所幫助,給小小的點贊能夠嗎?

相關文章
相關標籤/搜索