高效部署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搭建在同一個機器上)
(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其實就是個視覺化構建指令碼的管理工具,大家只需要按照我給出的步驟去配置就可以了。
有啥問題,留言就完事了。
如果這篇文章對你有所幫助,給小小的點贊可以嗎?