「初學者商城」- 接口 - 使用腳本簡化部署操作(優化)

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

v1.4.4 下載地址:ziptar.gz

注:對於標籤的說明「初學者商城」- 寫在最前面 #5.1


3. 接口


注:查看更改內容:使用腳本簡化部署操作

3.1 更改綁定執行動作

package更改爲deploy

原因:

package階段,命令只完成了項目編譯單元測試打包功能,而沒有安裝部署到本地倉庫和遠程倉庫;這時的package動作由於是構建推送docker鏡像的“觸發點”,就導致在本地倉庫和遠程倉庫都沒有相關依賴而報錯的結果。

那是否能綁定在install階段?答案是否定的installpackage項目編譯單元測試打包功能基礎上多一個安裝部署到本地倉庫的步驟,而我們是需要在此操作後纔來進行docker鏡像的構建和推送。

所以,最後更改爲綁定到deploy階段;其中deploy階段包括:項目編譯單元測試打包功能安裝部署到本地倉庫安裝部署到遠程倉庫

3.2 遠程私有倉庫:Nexus

注:之前配置的阿里雲鏡像倉庫地址供我們加速下載依賴,而這時想要安裝部署到遠程倉庫,就需要自己部署一個Maven的遠程私有倉庫

3.2.1 Nexus

Nexus是一個強大的Maven倉庫管理器,它不僅能維護自己內部的所有依賴,同時還能代理外部的鏡像倉庫;安裝容易上手簡單,並且還提供可視化的操作界面。

下面我們一起在Docker中安裝Nexus3

3.2.2 Docker 中安裝 Nexus3

  1. 拉取 Nexus 鏡像
[root@zwc ~]# systemctl start docker.service
[root@zwc ~]# docker pull sonatype/nexus3:3.17.0
  1. 配置 Nexus 數據目錄,以及賦予目錄讀寫執權限
[root@zwc ~]# cd /usr/local/
[root@zwc local]# mkdir nexus-data
[root@zwc local]# chmod -R 777 nexus-data/
  1. 運行 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 密碼

  1. 上面的步驟操作結束後,直接在瀏覽器中輸入ip:18081
  2. 順利進入到Nexus主頁後,點擊右上角Sign in按鈕
  3. Username: admin
  4. Password: 密碼在admin.password文件裏面記錄着
[root@zwc ~]# cd /usr/local/nexus-data/
[root@zwc nexus-data]# cat admin.password
  1. 成功登陸後,會有一個嚮導,用來重置admin密碼
  2. 點擊Next,輸入兩次新密碼,繼續Next
  3. 這一步提示是否需要開啓匿名訪問,爲了安全起見不需要,繼續Next
  4. 最後點擊Finish,完成

3.2.4 倉庫類型

  1. proxy:代理類型;遠程倉庫的代理,當在自己內部倉庫沒有的情況下會去代理倉庫中查找
  2. hosted:宿主類型;自己內部的倉庫
  3. group:倉庫組類型;配置多種類型的倉庫,然後對外暴露統一的地址即可訪問到這個組裏所有的倉庫

3.2.5 Policy 策略

hosted(宿主類型) 的倉庫裏,又有 Policy(策略) 的概念,主要分爲以下兩種:

  1. releases:線上發佈的版本倉庫
  2. snapshots:開發測試的版本倉庫

3.2.6 默認的倉庫

  1. maven-central:代理類型的倉庫,默認代理的倉庫地址是https://repo1.maven.org/maven2/
  2. maven-releases:宿主類型的倉庫,Policy 策略爲 releases,指自己內部線上發佈版本的倉庫
  3. maven-snapshots:宿主類型的倉庫,Policy 策略爲 snapshots,指自己內部開發測試版本的倉庫
  4. maven-public:倉庫組,目前包含上面三個倉庫

3.2.7 創建一個代理倉庫

注:默認的倉庫中只有一個Maven中央倉庫的代理,現在需要新建一個代理阿里雲鏡像的倉庫

  1. 點擊主頁頂部像設置一樣的圖標按鈕
  2. 在左側展開Repository,選擇Repositories
  3. 點擊Create repository按鈕,選擇maven2 (proxy)代理類型的倉庫
  4. Name: aliyun-proxy
  5. Proxy -> Remote storage: http://maven.aliyun.com/nexus/content/groups/public
  6. 填寫完上面兩項就翻到頁面最底部,點擊Create repository按鈕

3.2.8 把新建的代理倉庫放入倉庫組中

  1. 點擊進入maven-public倉庫組
  2. 找到Group -> Member repositories:
  3. 兩個大框框,左邊顯示的是還可以加入組中的倉庫,右邊顯示的是已經加入到組中的倉庫
  4. 現在把剛剛新建的代理倉庫添加到組中
  5. 點擊aliyun-proxy
  6. 點擊朝向右邊的箭頭(Add to Selected)
  7. 這時aliyun-proxy它就排在了最底下,上下排名是指訪問的優先前後
  8. 這裏需要把aliyun-proxy放在maven-central前面
  9. 接着點擊朝上邊的箭頭(Move Up)
  10. 最後點擊頁面最下方的Save按鈕
  11. 等待頁面的右上方會彈出相應的提示,顯示Success等信息表示操作成功

3.2.9 健康檢查

  1. 回到Repositories頁面
  2. 發現代理倉庫都有Health check項,現在來開啓一下
  3. 點擊aliyun-proxy倉庫的Analyze按鈕
  4. 點擊Yes, only this repository,僅僅就操作當前選擇的倉庫
  5. 點擊I Agree,我同意
  6. maven-central倉庫同上操作一遍

3.2.10 其他設置

部署策略:

  1. maven-releases倉庫默認是不允許重新部署的,對於自己測試使用很不方便,所以這裏更改爲允許重新部署
  2. 點擊進入maven-releases倉庫
  3. 找到Hosted -> Deployment policy:
  4. 下拉選擇Allow redeploy
  5. 點擊Save按鈕,保存
  6. 等待頁面的右上方會彈出相應的提示,顯示Success等信息表示操作成功

日誌報錯:

  1. 點擊主頁頂部像設置一樣的圖標按鈕
  2. 在左側展開System,選擇Capabilities
  3. 點擊Outreach: Management進入到管理能力詳情中
  4. 點擊上方Disable按鈕
  5. 等待頁面的右上方會彈出相應的提示,顯示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

非常簡單的一個腳本文件:判斷是否入參了應用名稱,如果有,就進行安裝部署操作

如何使用:

  1. 點擊IDEA底部的Terminal終端入口
  2. 進入到項目根目錄
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$ 
  1. 輸入命令./deploy.sh all:這時會把所有的工程都項目編譯單元測試打包功能安裝部署到本地倉庫安裝部署到遠程倉庫
  2. 如果只想單獨部署指定的服務,那麼命令就是./deploy.sh registry:部署註冊中心服務工程

------------------- 2020.06.13 更新:歸類腳本文件 -------------------

  1. 目錄現在變成了這樣
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$
  1. 腳本文件都放在了script目錄下,這時的命令就更改爲./script/deploy/deploy.sh all

核心命令:

  1. mvn clean install -Dmaven.test.skip=true:執行此命令會先清理target目錄,再進行項目編譯單元測試打包功能安裝部署到本地倉庫;加上-Dmaven.test.skip=true參數則會跳過測試
  2. 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所要達到的效果與目的一致,所以就簡單說明一下存在差異的地方:

有哪些差異:

  1. 語法上的差異
  2. 執行方式的差異,.bat批處理腳本執行命令:deploy.bat all

------------------- 2020.06.13 更新:歸類腳本文件 -------------------

  1. .bat批處理腳本執行命令更改爲:script\deploy\deploy.bat all

4. 驗證


4.1 接口

  1. 下載v1.4.4標籤的代碼或者對照本篇博客更改v1.4.3標籤的代碼
  2. 如果是macOS系統,則還需要設置.sh腳本文件的可執行權限:chmod +x deploy.sh
  3. 點擊IDEA底部的Terminal終端入口
  4. 進入到項目根目錄
  5. 根據不同系統,使用不同命令:./script/deploy/deploy.sh allscript\deploy\deploy.bat all

5. 結語


把重複的操作編寫到腳本里,提高效率節約時間,巴適。


希望能夠幫助到你

over




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章