目录
2.1 、添加Extended Choice Parameter 插件
2.2.2、 Extended Choice Parameter
一、数据库
/*
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;
二、项目结构
环境 | 版本 |
SpringBoot | 3.3.5 |
Jdk | 17.0.1 |
spring-cloud | 2023.0.3 |
spring.cloud.alibaba | 2023.0.3.2 |
Nacos | 2.4.3 |
完整项目路径
https://github.com/xiaojiewhisper/wssnail-shop.git
三、项目部署
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
五、测试
1、查看资源
kubectl get po,svc,cm -n ks-wssnail-shop -o wide