1. 前言
在前面的版本中,錯誤的把構建推送docker
鏡像綁定到package
執行動作上面了;這樣導致osc-service
父工程在install
操作時會報找不到依賴的錯誤,和“提前”構建推送鏡像等不能接受的問題。爲了解決這些問題,這個版本做了一些對應優化。
2. 源碼
完整項目地址:https://github.com/intomylife/osc-api
v1.4.4 標籤地址:https://github.com/intomylife/osc-api/releases/tag/v1.4.4
注:對於標籤的說明「初學者商城」- 寫在最前面 #5.1
3. 接口
注:查看更改內容:使用腳本簡化部署操作
3.1 更改綁定執行動作
從package
更改爲deploy
原因:
在package
階段,命令只完成了項目編譯、單元測試、打包功能,而沒有安裝部署到本地倉庫和遠程倉庫;這時的package
動作由於是構建推送docker
鏡像的“觸發點”,就導致在本地倉庫和遠程倉庫都沒有相關依賴而報錯的結果。
那是否能綁定在install
階段?答案是否定的。install
在package
的項目編譯、單元測試、打包功能基礎上多一個安裝部署到本地倉庫的步驟,而我們是需要在此操作後纔來進行docker
鏡像的構建和推送。
所以,最後更改爲綁定到deploy
階段;其中deploy
階段包括:項目編譯、單元測試、打包功能、安裝部署到本地倉庫、安裝部署到遠程倉庫。
3.2 遠程私有倉庫:Nexus
注:之前配置的阿里雲鏡像倉庫地址供我們加速下載依賴,而這時想要安裝部署到遠程倉庫,就需要自己部署一個Maven
的遠程私有倉庫
3.2.1 Nexus
Nexus
是一個強大的Maven
倉庫管理器,它不僅能維護自己內部的所有依賴,同時還能代理外部的鏡像倉庫;安裝容易上手簡單,並且還提供可視化的操作界面。
下面我們一起在Docker
中安裝Nexus3
3.2.2 Docker 中安裝 Nexus3
- 拉取 Nexus 鏡像
[root@zwc ~]# systemctl start docker.service
[root@zwc ~]# docker pull sonatype/nexus3:3.17.0
- 配置 Nexus 數據目錄,以及賦予目錄讀寫執權限
[root@zwc ~]# cd /usr/local/
[root@zwc local]# mkdir nexus-data
[root@zwc local]# chmod -R 777 nexus-data/
- 運行 Nexus 容器
[root@zwc ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
sonatype/nexus3 3.17.0 36b0df681a47 11 months ago 582MB
[root@zwc ~]# docker run -d --name nexus3 --restart always -p 18081:8081 -e TZ='Asia/Shanghai' -v /usr/local/nexus-data/:/nexus-data/ sonatype/nexus3:3.17.0
56153e61cba379ea74be624396285f00c07d563b52ef0414cf253ad6
[root@test ~]#
- -d:後臺啓動
- –name:啓動後的容器名稱
- –restart:賦固定值 always,表示如果容器啓動失敗,會一直嘗試重連
- -p:端口映射(宿主機端口:容器端口)
- -e:環境變量,指定了容器的時區
- -v:映射數據目錄,相當於把容器中的數據備份到宿主機指定的目錄(宿主機目錄:容器目錄)
- sonatype/nexus3:3.17.0:啓動的鏡像
3.2.3 更改 admin 密碼
- 上面的步驟操作結束後,直接在瀏覽器中輸入
ip:18081
- 順利進入到
Nexus
主頁後,點擊右上角Sign in
按鈕 - Username: admin
- Password: 密碼在
admin.password
文件裏面記錄着
[root@zwc ~]# cd /usr/local/nexus-data/
[root@zwc nexus-data]# cat admin.password
- 成功登陸後,會有一個嚮導,用來重置
admin
密碼 - 點擊
Next
,輸入兩次新密碼,繼續Next
- 這一步提示是否需要開啓匿名訪問,爲了安全起見不需要,繼續
Next
- 最後點擊
Finish
,完成
3.2.4 倉庫類型
- proxy:代理類型;遠程倉庫的代理,當在自己內部倉庫沒有的情況下會去代理倉庫中查找
- hosted:宿主類型;自己內部的倉庫
- group:倉庫組類型;配置多種類型的倉庫,然後對外暴露統一的地址即可訪問到這個組裏所有的倉庫
3.2.5 Policy 策略
在 hosted(宿主類型) 的倉庫裏,又有 Policy(策略) 的概念,主要分爲以下兩種:
- releases:線上發佈的版本倉庫
- snapshots:開發測試的版本倉庫
3.2.6 默認的倉庫
- maven-central:代理類型的倉庫,默認代理的倉庫地址是
https://repo1.maven.org/maven2/
- maven-releases:宿主類型的倉庫,Policy 策略爲 releases,指自己內部線上發佈版本的倉庫
- maven-snapshots:宿主類型的倉庫,Policy 策略爲 snapshots,指自己內部開發測試版本的倉庫
- maven-public:倉庫組,目前包含上面三個倉庫
3.2.7 創建一個代理倉庫
注:默認的倉庫中只有一個Maven
中央倉庫的代理,現在需要新建一個代理阿里雲鏡像的倉庫
- 點擊主頁頂部像設置一樣的圖標按鈕
- 在左側展開
Repository
,選擇Repositories
- 點擊
Create repository
按鈕,選擇maven2 (proxy)
代理類型的倉庫 - Name: aliyun-proxy
- Proxy -> Remote storage: http://maven.aliyun.com/nexus/content/groups/public
- 填寫完上面兩項就翻到頁面最底部,點擊
Create repository
按鈕
3.2.8 把新建的代理倉庫放入倉庫組中
- 點擊進入
maven-public
倉庫組 - 找到
Group -> Member repositories:
處 - 兩個大框框,左邊顯示的是還可以加入組中的倉庫,右邊顯示的是已經加入到組中的倉庫
- 現在把剛剛新建的代理倉庫添加到組中
- 點擊
aliyun-proxy
- 點擊朝向右邊的箭頭(Add to Selected)
- 這時
aliyun-proxy
它就排在了最底下,上下排名是指訪問的優先前後 - 這裏需要把
aliyun-proxy
放在maven-central
前面 - 接着點擊朝上邊的箭頭(Move Up)
- 最後點擊頁面最下方的
Save
按鈕 - 等待頁面的右上方會彈出相應的提示,顯示
Success
等信息表示操作成功
3.2.9 健康檢查
- 回到
Repositories
頁面 - 發現代理倉庫都有
Health check
項,現在來開啓一下 - 點擊
aliyun-proxy
倉庫的Analyze
按鈕 - 點擊
Yes, only this repository
,僅僅就操作當前選擇的倉庫 - 點擊
I Agree
,我同意 maven-central
倉庫同上操作一遍
3.2.10 其他設置
部署策略:
maven-releases
倉庫默認是不允許重新部署的,對於自己測試使用很不方便,所以這裏更改爲允許重新部署- 點擊進入
maven-releases
倉庫 - 找到
Hosted -> Deployment policy:
- 下拉選擇
Allow redeploy
- 點擊
Save
按鈕,保存 - 等待頁面的右上方會彈出相應的提示,顯示
Success
等信息表示操作成功
日誌報錯:
- 點擊主頁頂部像設置一樣的圖標按鈕
- 在左側展開
System
,選擇Capabilities
- 點擊
Outreach: Management
進入到管理能力詳情中 - 點擊上方
Disable
按鈕 - 等待頁面的右上方會彈出相應的提示,顯示
Success
等信息表示操作成功
3.3 配置本地 Maven 的 settings.xml
3.3.1 mirror 鏡像
注:由於已經在遠程私有倉庫中配置了阿里雲鏡像倉庫的地址,所以這裏可以把已經配置的內容註釋,再添加剛剛部署的遠程私有倉庫地址
<mirror>
<id>nexus3</id>
<mirrorOf>*</mirrorOf>
<name>maven-public</name>
<url>http://ip:18081/repository/maven-public/</url>
</mirror>
3.3.2 server 用戶名密碼
注:由於剛剛配置 Nexus 時設置的不允許匿名訪問,所以這裏還需要配置倉庫的認證信息
<server>
<id>nexus3</id>
<username>admin</username>
<password>123456</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>123456</password>
</server>
<server>
<id>releases</id>
<username>admin</username>
<password>123456</password>
</server>
- 爲每一個遠程私有倉庫配置認證信息
admin
是上面部署 Nexus 的默認用戶,其實是可以根據每個倉庫分別可以擁有哪些操作的多個維度來創建角色和用戶信息的
3.4 配置項目工程的 pom.xml
3.4.1 repository 倉庫
<!-- 私有倉庫 -->
<repositories>
<repository>
<id>nexus3</id>
<url>http://10.211.55.25:18081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
- 配置遠程倉庫地址
- 這裏爲局部配置,也就是專門爲當前工程配置的遠程倉庫地址
- 優先級大於
settings -> mirrors
3.4.2 distributionManagement 部署
<!-- 部署到遠程私有倉庫 -->
<distributionManagement>
<!-- 正式版本 -->
<repository>
<id>releases</id>
<name>releases</name>
<url>http://10.211.55.25:18081/repository/maven-releases/</url>
</repository>
<!-- 測試版本 -->
<snapshotRepository>
<id>snapshots</id>
<name>snapshots</name>
<url>http://10.211.55.25:18081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
- 分別爲兩個遠程倉庫配置部署構建
- 其中
id
節點的值必須與### 3.3.2 server 用戶名密碼
中的id
對應
3.5 使用腳本簡化部署操作
3.5.1 .sh
#!/bin/bash
## $() - 方法,${} - 變量
## 開始
echo [INFO] ----------------------------- start --------------------------------------
## 獲取入參,應用名稱
application_name=$1
## 輸出看一眼
echo application_name: ${application_name}
## 參數校驗
if [ "$application_name" == "registry" ]||[ "$application_name" == "gateway" ]||[ "$application_name" == "turbine" ]||[ "$application_name" == "sleuth" ]||[ "$application_name" == "base" ]||[ "$application_name" == "log" ]||[ "$application_name" == "all" ];
then
## 參數判斷
if [ "$application_name" != "all" ];
then
## 入口
echo [INFO] ------------------------ 進入單個服務部署 ---------------------------------
## 1. 安裝所有服務
## commons
cd osc-commons/
mvn clean install -Dmaven.test.skip=true
mvn clean deploy -Dmaven.test.skip=true
## service
cd ../osc-service/
mvn clean install -Dmaven.test.skip=true
if [ "$application_name" == "base" ]||[ "$application_name" == "log" ];
then
## 2. 安裝部署指定服務
cd osc-$application_name-service/osc-$application_name-service-api/
mvn clean deploy -Dmaven.test.skip=true
cd ../osc-$application_name-service-core/
mvn clean deploy -Dmaven.test.skip=true
## 3. 返回根目錄
cd ../../../
else
## 2. 安裝部署指定服務
cd osc-$application_name-service/
mvn clean deploy -Dmaven.test.skip=true
## 3. 返回根目錄
cd ../../
fi
## 結束
echo [INFO] ----------------------------- end --------------------------------------
echo [INFO] ------------------------------------------------------------------------
else
## 入口
echo [INFO] ------------------------ 進入整個服務部署 ---------------------------------
## 1. 安裝所有服務
## commons
cd osc-commons/
mvn clean install -Dmaven.test.skip=true
mvn clean deploy -Dmaven.test.skip=true
## service
cd ../osc-service/
mvn clean install -Dmaven.test.skip=true
## 2. 挨個安裝部署服務
## 註冊中心
cd osc-registry-service/
mvn clean deploy -Dmaven.test.skip=true
## 網關
cd ../osc-gateway-service/
mvn clean deploy -Dmaven.test.skip=true
## 斷路器聚合監控中心
cd ../osc-turbine-service/
mvn clean deploy -Dmaven.test.skip=true
## 鏈路跟蹤監控中心
cd ../osc-sleuth-service/
mvn clean deploy -Dmaven.test.skip=true
## 基礎工程
cd ../osc-base-service/osc-base-service-api/
mvn clean deploy -Dmaven.test.skip=true
cd ../osc-base-service-core/
mvn clean deploy -Dmaven.test.skip=true
## 日誌工程
cd ../../osc-log-service/osc-log-service-api/
mvn clean deploy -Dmaven.test.skip=true
cd ../osc-log-service-core/
mvn clean deploy -Dmaven.test.skip=true
## 3. 返回根目錄
cd ../../../
## 結束
echo [INFO] -------------------------- end -------------------------------------
echo [INFO] ------------------------------------------------------------------------
fi
else
## 入口
echo [INFO] ------------------------ 參數不正確 ---------------------------------
## 結束
echo [INFO] -------------------------- end -------------------------------------
echo [INFO] ------------------------------------------------------------------------
fi
非常簡單的一個腳本文件:判斷是否入參了應用名稱,如果有,就進行安裝部署操作
如何使用:
- 點擊
IDEA
底部的Terminal
終端入口 - 進入到項目根目錄
MacBook-Pro:osc-api zouwencong$ pwd
/Users/zouwencong/JavaWork/my_osc/osc-api
MacBook-Pro:osc-api zouwencong$ ls -all
total 64
drwxr-xr-x 13 zouwencong staff 416 Jun 5 21:50 .
drwxr-xr-x 7 zouwencong staff 224 Jun 6 16:22 ..
-rw-r--r--@ 1 zouwencong staff 8196 Jun 5 21:50 .DS_Store
drwxr-xr-x 15 zouwencong staff 480 Jun 5 22:21 .git
-rw-r--r--@ 1 zouwencong staff 428 Jun 13 18:47 .gitignore
drwxr-xr-x 7 zouwencong staff 224 Jun 16 08:58 .idea
-rw-r--r--@ 1 zouwencong staff 33 Jun 13 18:47 README.md
-rw-r--r--@ 1 zouwencong staff 5476 Jun 13 18:47 deploy.bat
-rwxr-xr-x@ 1 zouwencong staff 3744 Jun 13 18:47 deploy.sh
-rw-r--r--@ 1 zouwencong staff 1622 Jun 13 18:47 growth-version.bat
-rwxr-xr-x@ 1 zouwencong staff 1649 Jun 13 18:47 growth-version.sh
-rw-r--r--@ 1 zouwencong staff 122 Jun 13 18:47 old-version.bat
drwxr-xr-x@ 4 zouwencong staff 128 Jun 13 18:47 osc-commons
drwxr-xr-x@ 9 zouwencong staff 288 Jun 13 18:47 osc-service
MacBook-Pro:osc-api zouwencong$
- 輸入命令
./deploy.sh all
:這時會把所有的工程都項目編譯、單元測試、打包功能、安裝部署到本地倉庫、安裝部署到遠程倉庫 - 如果只想單獨部署指定的服務,那麼命令就是
./deploy.sh registry
:部署註冊中心服務工程
------------------- 2020.06.13 更新:歸類腳本文件 -------------------
- 目錄現在變成了這樣
MacBook-Pro:osc-api zouwencong$ ls -all
total 40
drwxr-xr-x 11 zouwencong staff 352 Jun 13 22:27 .
drwxr-xr-x 7 zouwencong staff 224 Jun 6 16:22 ..
-rw-r--r--@ 1 zouwencong staff 10244 Jun 13 23:03 .DS_Store
drwxr-xr-x 15 zouwencong staff 480 Jun 13 23:01 .git
-rw-r--r-- 1 zouwencong staff 428 Jun 4 11:47 .gitignore
drwxr-xr-x 11 zouwencong staff 352 Jun 13 23:07 .idea
-rw-r--r--@ 1 zouwencong staff 33 Nov 15 2019 README.md
drwxr-xr-x 4 zouwencong staff 128 Jan 10 11:28 logs
drwxr-xr-x 10 zouwencong staff 320 Jun 13 18:34 osc-commons
drwxr-xr-x 14 zouwencong staff 448 Jun 11 09:27 osc-service
drwxr-xr-x 5 zouwencong staff 160 Jun 13 22:27 script
MacBook-Pro:osc-api zouwencong$
- 腳本文件都放在了
script
目錄下,這時的命令就更改爲./script/deploy/deploy.sh all
核心命令:
mvn clean install -Dmaven.test.skip=true
:執行此命令會先清理target
目錄,再進行項目編譯、單元測試、打包功能、安裝部署到本地倉庫;加上-Dmaven.test.skip=true
參數則會跳過測試mvn clean deploy -Dmaven.test.skip=true
:執行此命令會先清理target
目錄,再進行項目編譯、單元測試、打包功能、安裝部署到本地倉庫、安裝部署到遠程倉庫;加上-Dmaven.test.skip=true
參數則會跳過測試
3.5.2 .bat
@echo off
REM ## 開始
echo [INFO] ----------------------------- start --------------------------------------
REM ## 獲取入參,應用名稱
set application_name=%1%
REM ## 輸出看一眼
echo application_name: %application_name%
REM ## 參數是否符合
REM set "is_true=false"
REM ## 輸出看一眼
REM echo is_true: %is_true%
REM ## 參數校驗
if "%application_name%" == "all" (
REM ## 入口
echo [INFO] ------------------------ 進入整個服務部署 ---------------------------------
REM ## 1. 安裝所有服務
REM ## commons
cd osc-commons/
mvn clean install -Dmaven.test.skip=true
mvn clean deploy -Dmaven.test.skip=true
REM ## service
cd ../osc-service/
mvn clean install -Dmaven.test.skip=true
REM ## 2. 挨個安裝部署服務
REM ## 註冊中心
cd osc-registry-service/
mvn clean deploy -Dmaven.test.skip=true
REM ## 網關
cd ../osc-gateway-service/
mvn clean deploy -Dmaven.test.skip=true
REM ## 斷路器聚合監控中心
cd ../osc-turbine-service/
mvn clean deploy -Dmaven.test.skip=true
REM ## 鏈路跟蹤監控中心
cd ../osc-sleuth-service/
mvn clean deploy -Dmaven.test.skip=true
REM ## 基礎工程
cd ../osc-base-service/osc-base-service-api/
mvn clean deploy -Dmaven.test.skip=true
cd ../osc-base-service-core/
mvn clean deploy -Dmaven.test.skip=true
REM ## 日誌工程
cd ../../osc-log-service/osc-log-service-api/
mvn clean deploy -Dmaven.test.skip=true
cd ../osc-log-service-core/
mvn clean deploy -Dmaven.test.skip=true
REM ## 3. 返回根目錄
cd ../../../
REM ## 結束
echo [INFO] -------------------------- end -------------------------------------
echo [INFO] ------------------------------------------------------------------------
) else (
REM ## 入口
echo [INFO] ------------------------ 進入單個服務部署 ---------------------------------
REM ## 1. 安裝所有服務
REM ## commons
cd osc-commons/
mvn clean install -Dmaven.test.skip=true
mvn clean deploy -Dmaven.test.skip=true
REM ## service
cd ../osc-service/
mvn clean install -Dmaven.test.skip=true
REM ## 參數校驗
if "%application_name%" == "registry" (
REM ## 2. 安裝部署指定服務
cd osc-%application_name%-service/
mvn clean deploy -Dmaven.test.skip=true
REM ## 3. 返回根目錄
cd ../../
) else (
if "%application_name%" == "gateway" (
REM ## 2. 安裝部署指定服務
cd osc-%application_name%-service/
mvn clean deploy -Dmaven.test.skip=true
REM ## 3. 返回根目錄
cd ../../
) else (
if "%application_name%" == "turbine" (
REM ## 2. 安裝部署指定服務
cd osc-%application_name%-service/
mvn clean deploy -Dmaven.test.skip=true
REM ## 3. 返回根目錄
cd ../../
) else (
if "%application_name%" == "sleuth" (
REM ## 2. 安裝部署指定服務
cd osc-%application_name%-service/
mvn clean deploy -Dmaven.test.skip=true
REM ## 3. 返回根目錄
cd ../../
) else (
if "%application_name%" == "base" (
REM ## 2. 安裝部署指定服務
cd osc-%application_name%-service/osc-%application_name%-service-api/
mvn clean deploy -Dmaven.test.skip=true
cd ../osc-%application_name%-service-core/
mvn clean deploy -Dmaven.test.skip=true
REM ## 3. 返回根目錄
cd ../../../
) else (
if "%application_name%" == "log" (
REM ## 2. 安裝部署指定服務
cd osc-%application_name%-service/osc-%application_name%-service-api/
mvn clean deploy -Dmaven.test.skip=true
cd ../osc-%application_name%-service-core/
mvn clean deploy -Dmaven.test.skip=true
REM ## 3. 返回根目錄
cd ../../../
) else (
REM ## 返回根目錄
cd ../
REM ## 入口
echo [INFO] ------------------------ 參數不正確 ---------------------------------
REM ## 結束
echo [INFO] -------------------------- end -------------------------------------
echo [INFO] ------------------------------------------------------------------------
)
)
)
)
)
)
)
與.sh
所要達到的效果與目的一致,所以就簡單說明一下存在差異的地方:
有哪些差異:
- 語法上的差異
- 執行方式的差異,
.bat
批處理腳本執行命令:deploy.bat all
------------------- 2020.06.13 更新:歸類腳本文件 -------------------
.bat
批處理腳本執行命令更改爲:script\deploy\deploy.bat all
4. 驗證
4.1 接口
- 下載
v1.4.4
標籤的代碼或者對照本篇博客更改v1.4.3
標籤的代碼 - 如果是
macOS
系統,則還需要設置.sh
腳本文件的可執行權限:chmod +x deploy.sh
- 點擊
IDEA
底部的Terminal
終端入口 - 進入到項目根目錄
- 根據不同系統,使用不同命令:
./script/deploy/deploy.sh all
或script\deploy\deploy.bat all
5. 結語
把重複的操作編寫到腳本里,提高效率節約時間,巴適。
希望能夠幫助到你
over