初始提交

This commit is contained in:
wzgaoyn 2025-03-19 15:04:57 +08:00
commit b9279bc233
371 changed files with 874619 additions and 0 deletions

8
.gitignore vendored Normal file
View File

@ -0,0 +1,8 @@
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
*.lock
rebel.xml

19
README.md Normal file
View File

@ -0,0 +1,19 @@
## 协议和授权
`mall4cloud` 并非一个开源软件,作者保留全部的权利。 擅自窃用,即属严重侵权行为,与盗窃无异。产生的一切任何后果责任由侵权者自负。
## 商业使用
本项目并非一个开源项目,**广州市蓝海创新科技有限公司** 拥该项目的100%版权。
商用请联系 **广州市蓝海创新科技有限公司** 获取授权,否则产生的一切任何后果责任由侵权者自负。
## 🚫禁止
将本项目的部分或全部代码和资源进行任何形式的再发行上传GitHub、Gitee等任何公开发行的地方
## 侵权处理
- 支付人民币最低 `100万``侵权数量*商业版售价*10倍` 不等的侵权费用(含我方法律援助费用),本团队已完全委托律师事务所 司法保护
- 个人行为将直接收集材料邮寄贵司侵权律师函,若出现司法诉讼将直接影响当事人征信档案等特此说明

View File

@ -0,0 +1,257 @@
## Mall4j 商城 Android 打包文档
文档源自 [uniapp 官方离线打包文档](https://nativesupport.dcloud.net.cn/AppDocs/),如有出入以官网文档为准
### 准备工作
Android平台签名证书 [生成指南](https://ask.dcloud.net.cn/article/35777)
注册Dcloud账号登录后台创建应用并申请离线打包 [Appkey](https://nativesupport.dcloud.net.cn/AppDocs/usesdk/appkey)
### 开发环境
Android Studio [官方下载](https://developer.android.google.cn/studio/index.html)
HbulidX [官方下载](https://www.dcloud.io/hbuilderx.html)
App离线SDK下载 [最新android平台SDK下载](https://nativesupport.dcloud.net.cn/AppDocs/download/android)
### SDK目录说明
```
|-- HBuilder-Hello App离线打包演示应用
|-- HBuilder-Integrate-AS 集成uni-app的最简示例
|-- SDK SDK库文件目录
|-- Feature-Android.xls Android平台各扩展Feature API对应的详细配置
|-- Readme.txt 版本说明文件及注意事项
|-- UniPlugin-Hello-AS uni原生插件开发示例
```
### 导入工程
打开 Android Studio 导入 SDK 中的 HBuilder-Integrate-AS 工程
![导入工程](../img/app打包/android/导入工程.png)
导入后 Android Studio 会自动下载项目中用到的资源默认源是Google建议科学上网
### 工程配置
**build.gradle**
将生成的签名证书放入 simpleDemo 目录下
打开 simpleDemo/build.gradle 配置文件,修改包名和签名信息
![修改包名、签名](../img/app打包/android/修改包名、签名.png)
```js
// 签名信息配置
signingConfigs {
config {
keyAlias 'key0' // 证书别名
keyPassword '123456' // 证书密码
storeFile file('test.jks') // 证书文件路径
storePassword '123456' // 证书文件密码
v1SigningEnabled true
v2SigningEnabled true
}
}
```
**Androidmanifest.xml**
打开 simpleDemo/src/main/Androidmanifest.xml修改包名配置Appkey
![修改包名、签名](../img/app打包/android/AppKey.png)
### 图标、启动图以及应用名称
#### 图标、启动图
simpleDemo/src/main/res/drawableicon 为图标splash 为启动图。可直接替换
#### **应用名称**
simpleDemo/src/main/res/values/strings.xml文件修改“app_name”字段值
![](../img/app打包/android/应用名称.png)
### 模块及第三方SDK配置
使用模块或第三方SDK需要引入资源并添加对应配置。
#### 第三方SDK配置
以 [微信支付](https://nativesupport.dcloud.net.cn/AppDocs/usemodule/androidModuleConfig/pay?id=%e5%be%ae%e4%bf%a1%e6%94%af%e4%bb%98) 为例,需要登录 [微信开放平台](https://open.weixin.qq.com/) 创建移动应用,审核成功后获取 微信AppId(appkey) [微信appkey申请方法](http://ask.dcloud.net.cn/article/208)
1. 引入文件
在 SDK/libs 目录下,找到 payment-weixin-release.aar 将这个文件放入工程中 simpleDemo/libs 目录;
将 SDK/src/wxapi 下的 WXPayEntryActivity.java 文件复制到工程 simpleDemo/main/java/包名/wxapi 目录
![](../img/app打包/android/微信支付1.png)
2. 添加配置
1. Androidmainfest.xml
需要在application节点前添加权限
```xml
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
```
application节点下配置如下代码
```xml
<meta-data android:name="WX_APPID" android:value="$微信APPID" />
<activity android:name="io.dcloud.feature.payment.weixin.WXPayProcessMeadiatorActivity"
android:exported="false"
android:excludeFromRecents="true"
android:theme="@style/ProjectDialogTheme"/>
<activity
android:name="$你的包名.wxapi.WXPayEntryActivity"
android:exported="true"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:launchMode="singleTop" />
```
2. dcloud_properties.xml (assets/data)
```xml
<feature name="Payment" value="io.dcloud.feature.payment.PaymentFeatureImpl">
<module name="Payment-Weixin" value="io.dcloud.feature.payment.weixin.WeiXinPay"/>
</feature>
```
3. build.gradle simpleDemo/build.gradle在主工程的build.gradle文件配置 dependencies
```json
dependencies {
implementation fileTree(dir: 'libs', include: ['*.aar', '*.jar'], exclude: [])
implementation 'androidx.appcompat:appcompat:1.0.0'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.recyclerview:recyclerview:1.0.0'
implementation 'com.facebook.fresco:fresco:2.5.0'
implementation "com.facebook.fresco:animated-gif:2.5.0"
implementation 'com.github.bumptech.glide:glide:4.9.0'
implementation 'com.alibaba:fastjson:1.2.83'
implementation 'androidx.webkit:webkit:1.3.0'
// 微信支付依赖配置
implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:6.8.0'
}
```
![](../img/app打包/android/微信支付2.png)
项目中用到的模块及第三方SDK
| 模块/第三方SDK | 需要引入的文件 |
| ------------------------------------------------------------ | ----------------------------------------------- |
| [系统定位](https://nativesupport.dcloud.net.cn/AppDocs/usemodule/androidModuleConfig/geolocation?id=系统定位) | 无需引入文件,需添加配置 |
| [支付宝支付](https://nativesupport.dcloud.net.cn/AppDocs/usemodule/androidModuleConfig/pay?id=支付宝) | payment-alipay-release.aar |
| [微信支付](https://nativesupport.dcloud.net.cn/AppDocs/usemodule/androidModuleConfig/pay?id=微信支付) | payment-weixin-release.aar |
| [VideoPlayer视频播放](https://nativesupport.dcloud.net.cn/AppDocs/usemodule/androidModuleConfig/others?id=videoplayer视频播放) | media-release.aar、weex_videoplayer-release.aar |
| [livepusher直播推流](https://nativesupport.dcloud.net.cn/AppDocs/usemodule/androidModuleConfig/others.html#livepusher-%E7%9B%B4%E6%92%AD%E6%8E%A8%E6%B5%81) | weex_livepusher-release.aar |
### 导出资源
用 HbulidX 打开项目,打开 manifest.json 配置文件,修改 uniapp 应用标识(appid) 为 离线AppKey 中的应用id
![](../img/app打包/android/检查appid.png)
选择项目 -> 发行 -> 原生App-本地打包 -> 生成本地打包App资源编译完成后控制台会显示资源路径
或执行命令 npm run build:app-android 编译
![](../img/app打包/android/导出资源.png)
### 导入资源
将编译好的app资源拷贝到项目assets->apps下目录结构如下图
![](../img/app打包/android/导入资源.png)
修改 assets/data/dcloud_control.xml 中的 appid 为 uni-app 的 id
### 打包apk
Android Studio 菜单选择 Build -> Generate Signed Bund / APK ,弹窗选择 APK选择打包用的签名输入签名信息选择release 点击 Finish 即可完成打包
![](../img/app打包/android/打包apk.png)
### 常见问题
#### 未配置AppKey或配置错误
1、查看签名文件是否配置到了主APP的build.gradle
2、查看离线项目中dcloud_control.xml文件中的appid是否与申请AppKey时的appid一致
3、检测离线项目的包名是否申请AppKey时的包名是否一致
4、编译完通过apk解压获取一下签名信息与申请AppKey时填写的SHA1一致
#### 模拟器中app无法运行
要在模拟器运行,需要在 simpleDemo 目录下 build.gradle 配置文件 defaultConfig 下 添加配置
```xml
android {
defaultConfig {
...
ndk {
abiFilters 'arm64-v8a','armeabi-v7a', 'x86'
}
}
}
```

View File

@ -0,0 +1,178 @@
## Mall4j 商城 IOS 打包文档
文档源自 [uniapp 官方离线打包文档](https://nativesupport.dcloud.net.cn/AppDocs/),如有出入以官网文档为准
### 准备工作
[苹果开发者平台](https://developer.apple.com/) 账号需要加入苹果开发计划创建App申请证书描述文件等
注册Dcloud账号登录后台创建应用并申请离线打包 [Appkey](https://nativesupport.dcloud.net.cn/AppDocs/usesdk/appkey)
### 开发环境
macOS Monterey 及以上 (可用虚拟机)
Xcode 13 及以上版本
HbulidX
App离线SDK下载 [最新iOS平台SDK下载](https://nativesupport.dcloud.net.cn/AppDocs/download/ios)
### SDK目录说明
```
|-- HBuilder-Hello 给用户打uni-app项目的离线打包工程
|-- Feature-iOS.xls 配置表(依赖的库、资源文件、参数配置等)
|-- SDK 工程需要的库文件,.h头文件配置文件资源文件
```
- 详细说明:[App离线SDK内不同文件的作用](https://nativesupport.dcloud.net.cn/AppDocs/usesdk/iOSReadMe)
### 配置工程
下载离线SDK压缩包解压用 Xcode 打开 HBuilder-Hello 项目
#### 配置Appkey
打开 HBuilder-Hello -> Supporting Files -> HBuilder-Hello-Info找到 dcloud_appkey填入appKey
![](../img/app打包/ios/配置appkey.png)
#### 生成本地打包app资源
用 HbulidX 打开项目,选择菜单 发行 -> 原生App-本地打包 -> 生成本地打包App资源
或执行命令 npm run build:app-ios 编译
![](../img/app打包/ios/生成本地打包app资源.png)
#### 导入打包资源到xcode
把生成好的本地打包app资源复制到 xcode 项目目录下的 Pandora -> apps 路径下,替换掉原来的
![](../img/app打包/ios/导入本地打包app资源.png)
#### 修改 control.xml 文件
打开 Xcode 工程Supporting Files -> control.xml文件修改 appid 值改成和manifest.json里面的id一样
![](../img/app打包/ios/修改control文件appid.png)
#### 修改应用信息
按图示箭头从左往右依次点击 HBuilder-Hello -> TARGETS 下的 HBuilder
在General下修改应用名称、包名、版本名称、版本号
Display Name是app名称
Bundle Identifier为苹果的AppID
Version为应用版本号在App Store中显示的版本号推荐与manifest.json中version下的name值一致
Build为编译版本号App Store判断升级使用推荐与manifest.json中version下的code值一致。
![](../img/app打包/ios/配置版本信息.png)
##### **修改app名称**
即使修改了Display Name打包后的app名称依然是"Hbuilder你好";需要改一下 InfoPlist.strings 下面的 CFBundleDisplayName 为应用名字InfoPlist.strings(English)为英文系统应用名Simplified为中文简体系统应用名
![](../img/app打包/ios/配置应用名称.png)
##### **修改app图标**
按图示箭头从左往右依次点击 HBuilder-Hello -> TARGETS 下的 HBuilder
在General下 找到 App Icons and Launch Images 点击小箭头
![](../img/app打包/ios/配置app图标1.png)
在 HBuilderX 中打开 mainfest.json在 App图标配置中 使用自动生成图标功能,然后把生成的图标拖动到 xcode 中 Images 对应的每个大小的位置中 即可完成配置
![](../img/app打包/ios/配置app图标2.png)
##### **配置应用签名**
配置 xcode 自动签名:
打开 xcode 配置,切换到 Account 选项,添加已完成签名申请的苹果开发者账号
![](../img/app打包/ios/xcode配置自动签名.png)
如图示打开 Signing & CapaBilities勾选 "Automatically manage signing",选择一下 Team(如果没有的话,创建一个)填一下Bundle Identifier
![](../img/app打包/ios/签名配置.png)
签名常见错误1
![](../img/app打包/ios/签名错误1.png)
切换到选择卡“Build Settings” 搜索签名 “Signing”
然后在列出的代码签名标识中把值设置为 “Apple Development”
签名常见错误2
![](../img/app打包/ios/签名错误2.png)
切换到选择卡“Build Settings” 搜索签名 “ Provision”(快捷键command+delete)删除User-Defined下面的PROVISIONING_PROFILE
### 第三方模块配置
项目目前使用到模块/第三方SDK包含 定位、微信支付、支付宝支付、视频播放。
具体配置方法可参考uniapp官网 [模块/三方SDK配置介绍](https://nativesupport.dcloud.net.cn/AppDocs/usemodule/iOSModuleConfig/common)
### 打包上传
点击 Xcode 中部项目名称,设置编译配置,选择 Any iOS Device (arm64, armv7)
![](../img/app打包/ios/打包配置.png)
点击 Product 菜单Archive 选项
![](../img/app打包/ios/打包上传1.png)
待编译完成后会自动弹出 Archives ,点击 右上角 Distribute App ,准备上传
Archives 弹窗可通过 Window -> Organizer 菜单打开
![](../img/app打包/ios/打包上传2.png)
后续的弹窗一路 next ,最后签名完毕后点击 upload 上传
![](../img/app打包/ios/打包上传4.png)

View File

@ -0,0 +1,201 @@
### 1. maven
1. 下载maven地址https://maven.apache.org/download.cgi
2. 上传到服务器解压
```
tar -zxvf apache-maven-3.8.6-bin.tar.gz -C /usr/local/
```
3.重命名
```
mv /usr/local/apache-maven-3.8.6 /usr/local/maven
```
### 2. jdk
1. 下载maven用华为云的地址https://repo.huaweicloud.com/java/jdk/8u201-b09/jdk-8u201-linux-x64.tar.gz
2. 上传到服务器解压
```
tar -zxvf jdk-8u201-linux-x64.tar.gz -C /usr/local/
```
3.重命名
```
mv /usr/local/jdk1.8.0_201 /usr/local/jdk
```
### 3. jenkins
> jeknins用docker安装不知道如何安装docker的可以参考docker的安装教程
jenkins用lts版本用docker-compose安装
```
# 创建文件夹存放jenkins的数据
mkdir -p /usr/local/docker/jenkins/data
# 进到文件夹
cd /usr/local/jenkins
# 给这个目录赋予操作权限,供 jenkins 容器进行访问,不赋予权限的话,容器中的 jenkins 用户无法读取宿主机的这个文件;
chmod 777 /usr/local/docker/jenkins/data
# 放入maven和jdk
mv /usr/local/maven /usr/local/docker/jenkins/data/maven
mv /usr/local/jdk /usr/local/docker/jenkins/data/jdk
# 让jenkins可以使用宿主机的docker
chown root:root /var/run/docker.sock
chmod o+rw /var/run/docker.sock
```
编辑 docker-compose
`vi /usr/local/docker/jenkins/docker-compose.yml`
内容如下
```
version: '3.1'
services:
jenkins:
image: 'jenkins/jenkins:lts'
container_name: jenkins
restart: always
ports:
- '8080:8080'
- '50000:50000'
volumes:
- './data/:/var/jenkins_home/'
- '/var/run/docker.sock:/var/run/docker.sock'
- '/usr/bin/docker:/usr/bin/docker'
- '/etc/docker/daemon.json:/etc/docker/daemon.json'
```
启动
```
cd /usr/local/docker/jenkins
docker-compose up -d
```
启动jenkins之后除了默认的插件还要安装`publisher over ssh``nodejs` 插件
在jenkins当中还要将`maven`,`jdk`,`nodejs`的之前下载好放入jenkins的路径写进去不要让jenkins自己安装
jenkins 在设置里面找到脚本命令行,运行这行命令
```
hudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION = true
```
安装 Build Authorization Token Root 插件
安装该插件后,就可以通过 https://jenkins.mall4j.com/buildByToken/build?job=NAME&token=SECRET 地址来触发 job 了,此时不需要将 job 设置为匿名可访问也可以正常触发。
jenkins 在设置里面找到脚本命令行,运行这行命令
```
System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone', 'Asia/Shanghai')
```
### 4. harbor
1. 下载harbor(2.x)地址https://github.com/goharbor/harbor/releases
2. 上传到服务器解压
```
tar -zxvf harbor-offline-installer-v2.6.0.tgz -C /usr/local/docker
```
3.修改配置文件
```
cd /usr/local/docker/harbor/
cp harbor.yml.tmpl harbor.yml
vi harbor.yml
```
改掉 hostname注掉https相关信息修改默认密码harbor_admin_password
```
hostname: 192.168.1.11
# https related config
#https:
# https port for harbor, default is 443
# port: 443
# The path of cert and key files for nginx
# certificate: /your/certificate/path
# private_key: /your/private/key/path
harbor_admin_password: 123456
```
4. 安装
```
./install.sh
```
5.所有要用到这个harbor的服务器都要配置仓库地址
```
vi /etc/docker/daemon.json
```
增加一条
```
"insecure-registries":["192.168.1.11:80"]
```
重启docker
```
systemctl daemon-reload
systemctl restart docker
```
6. 假如重启docker后harbor有问题要重新跑一遍harbor的docker-compose
```
cd /usr/local/docker/harbor/
docker-compose stop
docker-compose up -d
```
## 设置开机自启
```
cd /etc/rc.d/init.d/
```
创建自启脚本`vi autostart.sh`内容如下
```
#!/bin/sh
#chkconfig: 2345 80 90
#description: 开机自启动脚本
# harbor启动是需要顺序的docker关闭之后由docker启动的不太行要docker-compose进行启动
cd /usr/local/docker/harbor/
docker-compose restart
cd /usr/local/docker/jenkins/
docker-compose restart
# 让jenkins可以使用宿主机的docker 虽然加到了开机自启,但是不知道为何这个不会生效。所以每次重启,都需要重新执行一下下面两条命令
chown root:root /var/run/docker.sock
chmod o+rw /var/run/docker.sock
```
增加脚本的可执行权限
```
chmod +x autostart.sh
```
把服务添加到chkconfig列表
```
chkconfig --add autostart.sh
```
查看服务自启动状态(如果2~5都是on就表明会自动启动了)
```
chkconfig --list autostart.sh
```

220
devops指南/2.k8s安装.md Normal file
View File

@ -0,0 +1,220 @@
需要一个master节点一个worker节点
主节点需要组件
- docker也可以是其他容器运行时
- kubectl 集群命令行交互工具
- kubeadm 集群初始化工具
工作节点需要组件
- docker也可以是其他容器运行时
- kubelet 管理 Pod 和容器,确保他们健康稳定运行。
- kube-proxy 网络代理,负责网络相关的工作
```
# 关闭selinux
# 临时禁用selinux
setenforce 0
# 禁用交换分区
swapoff -a
# 永久禁用,打开/etc/fstab注释掉swap那一行。
sed -i 's/.*swap.*/#&/' /etc/fstab
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 删除之前的cni 网络信息
ip link set cni0 down
brctl delbr cni0
# 安装依赖
yum install -y epel-release conntrack ipvsadm ipset jq sysstat curl iptables libseccomp
# 关闭防火墙
systemctl disable firewalld && systemctl stop firewalld
# 设置iptables
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT
# 禁用 SELinux
# 永久关闭 修改/etc/sysconfig/selinux文件设置
sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
# 加载内核模块
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
modprobe -- br_netfilter
EOF
# 修改访问权限
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules
# 配置内核参数将桥接的IPv4流量传递到iptables的链
cat << EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF
sysctl -p /etc/sysctl.d/k8s.conf
# docker 安装:
# 安装docker所需的工具
yum install -y yum-utils device-mapper-persistent-data lvm2
# 配置阿里云的docker源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装 docker-ce docker-ce-cli
yum makecache fast
yum install -y docker-ce docker-ce-cli
# 安装完成后配置启动时的命令,否则 docker 会将 iptables FORWARD chain 的默认策略设置为DROP
sed -i "13i ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT" /usr/lib/systemd/system/docker.service
# 启动docker
systemctl enable docker && systemctl start docker
# Kubernetes 默认设置cgroup驱动位为 "systemd" ,而 Docker 服务的cgroup驱动默认为 "cgroupfs",
# insecure-registries 里面的ip和端口改成harbor所在的ip和端口
# 建议将其修改为 “systemd", 与 Kubernetes 保持一致 ##
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://0hz7oz4n.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"insecure-registries":["192.168.1.11:80"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m","max-file": "1"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
EOF
# 重启Docker 服务
sudo systemctl daemon-reload
sudo systemctl restart docker
# 添加阿里云的K8S源: k8s-master k8s-node1 k8s-node2
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# 检查一下最新的1.23的版本
yum list --showduplicates kubeadm --disableexcludes=kubernetes
# 每个节点分别设置对应主机名
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2
# 所有节点都修改 hosts
vi /etc/hosts
192.168.1.5 k8s-master
192.168.193.128 k8s-node1
192.168.1.18 k8s-node2
# 安装kubeadm kubectl kubelet 1.23.12(大于等于24的话docker就不能愉快工作了)
# 主节点
yum install -y kubelet-1.23.12 kubectl-1.23.12 kubeadm-1.23.12
# node节点
yum install -y kubelet-1.23.12 kubectl-1.23.12 kubeadm-1.23.12
echo 'KUBELET_EXTRA_ARGS="--runtime-cgroups=/systemd/system.slice --kubelet-cgroups=/systemd/system.slice"' > /etc/sysconfig/kubelet
# 启动kubelet服务
systemctl enable kubelet && systemctl start kubelet
# 查看已经安装的版本
kubelet --version
```
二. 初始化 k8s-master 环境 或 kubeadm reset 后都要按以下步骤执行, IP地址需根据实际情况调整
```
# 因为需要下载 images 需要一些时间, 这里会等待一会儿, IP 按当前网络环境自行修改:
# 说明: https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm-init/
kubeadm init \
--kubernetes-version=1.23.12 \
--apiserver-advertise-address=192.168.1.5 \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16
```
命令说明:
pod-network-cidr: 定义pod网段为10.244.0.0/16
apiserver-advertise-addressmaster主机内网IP地址
image-repository指定阿里云镜像仓库地址。由于kubeadm 默认从官网http://k8s.grc.io下载所需镜像国内无法访问因此需要通过image-repository指定阿里云镜像仓库地址。
集群初始化会出现如下结果
Your Kubernetes control-plane has initialized successfully!
上面安装完后,会提示你输入如下命令,复制粘贴过来,执行即可。
```
# 上面安装完成后k8s会提示你输入如下命令执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
```
如果是root用户请执行: 最好加入到 .zshrc .bashrc, 此处有疑问.... TODO:
```
export KUBECONFIG=/etc/kubernetes/admin.conf
```
node机上执行: 此时执行会报错并且执行不成功, 请稍等执行好flannel 再到node机上执行: 如忘记: 可使用命令 kubeadm token create --print-join-command 查看:
```
kubeadm join 192.168.1.5:6443 --token zxk5dz.es4kdp9ahxydsk5i \
--discovery-token-ca-cert-hash sha256:a5f29decea10aecf53cb174b22120095dade42303b34b5d4f5ea7e0bf4fb00b8
```
配置: kube-flannel.yml
```
# 服务器没办法访问的话,直接把这个地址在浏览器打开,然后下载下来也可以
curl -k -O https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml
```
重要: ok, 此时去node机上执行 kubeadm join 即可, 这时在node执行 join 时会自动生 /run/flannel/subnet.env 文件, 而不会再报找不到文件的错误!

View File

@ -0,0 +1,29 @@
1、所有节点
```
#所有机器安装
yum install -y nfs-utils
```
2、主节点
```
#nfs主节点
echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports
mkdir -p /nfs/data
systemctl enable rpcbind --now
systemctl enable nfs-server --now
#配置生效
exportfs -r
```
3、从节点
```
showmount -e 主节点ip
#执行以下命令挂载 nfs 服务器上的共享目录到本机路径 /root/nfsmount
mkdir -p /nfs/data
mount -t nfs 主节点ip:/nfs/data /nfs/data
# 写入一个测试文件
echo "hello nfs server" > /nfs/data/test.txt
```

View File

@ -0,0 +1,50 @@
1. 创建在harbor上创建个名命空间创建完之后要在jekninsfile改成对应的名命空间。
2. 在k8s当中创建一个和harbor当中一样的名命空间。这个名命空间要在jenkinsfile当中进行编辑。目前就叫做`mall4cloud-release`
3. 为jenkins创建git账号与harbor账号
在jenkins-系统管理配置-Manage Credentials-全局Manage Credentials这个管理界面下面有个列表列表域下面有个全局-添加凭据
如果无法手动进入的话,可以访问 `jenkins域名+/credentials/store/system/domain/_/`
添加两个凭据把git和harbor的用户名和密码放进去保存。
4. 根据本目录下的jenkinsfile文件夹在jenkins当中添加不同的”流水线“任务任务名和文件名可以类似。
5. 修改jenkinsfile里面的GIT_CREDENTIAL_ID与HARBOR_CREDENTIAL_ID让jenkins可以访问到。
6. 修改jenkinsfile里面的environment配置改成自己的环境。复制进去jenkins的流水线脚本框内保存。前端的jenkinsfile要改掉里面的域名。
7. 在nfs当中的`/nfs/data`下,创建几个放中间件需要的文件夹,将`开发环境搭建`当中的`中间件docker-compose一键安装`里面的内容进行阅读。并把里面的文件夹的内容放到对应的nfs的文件夹当中。
```shell
mkdir mall4j-middleware
mkdir mall4cloud-release
cd mall4j-middleware
mkdir mall4j-canal
mkdir mall4j-elasticsearch
mkdir mall4j-minio
mkdir mall4j-mongo
mkdir mall4j-mysql
mkdir mall4j-nacos
mkdir mall4j-nginx
mkdir mall4j-rocketmq
mkdir mall4j-seata
mkdir mall4j-aof-redis
mkdir mall4j-shardingsphere
```
9. 创建中间件所在的名命空间,起名为`mall4j-middleware`,将`mall4j-middleware.yaml`导入注意里面的配置是否与nfs当中的ip和环境变量之类的一致。
10. 创建商城容器的名命空间,起名为`mall4cloud-release`,将`mall4cloud-release.yaml`导入注意里面的ip之类的会不会有问题。还要在`mall4cloud-release`当中创建harbor的密文起名为harbor。
否则里面的yaml里面的配置无效就没办法拉取镜像了。
```
imagePullSecrets:
- name: harbor
```

29
devops指南/README.md Normal file
View File

@ -0,0 +1,29 @@
因为我们不是专业的讲师,所以专业的讲课交给专业的人处理。
如果想要了解devops的可以看下https://www.bilibili.com/video/BV13Y411E7nd
nfs的概念可以看下这个https://www.bilibili.com/video/BV13Q4y1C7hS/?p=63
jenkins点击部署大概会经历以下几个流程
1. 在jenkins内部对代码进行打包(maven或者npm)进行打包。
2. 然后用docker进行build构建镜像。
3. 将已经构建好的docker镜像放到harbor当中。
4. 通知k8s拉取harbor当中的镜像部署。
因此需要安装jenkins、harbor、k8s。推荐 jenkins和harbor放在一台硬盘容量的机器比如1t的硬盘。
如果只是测试环境k8s至少需要一台master2核4g一台node8核32g
如果是生产环境k8s至少需要一台master2核4g,node节点不限台内存加起来起码要超过64g。
因为用上了k8s所以有公共存储的概念还需要一台机器作为nfs。
一共至少需要4台机器
1. 一台`jenkins+harbor`1t硬盘
2. 一台k8s master2核4g
3. 一台k8s node8核32g
4. 一台nfs1t硬盘

View File

@ -0,0 +1,55 @@
pipeline {
agent any
environment {
// git账号不用改
GIT_CREDENTIAL_ID = '175776d4-6bbc-4da1-ace2-f2a89453fba4'
// git地址
GIT_ADDRESS = 'https://git.mall4j.com/mall4cloud/mall4cloud-uniapp'
// git分支
GIT_BRANCH = 'master'
// harbor账号不用改
HARBOR_CREDENTIAL_ID = 'edd44d2d-f182-40ab-8e72-b4fcae6f793f'
// harbor地址
HARBOR_ADDR = '192.168.1.11:80'
// 名命空间
NAMESPACE = 'mall4cloud-release'
}
stages {
stage ('拉取git仓库代码') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '*/' + "$GIT_BRANCH"]], extensions: [], userRemoteConfigs: [[credentialsId: "$GIT_CREDENTIAL_ID", url: "$GIT_ADDRESS"]]])
}
}
stage ('通过npm构建项目') {
steps {
sh '''export PATH=/var/jenkins_home/nodejs/bin:$PATH
rm -f .env.production
tee ./.env.production <<-'EOF'
VITE_APP_MP_APPID = 'wx42bbe857570c5b40'
VITE_APP_RESOURCES_URL = 'https://mall4j-minio.mall4j.com/mall4cloud'
VITE_APP_BASE_API = 'https://cloud-api.mall4j.com'
VITE_APP_WS_IM_API = 'wss://cloud-api.mall4j.com'
VITE_APP_DOMAIN_ADDRESS = 'https://h5.mall4j.com/cloud'
EOF
npm config set registry https://registry.npmmirror.com
pnpm install --no-frozen-lockfile
pnpm run build:h5'''
}
}
stage('构建mall4cloud-h5镜像') {
steps {
withEnv(["PROJECT_NAME=mall4cloud-h5"]) {
sh 'docker build -t $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER .'
withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$HARBOR_CREDENTIAL_ID" ,)]) {
sh 'echo "$DOCKER_PASSWORD" | docker login $HARBOR_ADDR -u "$DOCKER_USERNAME" --password-stdin'
sh 'docker push $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER'
sh 'ssh root@192.168.1.5 kubectl set image deploy/$PROJECT_NAME $PROJECT_NAME=$HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER -n $NAMESPACE'
}
}
}
}
}
}

View File

@ -0,0 +1,217 @@
pipeline {
agent any
environment {
// git账号
GIT_CREDENTIAL_ID = '175776d4-6bbc-4da1-ace2-f2a89453fba4'
// git地址
GIT_ADDRESS = 'https://git.mall4j.com/mall4cloud/mall4cloud'
// git分支
GIT_BRANCH = 'master'
// harbor账号
HARBOR_CREDENTIAL_ID = 'edd44d2d-f182-40ab-8e72-b4fcae6f793f'
// harbor地址
HARBOR_ADDR = '192.168.1.11:80'
// 名命空间
NAMESPACE = 'mall4cloud-release'
}
stages {
stage ('拉取git仓库代码') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '*/' + "$GIT_BRANCH"]], extensions: [], userRemoteConfigs: [[credentialsId: "$GIT_CREDENTIAL_ID", url: "$GIT_ADDRESS"]]])
}
}
stage ('通过maven构建项目') {
steps {
// 构建项目
sh '/var/jenkins_home/maven/bin/mvn -T 1C clean package -DskipTests=true'
}
}
stage ('通过docker并行制作镜像') {
parallel {
stage('构建mall4cloud-auth镜像') {
steps {
withEnv(["PROJECT_NAME=mall4cloud-auth"]) {
sh 'cd ./$PROJECT_NAME && docker build -t $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER .'
withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$HARBOR_CREDENTIAL_ID" ,)]) {
sh 'echo "$DOCKER_PASSWORD" | docker login $HARBOR_ADDR -u "$DOCKER_USERNAME" --password-stdin'
sh 'docker push $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER'
sh 'ssh root@192.168.1.5 kubectl set image deploy/$PROJECT_NAME $PROJECT_NAME=$HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER -n $NAMESPACE'
}
}
}
}
stage('构建mall4cloud-biz镜像') {
steps {
withEnv(["PROJECT_NAME=mall4cloud-biz"]) {
sh 'cd ./$PROJECT_NAME && docker build -t $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER .'
withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$HARBOR_CREDENTIAL_ID" ,)]) {
sh 'echo "$DOCKER_PASSWORD" | docker login $HARBOR_ADDR -u "$DOCKER_USERNAME" --password-stdin'
sh 'docker push $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER'
sh 'ssh root@192.168.1.5 kubectl set image deploy/$PROJECT_NAME $PROJECT_NAME=$HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER -n $NAMESPACE'
}
}
}
}
stage('构建mall4cloud-marketing镜像') {
steps {
withEnv(["PROJECT_NAME=mall4cloud-marketing"]) {
sh 'cd ./$PROJECT_NAME && docker build -t $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER .'
withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$HARBOR_CREDENTIAL_ID" ,)]) {
sh 'echo "$DOCKER_PASSWORD" | docker login $HARBOR_ADDR -u "$DOCKER_USERNAME" --password-stdin'
sh 'docker push $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER'
sh 'ssh root@192.168.1.5 kubectl set image deploy/$PROJECT_NAME $PROJECT_NAME=$HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER -n $NAMESPACE'
}
}
}
}
stage('构建mall4cloud-flow镜像') {
steps {
withEnv(["PROJECT_NAME=mall4cloud-flow"]) {
sh 'cd ./$PROJECT_NAME && docker build -t $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER .'
withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$HARBOR_CREDENTIAL_ID" ,)]) {
sh 'echo "$DOCKER_PASSWORD" | docker login $HARBOR_ADDR -u "$DOCKER_USERNAME" --password-stdin'
sh 'docker push $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER'
sh 'ssh root@192.168.1.5 kubectl set image deploy/$PROJECT_NAME $PROJECT_NAME=$HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER -n $NAMESPACE'
}
}
}
}
stage('构建mall4cloud-gateway镜像') {
steps {
withEnv(["PROJECT_NAME=mall4cloud-gateway"]) {
sh 'cd ./$PROJECT_NAME && docker build -t $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER .'
withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$HARBOR_CREDENTIAL_ID" ,)]) {
sh 'echo "$DOCKER_PASSWORD" | docker login $HARBOR_ADDR -u "$DOCKER_USERNAME" --password-stdin'
sh 'docker push $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER'
sh 'ssh root@192.168.1.5 kubectl set image deploy/$PROJECT_NAME $PROJECT_NAME=$HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER -n $NAMESPACE'
}
}
}
}
stage('构建mall4cloud-group镜像') {
steps {
withEnv(["PROJECT_NAME=mall4cloud-group"]) {
sh 'cd ./$PROJECT_NAME && docker build -t $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER .'
withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$HARBOR_CREDENTIAL_ID" ,)]) {
sh 'echo "$DOCKER_PASSWORD" | docker login $HARBOR_ADDR -u "$DOCKER_USERNAME" --password-stdin'
sh 'docker push $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER'
sh 'ssh root@192.168.1.5 kubectl set image deploy/$PROJECT_NAME $PROJECT_NAME=$HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER -n $NAMESPACE'
}
}
}
}
stage('构建mall4cloud-im镜像') {
steps {
withEnv(["PROJECT_NAME=mall4cloud-im"]) {
sh 'cd ./$PROJECT_NAME && docker build -t $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER .'
withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$HARBOR_CREDENTIAL_ID" ,)]) {
sh 'echo "$DOCKER_PASSWORD" | docker login $HARBOR_ADDR -u "$DOCKER_USERNAME" --password-stdin'
sh 'docker push $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER'
sh 'ssh root@192.168.1.5 kubectl set image deploy/$PROJECT_NAME $PROJECT_NAME=$HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER -n $NAMESPACE'
}
}
}
}
stage('构建mall4cloud-leaf镜像') {
steps {
withEnv(["PROJECT_NAME=mall4cloud-leaf"]) {
sh 'cd ./$PROJECT_NAME && docker build -t $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER .'
withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$HARBOR_CREDENTIAL_ID" ,)]) {
sh 'echo "$DOCKER_PASSWORD" | docker login $HARBOR_ADDR -u "$DOCKER_USERNAME" --password-stdin'
sh 'docker push $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER'
sh 'ssh root@192.168.1.5 kubectl set image deploy/$PROJECT_NAME $PROJECT_NAME=$HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER -n $NAMESPACE'
}
}
}
}
stage('构建mall4cloud-order镜像') {
steps {
withEnv(["PROJECT_NAME=mall4cloud-order"]) {
sh 'cd ./$PROJECT_NAME && docker build -t $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER .'
withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$HARBOR_CREDENTIAL_ID" ,)]) {
sh 'echo "$DOCKER_PASSWORD" | docker login $HARBOR_ADDR -u "$DOCKER_USERNAME" --password-stdin'
sh 'docker push $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER'
sh 'ssh root@192.168.1.5 kubectl set image deploy/$PROJECT_NAME $PROJECT_NAME=$HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER -n $NAMESPACE'
}
}
}
}
stage('构建mall4cloud-payment镜像') {
steps {
withEnv(["PROJECT_NAME=mall4cloud-payment"]) {
sh 'cd ./$PROJECT_NAME && docker build -t $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER .'
withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$HARBOR_CREDENTIAL_ID" ,)]) {
sh 'echo "$DOCKER_PASSWORD" | docker login $HARBOR_ADDR -u "$DOCKER_USERNAME" --password-stdin'
sh 'docker push $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER'
sh 'ssh root@192.168.1.5 kubectl set image deploy/$PROJECT_NAME $PROJECT_NAME=$HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER -n $NAMESPACE'
}
}
}
}
stage('构建mall4cloud-admin镜像') {
steps {
withEnv(["PROJECT_NAME=mall4cloud-admin"]) {
sh 'cd ./$PROJECT_NAME && docker build -t $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER .'
withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$HARBOR_CREDENTIAL_ID" ,)]) {
sh 'echo "$DOCKER_PASSWORD" | docker login $HARBOR_ADDR -u "$DOCKER_USERNAME" --password-stdin'
sh 'docker push $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER'
sh 'ssh root@192.168.1.5 kubectl set image deploy/$PROJECT_NAME $PROJECT_NAME=$HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER -n $NAMESPACE'
}
}
}
}
stage('构建mall4cloud-product镜像') {
steps {
withEnv(["PROJECT_NAME=mall4cloud-product"]) {
sh 'cd ./$PROJECT_NAME && docker build -t $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER .'
withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$HARBOR_CREDENTIAL_ID" ,)]) {
sh 'echo "$DOCKER_PASSWORD" | docker login $HARBOR_ADDR -u "$DOCKER_USERNAME" --password-stdin'
sh 'docker push $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER'
sh 'ssh root@192.168.1.5 kubectl set image deploy/$PROJECT_NAME $PROJECT_NAME=$HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER -n $NAMESPACE'
}
}
}
}
stage('构建mall4cloud-search镜像') {
steps {
withEnv(["PROJECT_NAME=mall4cloud-search"]) {
sh 'cd ./$PROJECT_NAME && docker build -t $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER .'
withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$HARBOR_CREDENTIAL_ID" ,)]) {
sh 'echo "$DOCKER_PASSWORD" | docker login $HARBOR_ADDR -u "$DOCKER_USERNAME" --password-stdin'
sh 'docker push $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER'
sh 'ssh root@192.168.1.5 kubectl set image deploy/$PROJECT_NAME $PROJECT_NAME=$HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER -n $NAMESPACE'
}
}
}
}
stage('构建mall4cloud-seckill镜像') {
steps {
withEnv(["PROJECT_NAME=mall4cloud-seckill"]) {
sh 'cd ./$PROJECT_NAME && docker build -t $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER .'
withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$HARBOR_CREDENTIAL_ID" ,)]) {
sh 'echo "$DOCKER_PASSWORD" | docker login $HARBOR_ADDR -u "$DOCKER_USERNAME" --password-stdin'
sh 'docker push $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER'
sh 'ssh root@192.168.1.5 kubectl set image deploy/$PROJECT_NAME $PROJECT_NAME=$HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER -n $NAMESPACE'
}
}
}
}
stage('构建mall4cloud-user镜像') {
steps {
withEnv(["PROJECT_NAME=mall4cloud-user"]) {
sh 'cd ./$PROJECT_NAME && docker build -t $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER .'
withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$HARBOR_CREDENTIAL_ID" ,)]) {
sh 'echo "$DOCKER_PASSWORD" | docker login $HARBOR_ADDR -u "$DOCKER_USERNAME" --password-stdin'
sh 'docker push $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER'
sh 'ssh root@192.168.1.5 kubectl set image deploy/$PROJECT_NAME $PROJECT_NAME=$HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER -n $NAMESPACE'
}
}
}
}
}
}
}
}

View File

@ -0,0 +1,57 @@
pipeline {
agent any
environment {
// git账号不用改
GIT_CREDENTIAL_ID = '175776d4-6bbc-4da1-ace2-f2a89453fba4'
// git地址
GIT_ADDRESS = 'https://git.mall4j.com/mall4cloud/mall4cloud-multishop'
// git分支
GIT_BRANCH = 'master'
// harbor账号不用改
HARBOR_CREDENTIAL_ID = 'edd44d2d-f182-40ab-8e72-b4fcae6f793f'
// harbor地址
HARBOR_ADDR = '192.168.1.11:80'
// 名命空间
NAMESPACE = 'mall4cloud-release'
}
stages {
stage ('拉取git仓库代码') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '*/' + "$GIT_BRANCH"]], extensions: [], userRemoteConfigs: [[credentialsId: "$GIT_CREDENTIAL_ID", url: "$GIT_ADDRESS"]]])
}
}
stage ('通过npm构建项目') {
steps {
sh '''export PATH=/var/jenkins_home/nodejs/bin:$PATH
rm -f .env.production
tee ./.env.production <<-'EOF'
// api接口请求地址
VITE_APP_BASE_API = 'https://cloud-api.mall4j.com'
// 客服webstock接口请求地址 如果是ip的话用 wswss对应的是https
VITE_APP_WEBSOCKET_URL = 'wss://cloud-api.mall4j.com'
VITE_APP_RESOURCES_URL = 'https://mall4j-minio.mall4j.com/mall4cloud'
EOF
sed -i "s#cloud-multishop.mall4j.com#cloud-multishop.mall4j.com#g" nginx.conf
npm config set registry https://registry.npmmirror.com
pnpm install --no-frozen-lockfile
pnpm run build'''
}
}
stage('构建mall4cloud-multishop-vue镜像') {
steps {
withEnv(["PROJECT_NAME=mall4cloud-multishop-vue"]) {
sh 'docker build -t $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER .'
withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$HARBOR_CREDENTIAL_ID" ,)]) {
sh 'echo "$DOCKER_PASSWORD" | docker login $HARBOR_ADDR -u "$DOCKER_USERNAME" --password-stdin'
sh 'docker push $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER'
sh 'ssh root@192.168.1.5 kubectl set image deploy/$PROJECT_NAME $PROJECT_NAME=$HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER -n $NAMESPACE'
}
}
}
}
}
}

View File

@ -0,0 +1,55 @@
pipeline {
agent any
environment {
// git账号不用改
GIT_CREDENTIAL_ID = '175776d4-6bbc-4da1-ace2-f2a89453fba4'
// git地址
GIT_ADDRESS = 'https://git.mall4j.com/mall4cloud/mall4cloud-pc'
// git分支
GIT_BRANCH = 'master'
// harbor账号不用改
HARBOR_CREDENTIAL_ID = 'edd44d2d-f182-40ab-8e72-b4fcae6f793f'
// harbor地址
HARBOR_ADDR = '192.168.1.11:80'
// 名命空间
NAMESPACE = 'mall4cloud-release'
}
stages {
stage ('拉取git仓库代码') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '*/' + "$GIT_BRANCH"]], extensions: [], userRemoteConfigs: [[credentialsId: "$GIT_CREDENTIAL_ID", url: "$GIT_ADDRESS"]]])
}
}
stage ('通过npm构建项目') {
steps {
sh '''export PATH=/var/jenkins_home/nodejs/bin:$PATH
rm -f .env.production
tee ./.env.production <<-'EOF'
VITE_APP_RESOURCES_URL = 'https://mall4j-minio.mall4j.com/mall4cloud'
VITE_APP_BASE_API = 'https://cloud-api.mall4j.com'
VITE_APP_WS_IM_API = 'wss://cloud-api.mall4j.com'
VITE_APP_H5_DOMAIN = 'https://h5.mall4j.com/cloud'
VITE_APP_MERCHANT_PLATFORM_URL = 'https://cloud-multishop.mall4j.com'
VITE_APP_SUPPLIER_PLATFORM_URL = 'https://cloud-supplier.mall4j.com'
EOF
npm config set registry https://registry.npmmirror.com
pnpm install --no-frozen-lockfile
pnpm run build'''
}
}
stage('构建mall4cloud-pc镜像') {
steps {
withEnv(["PROJECT_NAME=mall4cloud-pc"]) {
sh 'docker build -t $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER .'
withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$HARBOR_CREDENTIAL_ID" ,)]) {
sh 'echo "$DOCKER_PASSWORD" | docker login $HARBOR_ADDR -u "$DOCKER_USERNAME" --password-stdin'
sh 'docker push $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER'
sh 'ssh root@192.168.1.5 kubectl set image deploy/$PROJECT_NAME $PROJECT_NAME=$HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER -n $NAMESPACE'
}
}
}
}
}
}

View File

@ -0,0 +1,57 @@
pipeline {
agent any
environment {
// git账号不用改
GIT_CREDENTIAL_ID = '175776d4-6bbc-4da1-ace2-f2a89453fba4'
// git地址
GIT_ADDRESS = 'https://git.mall4j.com/mall4cloud/mall4cloud-platform'
// git分支
GIT_BRANCH = 'master'
// harbor账号不用改
HARBOR_CREDENTIAL_ID = 'edd44d2d-f182-40ab-8e72-b4fcae6f793f'
// harbor地址
HARBOR_ADDR = '192.168.1.11:80'
// 名命空间
NAMESPACE = 'mall4cloud-release'
}
stages {
stage ('拉取git仓库代码') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '*/' + "$GIT_BRANCH"]], extensions: [], userRemoteConfigs: [[credentialsId: "$GIT_CREDENTIAL_ID", url: "$GIT_ADDRESS"]]])
}
}
stage ('通过npm构建项目') {
steps {
sh '''export PATH=/var/jenkins_home/nodejs/bin:$PATH
rm -f .env.production
tee ./.env.production <<-'EOF'
// api接口请求地址
VITE_APP_BASE_API = 'https://cloud-api.mall4j.com'
// 客服webstock接口请求地址 如果是ip的话用 wswss对应的是https
VITE_APP_WEBSOCKET_URL = 'wss://cloud-api.mall4j.com'
VITE_APP_RESOURCES_URL = 'https://mall4j-minio.mall4j.com/mall4cloud'
EOF
sed -i "s#cloud-platform.mall4j.com#cloud-platform.mall4j.com#g" nginx.conf
npm config set registry https://registry.npmmirror.com
pnpm install --no-frozen-lockfile
pnpm run build'''
}
}
stage('构建mall4cloud-platform-vue镜像') {
steps {
withEnv(["PROJECT_NAME=mall4cloud-platform-vue"]) {
sh 'docker build -t $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER .'
withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$HARBOR_CREDENTIAL_ID" ,)]) {
sh 'echo "$DOCKER_PASSWORD" | docker login $HARBOR_ADDR -u "$DOCKER_USERNAME" --password-stdin'
sh 'docker push $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER'
sh 'ssh root@192.168.1.5 kubectl set image deploy/$PROJECT_NAME $PROJECT_NAME=$HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER -n $NAMESPACE'
}
}
}
}
}
}

View File

@ -0,0 +1,53 @@
pipeline {
agent any
environment {
// git账号不用改
GIT_CREDENTIAL_ID = '175776d4-6bbc-4da1-ace2-f2a89453fba4'
// git地址
GIT_ADDRESS = 'https://git.mall4j.com/mall4cloud/mall4cloud-station.git'
// git分支
GIT_BRANCH = 'master'
// harbor账号不用改
HARBOR_CREDENTIAL_ID = 'edd44d2d-f182-40ab-8e72-b4fcae6f793f'
// harbor地址
HARBOR_ADDR = '192.168.1.11:80'
// 名命空间
NAMESPACE = 'mall4cloud-release'
}
stages {
stage ('拉取git仓库代码') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '*/' + "$GIT_BRANCH"]], extensions: [], userRemoteConfigs: [[credentialsId: "$GIT_CREDENTIAL_ID", url: "$GIT_ADDRESS"]]])
}
}
stage ('通过npm构建项目') {
steps {
sh '''export PATH=/var/jenkins_home/nodejs/bin:$PATH
rm -f .env.production
tee ./.env.production <<-'EOF'
VITE_APP_MP_APPID = 'wx42bbe857570c5b40'
VITE_APP_RESOURCES_URL = 'https://mall4j-minio.mall4j.com/mall4cloud'
VITE_APP_BASE_API = 'https://cloud-api.mall4j.com'
EOF
npm config set registry https://registry.npmmirror.com
pnpm install --no-frozen-lockfile
pnpm run build:h5'''
}
}
stage('构建mall4cloud-station镜像') {
steps {
withEnv(["PROJECT_NAME=mall4cloud-station"]) {
sh 'docker build -t $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER .'
withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$HARBOR_CREDENTIAL_ID" ,)]) {
sh 'echo "$DOCKER_PASSWORD" | docker login $HARBOR_ADDR -u "$DOCKER_USERNAME" --password-stdin'
sh 'docker push $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER'
sh 'ssh root@192.168.1.5 kubectl set image deploy/$PROJECT_NAME $PROJECT_NAME=$HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER -n $NAMESPACE'
}
}
}
}
}
}

View File

@ -0,0 +1,54 @@
pipeline {
agent any
environment {
// git账号不用改
GIT_CREDENTIAL_ID = '175776d4-6bbc-4da1-ace2-f2a89453fba4'
// git地址
GIT_ADDRESS = 'https://git.mall4j.com/mall4cloud/mall4cloud-slipper'
// git分支
GIT_BRANCH = 'master'
// harbor账号不用改
HARBOR_CREDENTIAL_ID = 'edd44d2d-f182-40ab-8e72-b4fcae6f793f'
// harbor地址
HARBOR_ADDR = '192.168.1.11:80'
// 名命空间
NAMESPACE = 'mall4cloud-release'
}
stages {
stage ('拉取git仓库代码') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '*/' + "$GIT_BRANCH"]], extensions: [], userRemoteConfigs: [[credentialsId: "$GIT_CREDENTIAL_ID", url: "$GIT_ADDRESS"]]])
}
}
stage ('通过npm构建项目') {
steps {
sh '''export PATH=/var/jenkins_home/nodejs/bin:$PATH
rm -f .env.production
tee ./.env.production <<-'EOF'
// api接口请求地址
VITE_APP_BASE_API = 'https://cloud-api.mall4j.com'
VITE_APP_RESOURCES_URL = 'https://mall4j-minio.mall4j.com/mall4cloud'
EOF
sed -i "s#cloud-supplier.mall4j.com#cloud-supplier.mall4j.com#g" nginx.conf
npm config set registry https://registry.npmmirror.com
pnpm install --no-frozen-lockfile
pnpm run build'''
}
}
stage('构建mall4cloud-supplier-vue镜像') {
steps {
withEnv(["PROJECT_NAME=mall4cloud-supplier-vue"]) {
sh 'docker build -t $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER .'
withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$HARBOR_CREDENTIAL_ID" ,)]) {
sh 'echo "$DOCKER_PASSWORD" | docker login $HARBOR_ADDR -u "$DOCKER_USERNAME" --password-stdin'
sh 'docker push $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER'
sh 'ssh root@192.168.1.5 kubectl set image deploy/$PROJECT_NAME $PROJECT_NAME=$HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER -n $NAMESPACE'
}
}
}
}
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 244 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 354 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Some files were not shown because too many files have changed in this diff Show More