Kubernetes实战——部署微服务项目(二)

目录

一、数据库

二、项目结构

三、项目部署

1、修改maven私服

2、配置Jenkins

2.1 、添加Extended Choice Parameter 插件

2.2、构建PipeLine

2.2.1 、构建Git参数

 2.2.2、 Extended Choice Parameter

2.2.3、构建 docker镜像仓库参数

 2.2.4、构建副本数参数

 2.3、Pipeline script from SCM

四、配置文件

1、Jenkinsfile

2、Shell脚本

 3、网关Dockerfile

4、网关deployment.yml

5、网关service.yml

6、ingress.yml

7、其他配置文件

五、测试

1、查看资源

2、接口测试


一、数据库

/*
 Navicat Premium Data Transfer

 Source Server         : 192.168.139.208
 Source Server Type    : MySQL
 Source Server Version : 50733
 Source Host           : 192.168.139.208:30002
 Source Schema         : shop_uaa_test

 Target Server Type    : MySQL
 Target Server Version : 50733
 File Encoding         : 65001

 Date: 28/11/2024 16:47:24
*/

CREATE DATABASE  IF NOT EXISTS shop_uaa_test;

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for tb_login_log
-- ----------------------------
DROP TABLE IF EXISTS `tb_login_log`;
CREATE TABLE `tb_login_log`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NULL DEFAULT NULL COMMENT '登录人id',
  `log_ip` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT 'ip',
  `login_time` datetime NULL DEFAULT NULL COMMENT '登陆时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of tb_login_log
-- ----------------------------

-- ----------------------------
-- Table structure for tb_user
-- ----------------------------
DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '手机号',
  `nickname` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '昵称',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of tb_user
-- ----------------------------

SET FOREIGN_KEY_CHECKS = 1;
/*
 Navicat Premium Data Transfer

 Source Server         : 192.168.139.208
 Source Server Type    : MySQL
 Source Server Version : 50733
 Source Host           : 192.168.139.208:30002
 Source Schema         : shop_order_test

 Target Server Type    : MySQL
 Target Server Version : 50733
 File Encoding         : 65001

 Date: 28/11/2024 16:47:05
*/


CREATE DATABASE  IF NOT EXISTS shop_order_test;

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for tb_order_info
-- ----------------------------
DROP TABLE IF EXISTS `tb_order_info`;
CREATE TABLE `tb_order_info`  (
  `order_no` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `user_id` bigint(20) NULL DEFAULT NULL,
  `product_id` bigint(20) NULL DEFAULT NULL,
  `product_img` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `delivery_addr_id` bigint(20) NULL DEFAULT NULL,
  `product_name` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `product_count` int(11) NULL DEFAULT NULL,
  `product_price` decimal(10, 2) NULL DEFAULT NULL,
  `seckill_price` decimal(10, 2) NULL DEFAULT NULL,
  `status` tinyint(4) NULL DEFAULT NULL,
  `create_date` datetime NULL DEFAULT NULL,
  `pay_date` datetime NULL DEFAULT NULL,
  `seckill_date` date NULL DEFAULT NULL,
  `sekill_time` int(11) NULL DEFAULT NULL,
  `intergral` decimal(10, 0) NULL DEFAULT NULL,
  `seckill_id` bigint(20) NULL DEFAULT NULL,
  `pay_type` tinyint(4) NULL DEFAULT NULL,
  PRIMARY KEY (`order_no`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of tb_order_info
-- ----------------------------

SET FOREIGN_KEY_CHECKS = 1;

-- /*
 -- Navicat Premium Data Transfer

 -- Source Server         : 192.168.139.208
 -- Source Server Type    : MySQL
 -- Source Server Version : 50733
 -- Source Host           : 192.168.139.208:30002
 -- Source Schema         : shop_commodity_test

 -- Target Server Type    : MySQL
 -- Target Server Version : 50733
 -- File Encoding         : 65001

 -- Date: 28/11/2024 16:46:47
-- */
-- CREATE DATABASE  IF NOT EXISTS shop_commodity_test;

-- SET NAMES utf8mb4;
-- SET FOREIGN_KEY_CHECKS = 0;

----------------------------
Table structure for tb_product
----------------------------
-- DROP TABLE IF EXISTS `tb_product`;
-- CREATE TABLE `tb_product`  (
  -- `id` bigint(20) NOT NULL AUTO_INCREMENT,
  -- `product_name` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  -- `product_title` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  -- `product_img` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  -- `product_detail` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL,
  -- `product_price` decimal(10, 2) NULL DEFAULT NULL,
  -- `num` int(11) NULL DEFAULT NULL COMMENT '剩余库存量',
  -- PRIMARY KEY (`id`) USING BTREE
-- ) ENGINE = InnoDB AUTO_INCREMENT = 63 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

----------------------------
Records of tb_product
----------------------------
-- INSERT INTO `tb_product` VALUES (43, '华为nova7pro 8G+128G全网通', '麒麟985芯片,卖一台少一台,华为直供货源,全新原封正品【赠】原装碎屏险+2年保修+运费险+液态硅胶壳+贴膜', '/img/p1.jpg', '华为nova7pro 5G手机 7号色 8G+128G全网通', 4399.00, NULL);
-- INSERT INTO `tb_product` VALUES (44, 'VAIO 11代新品笔记本', ' VAIO FH14 侍14 11代酷睿 14英寸 1.4Kg 4G独显 高性能轻薄笔记本电脑(i5 16G 512G SSD GTX1650 FHD)铂金银', '/img/p2.jpg', ' VAIO FH14 侍14 11代酷睿 14英寸 1.4Kg 4G独显 高性能轻薄笔记本电脑(i5 16G 512G SSD GTX1650 FHD)铂金银', 4999.00, NULL);
-- INSERT INTO `tb_product` VALUES (45, '独牙(DUYA)可充电无线蓝牙鼠标', '三模办公静音锂电池鼠标 2.4G蓝牙5.0笔记本IPAD电脑平板通用 M203太空银', '/img/p3.jpg', '三模办公静音锂电池鼠标 2.4G蓝牙5.0笔记本IPAD电脑平板通用 M203太空银', 49.00, NULL);
-- INSERT INTO `tb_product` VALUES (46, '玉翊 新疆和田玉', '观音吊坠男羊脂白玉佛玉坠女本命佛挂件 羊脂玉佛小号【25*26*6】', '/img/p4.jpg', '观音吊坠男羊脂白玉佛玉坠女本命佛挂件 羊脂玉佛小号【25*26*6】', 1399.00, NULL);
-- INSERT INTO `tb_product` VALUES (47, '雅鹿品牌 加绒加厚  连帽夹克男', '雅鹿(YALU)【加绒可选】外套男 秋冬新款男装连帽夹克外套男士衣服男装外套12.3 601浅蓝米白(常规款) L码', '/img/p5.jpg', '雅鹿(YALU)【加绒可选】外套男 秋冬新款男装连帽夹克外套男士衣服男装外套12.3 601浅蓝米白(常规款) L码', 199.00, NULL);
-- INSERT INTO `tb_product` VALUES (48, '创维10公斤大容量变频滚筒', '创维(SKYWORTH) 10公斤 滚筒洗衣机全自动 家用一级变频 除菌除螨 桶自洁 15分快洗 XQG100-B15LB', '/img/p6.jpg', '创维(SKYWORTH) 10公斤 滚筒洗衣机全自动 家用一级变频 除菌除螨 桶自洁 15分快洗 XQG100-B15LB', 2399.00, NULL);
-- INSERT INTO `tb_product` VALUES (49, '夏普70英寸4K+HDR10液晶电视', '夏普(SHARP)70A5RD 70英寸日本原装面板4K超清网络智能液晶平板电视', '/img/p7.jpg', '夏普(SHARP)70A5RD 70英寸日本原装面板4K超清网络智能液晶平板电视', 6399.00, NULL);
-- INSERT INTO `tb_product` VALUES (50, 'Redmi K30 5G 6GB+128GB紫玉幻境', 'Redmi K30 5G双模 120Hz流速屏 骁龙765G 前置挖孔双摄 索尼6400万后置四摄 30W快充 6GB+128GB 紫玉幻境 游戏智能手机 小米 红米', '/img/p8.jpg', 'Redmi K30 5G双模 120Hz流速屏 骁龙765G 前置挖孔双摄 索尼6400万后置四摄 30W快充 6GB+128GB 紫玉幻境 游戏智能手机 小米 红米', 1699.00, NULL);
-- INSERT INTO `tb_product` VALUES (51, 'Apple Watch S5 GPS款 40毫米', 'Apple Watch Series 5智能手表(GPS款 40毫米深空灰色铝金属表壳 黑色运动型表带 MWV82CH/A)', '/img/p9.jpg', '【事事拿手,轻松入手!】【一站式以旧watch换新享额外200-500补贴优惠!】【新品再享30天试用!】库存紧张,马上抢购!', 3199.00, NULL);
-- INSERT INTO `tb_product` VALUES (52, '荣耀手表GS Pro 碳石黑', '荣耀手表GS Pro 碳石黑 25天续航 华为麒麟A1芯 103种运动模式 军规 智能语音蓝牙通话 50米防水 心率血氧GPS', '/img/p10.jpg', '荣耀手表GS Pro 碳石黑 25天续航 华为麒麟A1芯 103种运动模式 军规 智能语音蓝牙通话 50米防水 心率血氧GPS', 1599.00, NULL);
-- INSERT INTO `tb_product` VALUES (53, '仓鼠太空舱暖手宝充电宝二合一', '中意礼暖手宝充电暖宝宝电暖热水袋圣诞节礼物生日礼物送女友闺蜜女朋友情人节礼物送老婆结婚纪念日圣诞礼物 太空仓鼠暖手宝', '/img/p11.jpg', '【冬日优选,超温暖】超萌仓鼠形象,女生一见倾心,5秒快速升温,四档恒温,立体公仔,持续暖手3-6小时', 299.00, NULL);
-- INSERT INTO `tb_product` VALUES (54, '【价同12.12】美的60升电热爆款', '美的(Midea)60升电热水器2100W变频速热健康洗 智能APP控制 一级节能自动关机F6021-JA1(HEY)', '/img/p12.jpg', '【12月厨卫开门红】冰点价949!限时秒杀! 【2100W变频速热!健康沐浴!一级节能】 【手机APP控制!8年包修】鸿蒙新品上市', 1999.00, NULL);
-- INSERT INTO `tb_product` VALUES (55, '麦瑞克航空专利减震家用跑步机', '【航空专利减震】【送上楼包安装】麦瑞克Merach跑步机家用静音折叠走步机运动健身器材 【推荐款】10.1吋彩屏多功能/航空减震/带按摩机', '/img/p13.jpg', '【12.4日开门红】抢伴价、抢八折,爆款前一小时限时直降!更有华为P40pro+、爆款椭圆机等抽不停!白条免息运费险等福利领取!', 3999.00, NULL);
-- INSERT INTO `tb_product` VALUES (56, '华为畅享20 5G手机【大屏幕/大电池】 绮境森林 6+128G 全网通', '华为畅享20 5G手机【大屏幕/大电池】 绮境森林 6+128G 全网通', '/img/p14.jpg', '咨询客服享优惠】AI三摄闪拍,5000mAh电池【另有畅享20plus点此】', 2299.00, NULL);
-- INSERT INTO `tb_product` VALUES (57, '三星Galaxy Note20 Ultra 5G手机游戏手机 12GB+256GB 迷雾金', '三星Galaxy Note20 Ultra 5G(SM-N9860)S Pen&三星笔记 120Hz自适应屏幕 5G手机游戏手机 12GB+256GB 迷雾金', '/img/p15.jpg', '白条12期免息!下单赠价值1199元BudsLive耳机!全场至高优惠4000元!', 9199.00, NULL);
-- INSERT INTO `tb_product` VALUES (58, '洁滔(GILLTAO)德国三档强力增压淋浴花洒喷头', '洁滔(GILLTAO)德国三档强力增压淋浴花洒喷头手持沐浴洗澡淋雨大出水可拆洗万向旋转莲蓬头套装 三挡增压止水瓷白款', '/img/p16.jpg', '12.02号下午2点掌上秒杀,瓷白单喷头仅需19元,两件再享9折,上期秒杀2小时3500单抢光,欲购从速。三挡增压,一键止水,可拆洗,头部万向旋转,不增压包退。', 49.00, NULL);
-- INSERT INTO `tb_product` VALUES (59, 'OPPO K7x 新品双模5G手机 90Hz电竞屏 智能拍照游戏 ', 'OPPO K7x 新品双模5G手机 90Hz电竞屏 智能拍照游戏 长续航手机oppok7x 黑镜 6+128G【现货速发】 全网通5G 闪充套装', '/img/p17.jpg', '【现货速发,到手1499起】购机送蓝牙佴机+1年屏碎险+2年质保+晒单20+会员积分~5G硬核新品K7x赠蓝牙佴机', 1599.00, NULL);
-- INSERT INTO `tb_product` VALUES (60, '松下5款吸嘴家用大吸力吸尘器', '松下(panasonic)家用吸尘器大吸力小型地毯床上办公室强力除尘吸尘器宠物家庭适用 MC-WLC87字母负离子吸嘴', '/img/p18.jpg', '【锁定12.3日10点】限时好价659!错过12.12都没有! 【团购咨询客服】可领取惊喜出厂价哦! 【全国联保,售后无忧】180以换代修!立即加购', 1499.00, NULL);
-- INSERT INTO `tb_product` VALUES (61, '阿玛尼商务钢带男士时尚石英表', '【品牌授权】Emporio Armani 阿玛尼手表 欧美表 商务男士腕表 皮带钢带男表石英表 AR1819', '/img/p19.jpg', '【大牌秒杀】爆款男士钢带表AR819到手价1300更多优惠请咨询再线客服', 2990.00, NULL);
-- INSERT INTO `tb_product` VALUES (62, '联想拯救者12GB+256GB  炽焰战甲', '联想拯救者电竞手机Pro 12GB+256GB 骁龙865 Plus 双液冷散热 144Hz电竞屏 双模5G游戏手机 炽焰战甲', '/img/p20.jpg', '【专享2500元VIP特权】高通骁龙865plus游戏高手的选择,双模5G,144Hz电竞屏,双液冷散热,晒单得50元E卡!至尊透明版', 4199.00, NULL);

-- SET FOREIGN_KEY_CHECKS = 1;

二、项目结构

环境版本
SpringBoot3.3.5 
Jdk 17.0.1
spring-cloud 2023.0.3
spring.cloud.alibaba2023.0.3.2
Nacos2.4.3

完整项目路径 

https://github.com/xiaojiewhisper/wssnail-shop.git

Gitee: 熟透的蜗牛/wssnail-shop

三、项目部署

1、修改maven私服

jenkins-configmap.yaml

apiVersion: v1 
kind: ConfigMap 
metadata: 
  name: mvn-settings
  namespace: kube-devops
  labels: 
    app: jenkins-server
data: 
  settings.xml: |- 
    <?xml version="1.0" encoding="UTF-8"?>
    <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
        <localRepository>/var/jenkins_home/repository</localRepository>
        <servers>
                <server>
                        <id>releases</id>
                        <username>admin</username>
                        <password>123456</password>
                </server>
                <server>
                        <id>snapshots</id>
                        <username>admin</username>
                        <password>123456</password>
                </server>
        </servers>

        <mirrors>
                <mirror>
                        <id>releases</id>
                        <name>nexus maven</name>
                        <mirrorOf>*</mirrorOf>
                        <url>http://192.168.139.184:8081/repository/maven-public/</url>
                </mirror>
        </mirrors>

        <pluginGroups>
                <pluginGroup>org.sonarsource.scanner.maven</pluginGroup>
        </pluginGroups>
        <profiles>
                <profile>
                        <id>releases</id>
                        <activation>
                                <activeByDefault>true</activeByDefault>
                                <jdk>1.8</jdk>
                        </activation>
                        <properties>
                                <sonar.host.url>http://sonarqube:9000</sonar.host.url>
                        </properties>

                        <repositories>
                                <repository>
                                        <id>repository</id>
                                        <name>Nexus Repository</name>
                                        <url>http://192.168.139.184:8081/repository/maven-public/</url>
                                        <releases>
                                                <enable>true</enable>
                                        </releases>
                                        <snapshots>
                                                <enable>true</enable>
                                        </snapshots>
                                </repository>
                        </repositories>
                </profile>
        </profiles>
    </settings>

2、配置Jenkins

2.1 、添加Extended Choice Parameter 插件

2.2、构建PipeLine

2.2.1 、构建Git参数

 2.2.2、 Extended Choice Parameter

2.2.3、构建 docker镜像仓库参数

 2.2.4、构建副本数参数

2.2.5、构建TAG参数

 2.3、Pipeline script from SCM

四、配置文件

1、Jenkinsfile

pipeline {
  agent {
    kubernetes {
      label 'maven'
    }
  }

  stages {
    stage('checkout scm') {
      agent none
      steps {
        git(url: 'http://192.168.139.184:9000/shop/wssnail-shop.git', credentialsId: 'git-user-pwd', changelog: true, poll: false, branch: "$BRANCH")
      }
    }

    stage('unit test') {
      agent none
      steps {
          sh 'cd wssnail-shop-parent &&   mvn clean package -Dmaven.test.skip=true  '  
      }
    }

//     stage('sonarqube analysis') {
//       agent none
//       steps {
//         withCredentials([string(credentialsId : "$SONAR_CREDENTIAL_ID" ,variable : 'SONAR_TOKEN' )]) {
//           withSonarQubeEnv('sonarqube') {
//               sh """
//                for service_path in \$(echo \${SERVICE} |sed  's/,/ /g') ; do
//                    service_name=\${service_path#*/}
//                    service_name=\${service_name#*/}
//                    cd \${service_path}
//                    echo "go to path:\${pwd}"
//                    mvn sonar:sonar -Dsonar.projectKey=\${service_name}
//                    echo "mvn sonar:sonar -Dsonar.projectKey=\${service_name}"
//
//                    cd \${WORKSPACE}
//                    echo " go to path : \${WORKSPACE}"
//                    done
//                """
//           }
//         }
//
//         timeout(time: 1, unit: 'HOURS') {
//           waitForQualityGate true
//         }
//
//       }
//     }

    stage('build & push') {
      agent none
      steps {
      sh 'chmod -R 777 . && deploy/copy.sh'
        withCredentials([usernamePassword(passwordVariable : "DOCKER_PASSWORD" ,usernameVariable : "DOCKER_USERNAME",credentialsId : "$DOCKER_CREDENTIAL_ID",)]){
           sh """
            echo "\${DOCKER_PASSWORD}" | docker login \${REGISTRY} -u  "\${DOCKER_USERNAME}" --password-stdin

            for service_path in \$(echo \${SERVICE} |sed 's/,/ /g'); do
                  service_name=\${service_path#*/}
                  service_name=\${service_name#*/}
                  cd deploy/\${service_name}/build

                  if test "\${DOCKERHUB_NAMESPACE}" = "\${DOCKERHUB_NAMESPACE_SNAPSHOT}"; then
                          echo "DOCKERHUB_NAMESPACE is snapshot...."
                          docker build -f Dockerfile -t \${REGISTRY}/\${DOCKERHUB_NAMESPACE}/\${service_name}:SNAPSHOT-\$BUILD_NUMBER .
                          docker push \${REGISTRY}/\${DOCKERHUB_NAMESPACE}/\${service_name}:SNAPSHOT-\${BUILD_NUMBER}
                      else
                          docker build -f Dockerfile -t \${REGISTRY}/\${DOCKERHUB_NAMESPACE}/\${service_name}:SNAPSHOT-\$BUILD_NUMBER .
                          echo "DOCKERHUB_NAMESPACE is release...."
                  fi
                  cd \${WORKSPACE}
             done

             """
        }
      }
    }

    stage('push latest') {
      agent none
      steps {
          sh """
             for service_path in \$(echo \$SERVICE |sed 's/,/ /g'); do
                service_name=\${service_path#*/}
                service_name=\${service_name#*/}
                cd deploy/\${service_name}/build

                docker tag \${REGISTRY}/\${DOCKERHUB_NAMESPACE}/\${service_name}:SNAPSHOT-\${BUILD_NUMBER} \${REGISTRY}/\${DOCKERHUB_NAMESPACE}/\${service_name}:latest
                docker push \${REGISTRY}/\${DOCKERHUB_NAMESPACE}/\${service_name}:latest

                cd \${WORKSPACE}
                done
            """
      }
    }

    stage('deploy to dev') {
      agent none
      when {
          expression {
            return params.TAG_NAME =~ /snapshot.*/
          }
        }
      steps {
        input(id: 'deploy-to-dev', message: 'deploy to dev?')
            sh """
              for service_path in \$(echo \$SERVICE |sed 's/,/ /g'); do
                service_name=\${service_path#*/}
                service_name=\${service_name#*/}
                cd deploy/\${service_name}

                sed -i\'\' "s#REGISTRY#\${REGISTRY}#" deployment.yaml
                sed -i\'\' "s#DOCKERHUB_NAMESPACE#\${DOCKERHUB_NAMESPACE}#" deployment.yaml
                sed -i\'\' "s#APP_NAME#\${service_name}#" deployment.yaml
                sed -i\'\' "s#BUILD_NUMBER#\${BUILD_NUMBER}#" deployment.yaml
                sed -i\'\' "s#REPLICAS#\${REPLICAS}#" deployment.yaml

                kubectl create cm \${service_name}-yml --dry-run=\'client\' -o yaml --from-file=build/target/bootstrap.yml -n ks-wssnail-shop-dev > \${service_name}-configmap.yml

                kubectl apply -f .

                cd \${WORKSPACE}
                done
            """
      }
    }

    stage('push with tag') {
      agent none
      when {
        expression {
          return params.TAG_NAME =~ /v.*/
        }

      }
      steps {
        input(id: 'release-image-with-tag', message: 'release image with tag?')
        withCredentials([usernamePassword(credentialsId : 'git-user-pwd' ,passwordVariable : 'GIT_PASSWORD' ,usernameVariable : 'GIT_USERNAME' ,)]) {
          sh 'git config --global user.email "snail" '
          sh 'git config --global user.name "snail" '
          sh 'git tag -a ${TAG_NAME} -m "${TAG_NAME}" '
          sh 'git push http://${GIT_USERNAME}:${GIT_PASSWORD}@${GIT_REPO_URL}/${GIT_ACCOUNT}/${APP_NAME}.git --tags --ipv4'
        }

        sh """
        for service_path in \$(echo \$SERVICE |sed 's/,/ /g'); do
            service_name=\${service_path#*/}
            service_name=\${service_name#*/}

            docker tag \${REGISTRY}/\${DOCKERHUB_NAMESPACE}/\${service_name}:SNAPSHOT-${BUILD_NUMBER} ${REGISTRY}/\${DOCKERHUB_NAMESPACE}/\${service_name}:${TAG_NAME}
            docker push \${REGISTRY}/\${DOCKERHUB_NAMESPACE}/\${service_name}:${TAG_NAME}
            cd \${WORKSPACE}
            done
        """
      }
    }

    stage('deploy to production') {
      agent none
      when {
        expression {
          return params.TAG_NAME =~ /v.*/
        }
      }

      steps {
              input(id: 'deploy-to-production', message: 'deploy to production?')
                  sh """
                    for service_path in \$(echo \$SERVICE |sed 's/,/ /g'); do
                      service_name=\${service_path#*/}
                      service_name=\${service_name#*/}
                      cd deploy/\${service_name}/prod

                      sed -i\'\' "s#REGISTRY#\${REGISTRY}#" deployment.yaml
                      sed -i\'\' "s#DOCKERHUB_NAMESPACE#\${DOCKERHUB_NAMESPACE}#" deployment.yaml
                      sed -i\'\' "s#APP_NAME#\${service_name}#" deployment.yaml
                      sed -i\'\' "s#BUILD_NUMBER#\${BUILD_NUMBER}#" deployment.yaml
                      sed -i\'\' "s#REPLICAS#\${REPLICAS}#" deployment.yaml
                      sed -i\'\' "s#TAG_NAME#\${TAG_NAME}#" deployment.yaml

                      kubectl create cm \${service_name}-yml --dry-run=\'client\' -o yaml --from-file=../build/target/bootstrap.yml -n ks-wssnail-shop > \${service_name}-configmap.yml
                      kubectl apply -f .

                      cd \${WORKSPACE}
                      done
                  """
           }
    }
  }
  environment {
    APP_NAME = 'wssnail-shop'
    DOCKER_CREDENTIAL_ID = 'harbor-user-pwd'
    REGISTRY = '192.168.139.184:8899'
    GIT_REPO_URL = '192.168.139.184:9000'
    GIT_CREDENTIAL_ID = 'git-user-pwd'
    GIT_ACCOUNT = 'shop'
    SONAR_CREDENTIAL_ID = 'sonarqube-token'
    KUBECONFIG_CREDENTIAL_ID = '30629742-ddae-4c80-a3ad-5807ffc6ff5a'
    DOCKERHUB_NAMESPACE_SNAPSHOT='snapshot'
    DOCKERHUB_NAMESPACE_RELEASE='release'
  }

  parameters {
    extendedChoice name: 'SERVICE', defaultValue:'none', description: '请选择要部署的服务', multiSelectDelimiter:',',type: 'PT_CHECKBOX', value: 'wssnail-shop-parent/shop-gateway,wssnail-shop-parent/shop-uaa,wssnail-shop-parent/shop-commodity,wssnail-shop-parent/shop-order',descriptionPropertyValue:'网关服务,用户中心,商品服务,订单服务'
    choice(name: 'DOCKERHUB_NAMESPACE', choices: ['snapshot', 'release'], description: '请选择部署到哪个镜像仓库')
    choice(name: 'REPLICAS', choices: ['1', '3', '5', '7'], description: '请选择构建后的副本数')
    gitParameter  name :'BRANCH', branchFilter: 'origin/(.*)',defaultValue:'master',description:'请选择要发布的分支',type:'PT_BRANCH'
    string(name: 'TAG_NAME', defaultValue: 'snapshot', description: '部署版本:必须以 v 开头,例如:v1、v1.0.0')
  }

}

2、Shell脚本

#!/bin/bash

# 网关
if [ -f "wssnail-shop-parent/shop-gateway/target/classes/bootstrap.yml" ]; then
  echo 'copying shop-gateway to build path...'
  mkdir -p deploy/shop-gateway/build/target/
  cp wssnail-shop-parent/shop-gateway/target/shop-gateway.jar deploy/shop-gateway/build/target/
  cp wssnail-shop-parent/shop-gateway/target/classes/bootstrap.yml deploy/shop-gateway/build/target/
#  cd deploy/shop-gateway/build/target/
#  find . -type f -exec echo {} \;
fi

# 用户
if [ -f "wssnail-shop-parent/shop-uaa/target/classes/bootstrap.yml" ]; then
  echo 'copying shop-uaa to build path...'
  mkdir -p deploy/shop-uaa/build/target/
  cp wssnail-shop-parent/shop-uaa/target/shop-uaa.jar deploy/shop-uaa/build/target/
  cp wssnail-shop-parent/shop-uaa/target/classes/bootstrap.yml deploy/shop-uaa/build/target/
#  cd deploy/shop-uaa/build/target/
#  find . -type f -exec echo {} \;
fi

# 商品
if [ -f "wssnail-shop-parent/shop-commodity/target/classes/bootstrap.yml" ]; then
  echo 'copying shop-commodity to build path...'
  mkdir -p deploy/shop-commodity/build/target/
  cp wssnail-shop-parent/shop-commodity/target/shop-commodity.jar deploy/shop-commodity/build/target/
  cp wssnail-shop-parent/shop-commodity/target/classes/bootstrap.yml deploy/shop-commodity/build/target/
#  cd deploy/shop-commodity/build/target/
#  find . -type f -exec echo {} \;
fi

# 订单
if [ -f "wssnail-shop-parent/shop-order/target/classes/bootstrap.yml" ]; then
  echo 'copying shop-order to build path...'
  mkdir -p deploy/shop-order/build/target/
  cp wssnail-shop-parent/shop-order/target/shop-order.jar deploy/shop-order/build/target/
  cp wssnail-shop-parent/shop-order/target/classes/bootstrap.yml deploy/shop-order/build/target/
#  cd deploy/shop-order/build/target/
#  find . -type f -exec echo {} \;
fi

 3、网关Dockerfile

## 基础镜像
## AdoptOpenJDK 停止发布 OpenJDK 
FROM openjdk:17-slim

## 作者
LABEL org.opencontainers.image.authors="snail"

## 定义参数

## 创建并进入工作目录
RUN mkdir -p /snail
WORKDIR /snail

## maven 插件构建时得到 buildArgs 种的值
COPY target/shop-gateway.jar app.jar

## 设置 TZ 时区
## 设置 JAVA_OPTS 环境变量,可通过 docker run -e "JAVA_OPTS=" 进行覆盖
ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms512m -Xmx512m"

## 暴露端口
EXPOSE 9000

## 容器启动命令
## CMD 第一个参数之后的命令可以在运行时被替换
CMD java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /snail/app.jar

4、网关deployment.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: shop-gateway
    component: gateway
    tier: backend
  name: shop-gateway
  namespace: ks-wssnail-shop-dev
spec:
  progressDeadlineSeconds: 600
  replicas: REPLICAS
  selector:
    matchLabels:
      app: shop-gateway
      component: gateway
      tier: backend
  strategy:
    rollingUpdate:
      maxSurge: 100%
      maxUnavailable: 100%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: shop-gateway
        component: gateway
        tier: backend
    spec:
      imagePullSecrets:
        - name: harbor-secret
      containers:
        - name: shop-gateway
          image: REGISTRY/DOCKERHUB_NAMESPACE/APP_NAME:SNAPSHOT-BUILD_NUMBER
          livenessProbe:
            httpGet:
              path: /index
              port: 9000
            initialDelaySeconds: 90
            timeoutSeconds: 5
            failureThreshold: 5
            periodSeconds: 10
          readinessProbe:
            httpGet:
              path: /index
              port: 9000
            initialDelaySeconds: 60
            timeoutSeconds: 5
            failureThreshold: 3
            periodSeconds: 10
          imagePullPolicy: Always
          ports:
            - containerPort: 9000
              protocol: TCP
          resources:
            limits:
              cpu: 300m
              memory: 600Mi
            requests:
              cpu: 100m
              memory: 100Mi
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          volumeMounts:
            - name: app-yml
              mountPath: /snail/bootstrap.yml
              subPath: bootstrap.yml
      volumes:
        - name: app-yml
          configMap:
            name: shop-gateway-yml
            items:
            - key: bootstrap.yml
              path: bootstrap.yml
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      terminationGracePeriodSeconds: 30

5、网关service.yml

apiVersion: v1
kind: Service
metadata:
  labels:
    app: shop-gateway
    component: gateway
  name: shop-gateway
  namespace: ks-wssnail-shop-dev
spec:
  ports:
    - name: http
      port: 9000
      protocol: TCP
      targetPort: 9000
  selector:
    app: shop-gateway
    component: gateway
    tier: backend
  sessionAffinity: None
  type: NodePort

6、ingress.yml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: api-gateway-ingress
  namespace: ks-wssnail-shop-dev
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: dev.wssnail.com
    http:
      paths:
      - pathType: Prefix
        backend:
          service:
            name: api-gateway
            port:
              number: 9000
        path: /

7、其他配置文件

详情看源码 

 https://github.com/xiaojiewhisper/wssnail-shop.git

 Gitee: 熟透的蜗牛/wssnail-shop

五、测试

1、查看资源

kubectl get po,svc,cm -n ks-wssnail-shop -o wide 

2、接口测试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熟透的蜗牛

永远满怀热爱,永远热泪盈眶

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值