「初学者商城」- 接口 - 使用脚本简化部署操作(优化)

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




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