• 持续部署Jenkins+Docker +Spring Cloud


    1.安装Jenkins

    1. 下载最新的安装包 此处用的是 jenkins-2.346.2-1.1.noarch.rpm

    下载地址是清华镜像:https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/jenkins-2.346.2-1.1.noarch.rpm

    1. 进行安装 rpm -ivh jenkins-2.346.2-1.1.noarch.rpm
    2. 修改java 配置地址 和Jenkins 配置文件 中 端口用户名 jenkins 目录的地址
    3. 重新加载 参数 systemctl daemon-reload
    4. 启动Jenkins
    5. 进入到jenkins/updates 修改链接地址

    sed -i ‘s#https://updates.jenkins.io/download#https://mirrors.tuna.tsinghua.edu.cn/jenkins#g’ default.json && sed -i ‘s#http://www.google.com#https://www.baidu.com#g’ default.json

    1. 安装推荐插件,再加入 Maven push SSH nodeJs 就行了
    2. 配置项目参数和git 地址 能拉下来就行

    真实操作 极其恶心

    1. 首先先Java8 安装 配置环境 不多说了 自行百度
    
    2. 去清华源下载jenkins 的安装文件(就是快)
    https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/?C=M&O=A
    
    3. 然后 按照安装Jenkins 的教程 最新的版本教程有出入 
    rpm -ivh  jenkins-2.346.2-1.1.noarch.rpm  
    
    4. 修改Jenkins配置 端口,用户,主home地址 
    vi /usr/lib/systemd/system/jenkins.service  
    注意:网上很多到 /etc/sysconfig/jenkins 高版本不生效 见下文
    https://blog.csdn.net/qq_41713884/article/details/123690713
    
    5. 修改 java环境地址 
    vim /etc/init.d/jenkins  
    
    6. 用systemctl start jenkins 
    
    环境问题导致的起不来:
    1.在/etc/init.d/jenkins 中将本机的java 目录放到最上面 
    2. 新增openjdk  配置
    yum install fontconfig java-8-openjdk
    3.创建一个软链接
    ln -s /data/java/bin/java  /usr/bin/java
    解决问题 恶心的来
    安装JDK的时候看好版本 86 是32位的 日了狗
    恶心到家了
    
    总结 插件安装能用就行 低版本的jenkins 不好用 11的不符合项目 所以只能使用 我安装的版本了
    但是出现了
    this version of the Java Runtime only recognizes class file versions up to 52.0 报错 
    我 又安装了一次 yum openjdk11 现在能拉下代码来了 坑很多 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    2.安装Docker

    https://blog.csdn.net/weixin_40461281/article/details/83153029
    https://lionli.blog.csdn.net/article/details/111220320

    3.安装harbor镜像私服仓库

    {
      "registry-mirrors": ["http://hub-mirror.c.163.com"],
      "insecure-registries":["43.142.124.79:8060"],
      "graph": "/home/docker"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    4.推送镜像到镜像仓库服务器

    1.登录远程镜像仓库
    docker login -u 用户名 -p 密码   仓库地址
    docker login -u suiquantong -p Suiqt@123 43.142.124.79:7600
    2.在项目中标记镜像:
    docker tag SOURCE_IMAGE[:TAG] 43.142.124.79:7600/demo1/REPOSITORY[:TAG]
    docker tag ruoyi/ruoyi-system:1.1.0 43.142.124.79:7600/demo1/ruoyi-system:1.1.0
    3.推送镜像到远程仓库 项目下
    docker push 仓库地址/项目名/镜像名称和版本
    docker push 43.142.124.79:7600/demo1/REPOSITORY[:TAG]
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    5.若依PLUS文件上传到服务器

    本人下拉镜像后,是通过docker-compose 进行打包的,所以需要将docker-compose.yml 文件上传到服务器上

    version: '3'
    
    services:
      mysql:
        image: mysql:8.0.29
        container_name: mysql
        environment:
          # 时区上海
          TZ: Asia/Shanghai
          # root 密码
          MYSQL_ROOT_PASSWORD: ruoyi123
          # 初始化数据库
          MYSQL_DATABASE: ry-cloud
        ports:
          - "3306:3306"
        volumes:
          # 数据挂载
          - /docker/mysql/data/:/var/lib/mysql/
          # 配置挂载
          - /docker/mysql/conf/:/etc/mysql/conf.d/
        command:
          # 将mysql8.0默认密码策略 修改为 原先 策略 (mysql8.0对其默认策略做了更改 会导致密码无法匹配)
          --default-authentication-plugin=mysql_native_password
          --character-set-server=utf8mb4
          --collation-server=utf8mb4_general_ci
          --explicit_defaults_for_timestamp=true
          --lower_case_table_names=1
        privileged: true
        network_mode: "host"
    
      nacos:
        image: nacos/nacos-server:v2.1.0
        container_name: nacos
        ports:
          - "8848:8848"
          - "9848:9848"
          - "9849:9849"
        environment:
          TZ: Asia/Shanghai
          MODE: standalone
          SPRING_DATASOURCE_PLATFORM: mysql
          MYSQL_SERVICE_HOST: 127.0.0.1
          MYSQL_SERVICE_PORT: 3306
          MYSQL_SERVICE_USER: root
          MYSQL_SERVICE_PASSWORD: ruoyi123
          MYSQL_SERVICE_DB_NAME: ry-config
          MYSQL_SERVICE_DB_PARAM: characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
        volumes:
          - /docker/nacos/logs/:/home/nacos/logs
          - /docker/nacos/config/custom.properties:/home/nacos/init.d/custom.properties
        privileged: true
        network_mode: "host"
    
      redis:
        image: redis:6.2.7
        container_name: redis
        ports:
          - "6379:6379"
        environment:
          # 时区上海
          TZ: Asia/Shanghai
        volumes:
          # 配置文件
          - /docker/redis/conf:/redis/config
          # 数据文件
          - /docker/redis/data/:/redis/data/
        command: "redis-server /redis/config/redis.conf"
        privileged: true
        network_mode: "host"
    
      minio:
        image: minio/minio:RELEASE.2022-05-26T05-48-41Z
        container_name: minio
        ports:
          # api 端口
          - "9000:9000"
          # 控制台端口
          - "9001:9001"
        environment:
          # 时区上海
          TZ: Asia/Shanghai
          # 管理后台用户名
          MINIO_ACCESS_KEY: ruoyi
          # 管理后台密码,最小8个字符
          MINIO_SECRET_KEY: ruoyi123
          # https需要指定域名
          MINIO_SERVER_URL: ""
          # 开启压缩 on 开启 off 关闭
          MINIO_COMPRESS: "off"
          # 扩展名 .pdf,.doc 为空 所有类型均压缩
          MINIO_COMPRESS_EXTENSIONS: ""
          # mime 类型 application/pdf 为空 所有类型均压缩
          MINIO_COMPRESS_MIME_TYPES: ""
        volumes:
          # 映射当前目录下的data目录至容器内/data目录
          - /docker/minio/data:/data
          # 映射配置目录
          - /docker/minio/config:/root/.minio/
        command: server --address ':9000' --console-address ':9001' /data  # 指定容器中的目录 /data
        privileged: true
        network_mode: "host"
    
      ruoyi-seata-server:
        image: 43.142.124.79:8060/tyjr/ruoyi-seata-server:1.2.0
        container_name: ruoyi-seata-server
        ports:
          - "7091:7091"
          - "8091:8091"
        environment:
          TZ: Asia/Shanghai
          # 注意 此处ip如果是外网使用 要改为外网ip
          SEATA_IP: 43.142.241.220
          SEATA_PORT: 8091
          DUBBO_IP_TO_REGISTRY: 43.142.241.220
          # 注册到注册中心的端口
          DUBBO_PORT_TO_REGISTRY: 8091
          DUBBO_PORT_TO_BIND: 8091
        volumes:
          - /docker/ruoyi-seata-server/logs/:/ruoyi/seata-server/logs
        privileged: true
        network_mode: "host"
    
      nginx-web:
        image: nginx:1.21.6
        container_name: nginx-web
        environment:
          # 时区上海
          TZ: Asia/Shanghai
        ports:
          - "80:80"
          - "443:443"
        volumes:
          # 证书映射
          - /docker/nginx/cert:/etc/nginx/cert
          # 配置文件映射
          - /docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
          # 页面目录
          - /docker/nginx/html:/usr/share/nginx/html
          # 日志目录
          - /docker/nginx/log:/var/log/nginx
        privileged: true
        network_mode: "host"
    
      sentinel:
        image: 43.142.124.79:8060/tyjr/ruoyi-sentinel-dashboard:1.2.0
        container_name: sentinel
        environment:
          TZ: Asia/Shanghai
        ports:
          - "8718:8718"
        volumes:
          # 配置文件
          - /docker/ruoyi-sentinel-dashboard/logs/:/ruoyi/sentinel-dashboard/logs
        restart: always
        network_mode: "host"
    
      ruoyi-monitor-admin:
        image: 43.142.124.79:8060/tyjr/ruoyi-monitor:1.2.0
        container_name: ruoyi-monitor
        environment:
          # 时区上海
          TZ: Asia/Shanghai
        ports:
          - "9100:9100"
        volumes:
          # 配置文件
          - /docker/ruoyi-monitor/logs/:/ruoyi/monitor/logs
        privileged: true
        network_mode: "host"
    
      ruoyi-xxl-job-admin:
        image: 43.142.124.79:8060/tyjr/ruoyi-xxl-job-admin:1.2.0
        container_name: ruoyi-xxl-job-admin
        environment:
          # 时区上海
          TZ: Asia/Shanghai
        ports:
          - "9900:9900"
        volumes:
          # 配置文件
          - /docker/ruoyi-xxl-job-admin/logs/:/ruoyi/xxl-job-admin/logs
        privileged: true
        network_mode: "host"
    
      ruoyi-gateway:
        image: 43.142.124.79:8060/tyjr/ruoyi-gateway:1.2.0
        container_name: ruoyi-gateway
        environment:
          # 时区上海
          TZ: Asia/Shanghai
        ports:
          - "8080:8080"
        volumes:
          # 配置文件
          - /docker/ruoyi-gateway/logs/:/ruoyi/gateway/logs
        privileged: true
        network_mode: "host"
    
      ruoyi-auth:
        image: 43.142.124.79:8060/tyjr/ruoyi-auth:1.2.0
        container_name: ruoyi-auth
        environment:
          # 时区上海
          TZ: Asia/Shanghai
        ports:
          - "9200:9200"
        volumes:
          # 配置文件
          - /docker/ruoyi-auth/logs/:/ruoyi/auth/logs
        privileged: true
        network_mode: "host"
    
      ruoyi-system:
        image: 43.142.124.79:8060/tyjr/ruoyi-system:1.2.0
        container_name: ruoyi-system
        environment:
          # 时区上海
          TZ: Asia/Shanghai
        ports:
          - "9201:9201"
        volumes:
          # 配置文件
          - /docker/ruoyi-system/logs/:/ruoyi/system/logs
        privileged: true
        network_mode: "host"
    
      ruoyi-gen:
        image: 43.142.124.79:8060/tyjr/ruoyi-gen:1.2.0
        container_name: ruoyi-gen
        environment:
          # 时区上海
          TZ: Asia/Shanghai
          SEATA_IP: 49.234.46.246
        ports:
          - "9202:9202"
        volumes:
          # 配置文件
          - /docker/ruoyi-gen/logs/:/ruoyi/gen/logs
        privileged: true
        network_mode: "host"
    
      ruoyi-job:
        image: 43.142.124.79:8060/tyjr/ruoyi-job:1.2.0
        container_name: ruoyi-job
        environment:
          # 时区上海
          TZ: Asia/Shanghai
        ports:
          - "9203:9203"
        volumes:
          # 配置文件
          - /docker/ruoyi-job/logs/:/ruoyi/job/logs
        privileged: true
        network_mode: "host"
    
      ruoyi-resource:
        image: 43.142.124.79:8060/tyjr/ruoyi-resource:1.2.0
        container_name: ruoyi-resource
        environment:
          # 时区上海
          TZ: Asia/Shanghai
          SEATA_IP: 49.234.46.246
          # 注册到注册中心的IP,这里我们选择宿主机的IP
          DUBBO_IP_TO_REGISTRY: 49.234.46.246
          # 注册到注册中心的端口
          DUBBO_PORT_TO_REGISTRY: 20881
          DUBBO_PORT_TO_BIND: 20881
        ports:
          - "9300:9300"
          - "20881:20881"
        volumes:
          # 配置文件
          - /docker/ruoyi-resource/logs/:/ruoyi/resource/logs
        privileged: true
        network_mode: "host"
    
    
    #################################################################################################
    #################################### 以下为扩展根据需求搭建 #########################################
    #################################################################################################
    
      elasticsearch:
        image: elasticsearch:7.17.2
        container_name: elasticsearch
        ports:
          - "9200:9200"
          - "9300:9300"
        environment:
          # 设置集群名称
          cluster.name: elasticsearch
          # 以单一节点模式启动
          discovery.type: single-node
          ES_JAVA_OPTS: "-Xms512m -Xmx512m"
        volumes:
          - /docker/elk/elasticsearch/plugins:/usr/share/elasticsearch/plugins
          - /docker/elk/elasticsearch/data:/usr/share/elasticsearch/data
          - /docker/elk/elasticsearch/logs:/usr/share/elasticsearch/logs
        network_mode: "host"
    
      kibana:
        image: kibana:7.17.2
        container_name: kibana
        ports:
          - "5601:5601"
        depends_on:
          # kibana在elasticsearch启动之后再启动
          - elasticsearch
        environment:
          #设置系统语言文中文
          I18N_LOCALE: zh-CN
          # 访问域名
          # SERVER_PUBLICBASEURL: https://kibana.cloud.com
        volumes:
          - /docker/elk/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml
        network_mode: "host"
    
      logstash:
        image: logstash:7.17.2
        container_name: logstash
        ports:
          - "4560:4560"
        volumes:
          - /docker/elk/logstash/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
          - /docker/elk/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml
        depends_on:
          - elasticsearch
        network_mode: "host"
    
      mqnamesrv:
        image: apache/rocketmq:4.9.4
        container_name: mqnamesrv
        ports:
          - "9876:9876"
        environment:
          JAVA_OPT: -server -Xms512m -Xmx512m
        command: sh mqnamesrv
        volumes:
          - /docker/rocketmq/namesrv/logs:/home/rocketmq/logs/rocketmqlogs
        network_mode: "host"
    
      mqbroker1:
        image: apache/rocketmq:4.9.4
        container_name: mqbroker1
        ports:
          - "10911:10911"
          - "10909:10909"
          - "10912:10912"
        environment:
          JAVA_OPT_EXT: -server -Xms512M -Xmx512M -Xmn256m
        command: sh mqbroker -c /home/rocketmq/rocketmq-4.9.4/conf/broker.conf
        depends_on:
          - mqnamesrv
        volumes:
          - /docker/rocketmq/broker1/conf/broker.conf:/home/rocketmq/rocketmq-4.9.4/conf/broker.conf
          - /docker/rocketmq/broker1/logs:/home/rocketmq/logs/rocketmqlogs
          - /docker/rocketmq/broker1/store:/home/rocketmq/store
        network_mode: "host"
    
      mqconsole:
        image: styletang/rocketmq-console-ng
        container_name: mqconsole
        ports:
          - "19876:19876"
        environment:
          JAVA_OPTS: -Dserver.port=19876 -Drocketmq.namesrv.addr=127.0.0.1:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false
        depends_on:
          - mqnamesrv
        network_mode: "host"
    
      rabbitmq:
        image: rabbitmq:3.10.6
        container_name: rabbitmq
        build:
          context: ./rabbitmq
        environment:
          RABBITMQ_DEFAULT_USER: ruoyi
          RABBITMQ_DEFAULT_PASS: ruoyi123
        ports:
          - "15672:15672" # 管理界面端口
          - "5672:5672"   # api 端口
        volumes:
          - /docker/rabbitmq/log:/var/log/rabbitmq
          - /docker/rabbitmq/data:/var/lib/rabbitmq
        network_mode: "host"
    
      zookeeper:
        image: 'bitnami/zookeeper:3.8.0'
        container_name: zookeeper
        ports:
          - "2181:2181"
        environment:
          TZ: Asia/Shanghai
          ALLOW_ANONYMOUS_LOGIN: "yes"
          ZOO_SERVER_ID: 1
          ZOO_PORT_NUMBER: 2181
        network_mode: "host"
    
      kafka:
        image: 'bitnami/kafka:3.2.0'
        container_name: kafka
        ports:
          - "9092:9092"
        environment:
          TZ: Asia/Shanghai
          # 更多变量 查看文档 https://github.com/bitnami/bitnami-docker-kafka/blob/master/README.md
          KAFKA_BROKER_ID: 1
          # 监听端口
          KAFKA_CFG_LISTENERS: PLAINTEXT://:9092
          # 实际访问ip 本地用 127 内网用 192 外网用 外网ip
          KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://192.168.31.165:9092
          KAFKA_CFG_ZOOKEEPER_CONNECT: 127.0.0.1:2181
          ALLOW_PLAINTEXT_LISTENER: "yes"
        volumes:
          - /docker/kafka/data:/bitnami/kafka/data
        depends_on:
          - zookeeper
        network_mode: "host"
    
      kafka-manager:
        image: sheepkiller/kafka-manager:latest
        container_name: kafka-manager
        ports:
          - "19092:19092"
        environment:
          ZK_HOSTS: 127.0.0.1:2181
          APPLICATION_SECRET: letmein
          KAFKA_MANAGER_USERNAME: ruoyi
          KAFKA_MANAGER_PASSWORD: ruoyi123
          KM_ARGS: -Dhttp.port=19092
        depends_on:
          - kafka
        network_mode: "host"
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243
    • 244
    • 245
    • 246
    • 247
    • 248
    • 249
    • 250
    • 251
    • 252
    • 253
    • 254
    • 255
    • 256
    • 257
    • 258
    • 259
    • 260
    • 261
    • 262
    • 263
    • 264
    • 265
    • 266
    • 267
    • 268
    • 269
    • 270
    • 271
    • 272
    • 273
    • 274
    • 275
    • 276
    • 277
    • 278
    • 279
    • 280
    • 281
    • 282
    • 283
    • 284
    • 285
    • 286
    • 287
    • 288
    • 289
    • 290
    • 291
    • 292
    • 293
    • 294
    • 295
    • 296
    • 297
    • 298
    • 299
    • 300
    • 301
    • 302
    • 303
    • 304
    • 305
    • 306
    • 307
    • 308
    • 309
    • 310
    • 311
    • 312
    • 313
    • 314
    • 315
    • 316
    • 317
    • 318
    • 319
    • 320
    • 321
    • 322
    • 323
    • 324
    • 325
    • 326
    • 327
    • 328
    • 329
    • 330
    • 331
    • 332
    • 333
    • 334
    • 335
    • 336
    • 337
    • 338
    • 339
    • 340
    • 341
    • 342
    • 343
    • 344
    • 345
    • 346
    • 347
    • 348
    • 349
    • 350
    • 351
    • 352
    • 353
    • 354
    • 355
    • 356
    • 357
    • 358
    • 359
    • 360
    • 361
    • 362
    • 363
    • 364
    • 365
    • 366
    • 367
    • 368
    • 369
    • 370
    • 371
    • 372
    • 373
    • 374
    • 375
    • 376
    • 377
    • 378
    • 379
    • 380
    • 381
    • 382
    • 383
    • 384
    • 385
    • 386
    • 387
    • 388
    • 389
    • 390
    • 391
    • 392
    • 393
    • 394
    • 395
    • 396
    • 397
    • 398
    • 399
    • 400
    • 401
    • 402
    • 403
    • 404
    • 405
    • 406
    • 407
    • 408
    • 409
    • 410
    • 411
    • 412
    • 413
    • 414
    • 415
    • 416
    • 417
    • 418
    • 419
    • 420
    • 421
    • 422
    • 423
    • 424
    • 425
    • 426
    • 427
    • 428
    • 429
    • 430
    • 431
    • 432
    • 433

    6.JenkinsFile 编写

    1.使用JenkinsFile 生成地址
    http://43.142.124.79:8888/job/QT-Cloud-Server/pipeline-syntax/
    根据若依-plus的情况,将微服务分成三组 构建三个Jenkins 流水线服务
    ![image.png](https://img-blog.csdnimg.cn/img_convert/89800b0981c73055645a47a09b906157.png#clientId=u89a456ae-8013-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=222&id=u1511a9eb&margin=[object Object]&name=image.png&originHeight=278&originWidth=1552&originalType=binary&ratio=1&rotation=0&showTitle=false&size=51284&status=done&style=none&taskId=u0ed1e4d4-a8bf-43f1-91aa-b8d12743295&title=&width=1241.6)
    Jenkinsfile_Pulic 公共模块

    //git 凭证id
    def git_auth="0dbfe1d3-6f31-4040-b020-261362eea907"
    //git 地址
    def git_url="https://gitee.com/quantongsui/QT-Cloud-Server.git"
    //版本号
    def tag="1.2.0"
    // harbor_url
    def harbor_url ="43.142.124.79:8060"
    //镜像库名称
    def harbor_project="tyjr"
    //镜像库账号密码
    def harbor_auth="281ac9d6-ec25-48c7-8d81-6e60e7d0e5ee"
    //def harbor_username="suiquantong"
    //def harbor_password="Suiqt@123"
    
    node {
    
            //把选择的项目信息转为数组
        def selectedProjects = "${project_name}".split(',')
    
        stage("拉取代码"){
            echo "拉取代码"
            checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
        }
        stage("代码审查"){
              //定义jenkins 插件中的插件 类似于maven的配置方式 需要公共工具的地址
              echo "代码审查"
              //删除 空的镜像
              //sh "docker images|grep none|awk '{print \$3}'|xargs docker rmi -f"
        }
        stage("编译安装公共子工程"){
              //定义jenkins 插件中的插件 类似于maven的配置方式 需要公共工具的地址
              echo "编译安装公共子工程"
              //bom
              sh "mvn -f ruoyi-common/ruoyi-common-alibaba-bom  clean install"
              sh "mvn -f ruoyi-common/ruoyi-common-bom  clean install"
              sh "mvn -f ruoyi-api/ruoyi-api-bom  clean install"
              sh "mvn -f ruoyi-api/ruoyi-api-system  clean install"
              // 1.common 2.api  注意先后顺序api
              sh "mvn clean install -pl  ruoyi-common,ruoyi-api -am"
              //如果升到1.3或者更高 第一次需要打包的时候 可能需要 全部install  这样公共模块的包才能保存到maven 私服仓库中
    //        sh "mvn clean install -D maven.test.skip=true -P prod"
        }
        stage("打包构建微服务,上传镜像"){
              //定义jenkins 插件中的插件 类似于maven的配置方式 需要公共工具的地址
              echo "打包构建微服务"
              for(int i=0;i<selectedProjects.size();i++){
                 //取出每个项目的名称和端口
                 def currentProject = selectedProjects[i];
                 //项目名称
                 def currentProjectName = currentProject.split('@')[0]
                 //定义镜像名称
                 def imageName = "${currentProjectName}:${tag}"
    
                 sh "mvn -f ${currentProjectName} package -D maven.test.skip=true -P prod  docker:build"
                 echo "打标签:${imageName}"
                 sh "docker tag ruoyi/${imageName} ${harbor_url}/${harbor_project}/${imageName}"
    
                 withCredentials([usernamePassword(credentialsId: "${harbor_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {
                    //登录harbor
                    sh "docker login -u ${username} -p ${password} ${harbor_url}"
                     //上传
                    sh "docker push ${harbor_url}/${harbor_project}/${imageName}"
    
                    echo "推送镜像:${imageName} 成功"
    
                    //删除本地镜像
                    sh "docker rmi -f royi/${imageName}"
                    sh "docker rmi -f ${harbor_url}/${harbor_project}/${imageName}"
                 }
                //部署
                sshPublisher(publishers: [sshPublisherDesc(configName: '43.142.177.41', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "/data/shell/deploy.sh $harbor_url $harbor_project $currentProjectName $tag", execTimeout: 990000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                echo "${currentProjectName}部署成功"
    
              }
    
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79

    Jenkinsfile_Modules 业务模块

    //git 凭证id
    def git_auth="0dbfe1d3-6f31-4040-b020-261362eea907"
    //git 地址
    def git_url="https://gitee.com/quantongsui/QT-Cloud-Server.git"
    //版本号
    def tag="1.2.0"
    // harbor_url
    def harbor_url ="43.142.124.79:8060"
    //镜像库名称
    def harbor_project="tyjr"
    //镜像库账号密码
    def harbor_auth="281ac9d6-ec25-48c7-8d81-6e60e7d0e5ee"
    //def harbor_username="suiquantong"
    //def harbor_password="Suiqt@123"
    
    node {
    
            //把选择的项目信息转为数组
        def selectedProjects = "${project_name}".split(',')
    
        stage("拉取代码"){
            echo "拉取代码"
            checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
        }
        stage("代码审查"){
              //定义jenkins 插件中的插件 类似于maven的配置方式 需要公共工具的地址
              echo "代码审查"
              //删除 空的镜像
              //sh "docker images|grep none|awk '{print \$3}'|xargs docker rmi -f"
        }
        stage("编译安装公共子工程"){
              //定义jenkins 插件中的插件 类似于maven的配置方式 需要公共工具的地址
              echo "编译安装公共子工程"
              //bom
              sh "mvn -f ruoyi-common/ruoyi-common-alibaba-bom  clean install"
              sh "mvn -f ruoyi-common/ruoyi-common-bom  clean install"
              sh "mvn -f ruoyi-api/ruoyi-api-bom  clean install"
              // 1.common 2.api  注意先后顺序api
              sh "mvn clean install -pl  ruoyi-common,ruoyi-api -am"
             //如果升到1.3或者更高 第一次需要打包的时候 可能需要 全部install  这样公共模块的包才能保存到maven 私服仓库中
             //sh "mvn clean install -D maven.test.skip=true -P prod"
        }
        stage("打包构建微服务,上传镜像"){
              //定义jenkins 插件中的插件 类似于maven的配置方式 需要公共工具的地址
              echo "打包构建微服务"
              for(int i=0;i<selectedProjects.size();i++){
                 //取出每个项目的名称和端口
                 def currentProject = selectedProjects[i];
                 //项目名称
                 def currentProjectName = currentProject.split('@')[0]
                 //定义镜像名称
                 def imageName = "${currentProjectName}:${tag}"
    
                 sh "mvn -f ruoyi-modules/${currentProjectName} package -D maven.test.skip=true -P prod  docker:build"
                 echo "打标签:${imageName}"
                 sh "docker tag ruoyi/${imageName} ${harbor_url}/${harbor_project}/${imageName}"
    
                 withCredentials([usernamePassword(credentialsId: "${harbor_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {
                    //登录harbor
                    sh "docker login -u ${username} -p ${password} ${harbor_url}"
                     //上传
                    sh "docker push ${harbor_url}/${harbor_project}/${imageName}"
    
                    echo "推送镜像:${imageName} 成功"
    
                    //删除本地镜像
                    sh "docker rmi -f royi/${imageName}"
                    sh "docker rmi -f ${harbor_url}/${harbor_project}/${imageName}"
                 }
                 sshPublisher(publishers: [sshPublisherDesc(configName: '49.234.46.246', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "/data/shell/deploy.sh $harbor_url $harbor_project $currentProjectName $tag", execTimeout: 990000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '/')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                 echo "${currentProjectName}部署成功"
              }
    
        }
    //    stage("部署服务"){
    //        sshPublisher(publishers: [sshPublisherDesc(configName: '43.142.177.41', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "/data/shell/deploy.sh $harbor_url $harbor_project $project_name $tag", execTimeout: 990000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
    //
    //    }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79

    Jenkinsfile_Visual 组件功能模块

    //git 凭证id
    def git_auth="0dbfe1d3-6f31-4040-b020-261362eea907"
    //git 地址
    def git_url="https://gitee.com/quantongsui/QT-Cloud-Server.git"
    //版本号
    def tag="1.2.0"
    // harbor_url
    def harbor_url ="43.142.124.79:8060"
    //镜像库名称
    def harbor_project="tyjr"
    //镜像库账号密码
    def harbor_auth="281ac9d6-ec25-48c7-8d81-6e60e7d0e5ee"
    //def harbor_username="suiquantong"
    //def harbor_password="Suiqt@123"
    
    node {
    
            //把选择的项目信息转为数组
        def selectedProjects = "${project_name}".split(',')
    
        stage("拉取代码"){
            echo "拉取代码"
            checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
        }
        stage("代码审查"){
              //定义jenkins 插件中的插件 类似于maven的配置方式 需要公共工具的地址
              echo "代码审查"
              //删除 空的镜像
              //sh "docker images|grep none|awk '{print \$3}'|xargs docker rmi -f"
        }
        stage("编译安装公共子工程"){
              //定义jenkins 插件中的插件 类似于maven的配置方式 需要公共工具的地址
              echo "编译安装公共子工程"
              //bom
              sh "mvn -f ruoyi-common/ruoyi-common-alibaba-bom  clean install"
              sh "mvn -f ruoyi-common/ruoyi-common-bom  clean install"
              sh "mvn -f ruoyi-api/ruoyi-api-bom  clean install"
              // 1.common 2.api  注意先后顺序api
              sh "mvn clean install -pl  ruoyi-common,ruoyi-api -am"
             //如果升到1.3或者更高 第一次需要打包的时候 可能需要 全部install  这样公共模块的包才能保存到maven 私服仓库中
             //sh "mvn clean install -D maven.test.skip=true -P prod"
        }
        stage("打包构建微服务,上传镜像"){
              //定义jenkins 插件中的插件 类似于maven的配置方式 需要公共工具的地址
              echo "打包构建微服务"
              for(int i=0;i<selectedProjects.size();i++){
                 //取出每个项目的名称和端口
                 def currentProject = selectedProjects[i];
                 //项目名称
                 def currentProjectName = currentProject.split('@')[0]
                 //定义镜像名称
                 def imageName = "${currentProjectName}:${tag}"
    
                 sh "mvn -f ruoyi-visual/${currentProjectName} package -D maven.test.skip=true -P prod  docker:build"
                 echo "打标签:${imageName}"
                 sh "docker tag ruoyi/${imageName} ${harbor_url}/${harbor_project}/${imageName}"
    
                 withCredentials([usernamePassword(credentialsId: "${harbor_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {
                    //登录harbor
                    sh "docker login -u ${username} -p ${password} ${harbor_url}"
                     //上传
                    sh "docker push ${harbor_url}/${harbor_project}/${imageName}"
    
                    echo "推送镜像:${imageName} 成功"
    
                    //删除本地镜像
                    sh "docker rmi -f royi/${imageName}"
                    sh "docker rmi -f ${harbor_url}/${harbor_project}/${imageName}"
                 }
                 sshPublisher(publishers: [sshPublisherDesc(configName: 'nginx', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "/data/shell/deploy.sh $harbor_url $harbor_project $currentProjectName $tag", execTimeout: 990000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '/')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                 echo "${currentProjectName}部署成功"
              }
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    #! /bin/bash
    #接收外部参数
    harbor_url=$1
    harbor_project=$2
    project_name=$3
    tag=$4
    
    
    imageName=$harbor_url/$harbor_project/$project_name:$tag
    
    echo "$imageName"
    
    #查询容器是否存在,存在则删除
    containerId=`docker ps -a | grep -w ${project_name}:${tag} | awk '{print $1}'`
    
    if [ "$containerId" !=  "" ] ; then
    #停掉容器
    docker stop $containerId
    
    #删除容器
    docker rm   $containerId
    
    echo "成功删除容器"
    
    fi
    
    #查询镜像是否存在,存在则删除
    imageId=`docker images | grep -w $project_name | awk '{print $3}'`
    
    if [ "$imageId" != "" ] ; then
    #删除镜像
    docker rmi -f $imageId
    
    echo "成功删除镜像"
    
    fi
    
    
    # 登录Harbor私服
    docker login -u suiquantong -p Suiqt@123 $harbor_url
    # 下载镜像
    docker pull $imageName
    # 启动容器
    
    cd   /root/docker/
    
    docker-compose up -d $project_name
    
    echo "容器启动成功"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    echo "run backend.sh"
    nowtime=$(date "+%Y%m%d%H%M%S")
    echo $nowtime
    cd /data/frontend
    mv dist backup/dist$nowtime
    
    cd /data/frontend
    ls
    
    tar -zxvf dist.tar.gz
    
    cp -r dist/* /docker/nginx/html
    
    echo "frontend success"
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    SonarScanner 代码审核安装配置

    ![image.png](https://img-blog.csdnimg.cn/img_convert/d67426d70929994572a3cd588bd60154.png#clientId=uab7ddee3-5f1a-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=361&id=ua587af4f&margin=[object Object]&name=image.png&originHeight=451&originWidth=982&originalType=binary&ratio=1&rotation=0&showTitle=false&size=103807&status=done&style=none&taskId=ud01425bf-7b5d-460b-8c2a-3bfcc72b770&title=&width=785.6)![image.png](https://img-blog.csdnimg.cn/img_convert/9a22bfd469e97eedd0d742c7184bb0c1.png#clientId=uab7ddee3-5f1a-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=399&id=udbcbe39e&margin=[object Object]&name=image.png&originHeight=499&originWidth=1008&originalType=binary&ratio=1&rotation=0&showTitle=false&size=140002&status=done&style=none&taskId=ue626ef30-1acb-4e0e-afed-23649f1f39d&title=&width=806.4)![image.png](https://img-blog.csdnimg.cn/img_convert/6e042131dce5473426c215d005bf5c4d.png#clientId=uab7ddee3-5f1a-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=215&id=u93da72bc&margin=[object Object]&name=image.png&originHeight=269&originWidth=612&originalType=binary&ratio=1&rotation=0&showTitle=false&size=81064&status=done&style=none&taskId=ucf34d176-880b-4876-b489-16e9d9aece4&title=&width=489.6)

    Shell文件格式错误

    sed -i 's/\r//'  depuy.sh
    
    • 1

    升级时发生的问题记录

    每次要运行之前要在本地打一次包,把包放到私有仓库去 ,这样后面相互调用 打包的时候就不会报错
    
    • 1

    Dubbo 是绑定当前网卡,如果您的几个服务器之前不能互通,服务基本无法正常使用,但是我为了学习Docker 和Jenkins 能确定正常上传镜像 下载镜像 进行部署即可 不需要 确认服务是否正常 所以要注意这个地方,我没试过

    附录文档地址:

    RuoYi-Cloud-Plus https://gitee.com/JavaLionLi/RuoYi-Cloud-Plus
    文档地址:https://gitee.com/JavaLionLi/RuoYi-Cloud-Plus/wikis/pages
    整个项目教程 学习文档 参考黑马成需要的 BILIBILI 视频学习 PDF 文件
    https://www.bilibili.com/video/BV1kJ411p7mV?share_source=copy_pc
    deploy.shfrontend.sh

  • 相关阅读:
    【蓝桥备战】快速排序+归并排序+二分查找 基本实现
    全国计算机三级嵌入式 - 题库 - 真题(含答案) - 未来教育 - 视频讲解 - 资料获取
    【QT教程】QT6 QML在工业控制系统中的应用
    做知识付费,这十大知识付费平台一定要知道
    静态代理和动态代理笔记
    WebRTC音视频开发读书笔记(四)
    『手撕Vue-CLI』添加终端用户交互
    初级前端面试题之网络相关
    MySQL——六、库表操作(下篇)
    Java8新特性之Lambda表达式
  • 原文地址:https://blog.csdn.net/qq_36651772/article/details/126307047