DevOps流程demo(实操记录)
文章目录
- DevOps流程demo(实操记录)
- 安装下载流程
- VMVare安装
- Centos下载
- centos-gitlab
- 安装docker
- 安装gitlab
- cnetos-jekins
- jdk和maven安装
- jenkins安装
- 配置jenkins
- 简单走一下CI流程
- 补充基础CD操作
- sonarQube安装
- jenkins整合sonarQube
- Harbor安装(镜像仓库)
- 把harbor整合到jenkins
- jenkins流水线
- 通知钉钉
- Kubernates
- 安装k8s管理工具
- 一个pod里面运行一个nginx的容器
- 一个pod运行多个容器
- deployment管理pod
- Service
- Ingress操作
- jenkins整合k8s
- 自动化CI
DevOps流程demo(实操记录)
安装下载流程
VMVare安装
Centos下载
https://vault.centos.org/7.8.2003/isos/x86_64/
参考:https://blog.csdn.net/weixin_46623617/article/details/110008032
遇到的问题:
1、connect: Network is unreachable解决方案:
https://blog.csdn.net/qq_41793064/article/details/102641743
2、出现bash: ifconfig:command not found的解决办法,即安装ifconfig命令(亲测有效)
https://www.cnblogs.com/wangpingcong/p/12570929.html
准备一个clear的虚拟机,后面就克隆该虚拟机,采用完整克隆,如下图:
centos-gitlab
踩坑:gitlab比较大,最好设置40GB!!!
安装docker
1、下载docker依赖组件:
yum -y install yum-utils device-mapper-persistent-data lvm2
2、设置下载docker镜像源为阿里云:
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3、安装docker服务
yum -y install docker-ce
4、启动docker,并设置开机自启
systemctl start docker
systemctl enable docker
[root@localhost ~]# docker version
Client: Docker Engine - CommunityVersion: 20.10.17API version: 1.41Go version: go1.17.11Git commit: 100c701Built: Mon Jun 6 23:05:12 2022OS/Arch: linux/amd64Context: defaultExperimental: trueServer: Docker Engine - CommunityEngine:Version: 20.10.17API version: 1.41 (minimum version 1.12)Go version: go1.17.11Git commit: a89b842Built: Mon Jun 6 23:03:33 2022OS/Arch: linux/amd64Experimental: falsecontainerd:Version: 1.6.6GitCommit: 10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1runc:Version: 1.1.2GitCommit: v1.1.2-0-ga916309docker-init:Version: 0.19.0GitCommit: de40ad0
安装docker-compose:
下载地址:https://github.com/docker/compose/releases
下载docker-compose-linux-x86_64
传输文件安装命令:(这里用的XShell)
yum -y install lrzsz
rz -y
[root@localhost ~]# ls
anaconda-ks.cfg docker-compose-linux-x86_64
[root@localhost ~]# ll
total 25204
-rw-------. 1 root root 1274 Aug 1 11:06 anaconda-ks.cfg
-rw-r--r--. 1 root root 25804800 Aug 1 04:53 docker-compose-linux-x86_64
[root@localhost ~]# chmod +x docker-compose-linux-x86_64
[root@localhost ~]# ls
anaconda-ks.cfg docker-compose-linux-x86_64
[root@localhost ~]# mv docker-compose-linux-x86_64 docker-compose
[root@localhost ~]# ls
anaconda-ks.cfg docker-compose
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]# mv docker-compose /usr/bin
[root@localhost ~]# docker-compose version
Docker Compose version v2.8.0
[root@localhost ~]#
安装gitlab
关闭防火墙:
systemctl stop firewalld
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# cd /usr/local
[root@localhost local]# ls
bin etc games include lib lib64 libexec sbin share src
[root@localhost local]# mkdir docker
[root@localhost local]# cd docker/
[root@localhost docker]# mkdir gitlab_docker
[root@localhost docker]# pwd
/usr/local/docker
[root@localhost docker]# cd gitlab_docker/
[root@localhost gitlab_docker]# pwd
/usr/local/docker/gitlab_docker
[root@localhost gitlab_docker]# vi docker-compose.yml[root@localhost gitlab_docker]# docker search gitlab
[root@localhost gitlab_docker]# docker pull gitlab/gitlab-ce:latest
拉取镜像可以从这里搜:https://hub.docker.com/search
遇到的错误:Error response from daemon:
解决:https://blog.csdn.net/Lyon_Nee/article/details/124169099
https://blog.csdn.net/weixin_45600855/article/details/117267344
[root@localhost docker]# cd /usr/local/docker/gitlab_docker
[root@localhost gitlab_docker]# ls
docker-compose.yml
[root@localhost gitlab_docker]# vi docker-compose.yml
version:'3.1'
services:gitlab:image: 'gitlab/gitlab-ce:latest'container_name: gitlabrestart: alwaysenvironment:GITLAB_OMNIBUS_CONFIG: |external_url 'http://192.168.160.132:8929'gitlab_rails['gitlab_shell_ssh_port'] = 2224ports:- '8929:8929'- '2224:2224'volumes:- './config:/etc/gitlab'- './logs:/var/log/gitlab'- './data:/var/opt/gitlab'
参考:https://blog.csdn.net/qq_50573146/article/details/125477985
[root@localhost gitlab_docker]# docker-compose up -d
[+] Running 2/2⠿ Network gitlab_docker-default Created 0.2s⠿ Container gitlab Started 1.4s
[root@localhost gitlab_docker]# docker-compose logs -f #查看日志
出现了错误:
修改:停止正在运行的镜像:
docker ps -a
docker stop 容器id
docker rm 容器id
防火墙问题:https://blog.csdn.net/tootsy_you/article/details/124500127
所有问题解决,现在查看滚动日志,然后等待,会有一定的启动时间:
在浏览器访问:
http://192.168.160.132:8929/
可能会出现下面这样:
不过不要慌,慢慢等。。。
然后这不就出现了,哈哈哈。。。
进入gitlab内部:
[root@localhost gitlab_docker]# docker exec -it gitlab bash
root@65fff652833e:/#
root@65fff652833e:/# cat /etc/gitlab/initial_root_password
# WARNING: This value is valid only in the following conditions
# 1. If provided manually (either via `GITLAB_ROOT_PASSWORD` environment variable or via `gitlab_rails['initial_root_password']` setting in `gitlab.rb`, it was provided before database was seeded for the first time (usually, the first reconfigure run).
# 2. Password hasn't been changed manually, either via UI or via command line.
#
# If the password shown here doesn't work, you must reset the admin password following https://docs.gitlab.com/ee/security/reset_user_password.html#reset-your-root-password.Password: y/Ok+yL0GXifnE43g0wfZ8qkFPcEVE3E7q6SwmCx/HA=# NOTE: This file will be automatically deleted in the first reconfigure run after 24 hours.
root@65fff652833e:/#
密码在上面打印出来了
然后修改密码如下图:
cnetos-jekins
jdk和maven安装
[root@localhost ~]# ls
anaconda-ks.cfg
[root@localhost ~]# rz -y[root@localhost ~]# rz -y
[root@localhost ~]# ls
anaconda-ks.cfg apache-maven-3.8.6-bin.tar.gz jdk-8u251-linux-x64.tar.gz
[root@localhost ~]#
tar -zxvf jdk-8u251-linux-x64.tar.gz -C /usr/local
因为宿主机不会去做什么编译操作,所以没有配置环境变量。。
若要配置请参考:https://blog.csdn.net/weixin_42548459/article/details/116792525
tar -zxvf apache-maven-3.8.6-bin.tar.gz -C /usr/local
[root@localhost ~]# cd /usr/local
[root@localhost local]# mv jdk1.8.0_251/ jdk/
[root@localhost local]# mv apache-maven-3.8.6/ maven/
[root@localhost local]# ls
bin etc games include jdk lib lib64 libexec maven sbin share src
[root@localhost local]# cd maven/
[root@localhost maven]# cd conf/
[root@localhost conf]# vi settings.xml
然后配置settings.xml文件中的镜像源和jdk
可以参考:https://blog.csdn.net/lee_yanyi/article/details/124774038
jenkins安装
PS:我有些地方写的是jekins,是错误的写法,对的写法是jenkins
docker pull jenkins/jenkins:2.339
可以先去jekin官方的download里面找到docker,然后进入doukerhub中去找对应的版本下载。
[root@localhost ~]# cd /usr/local
[root@localhost local]# ls
bin etc games include jdk lib lib64 libexec maven sbin share src
[root@localhost local]# mkdir docker
[root@localhost local]# cd docker
[root@localhost docker]# mkdir jekins_docker
[root@localhost docker]# cd jekins_docker/
[root@localhost jekins_docker]# vi docker-compose.yml
version: "3.6"
services:jekins:image: jenkins/jenkins:2.339container_name: jekinsports:- 8080:8080- 50000:50000volumes:- ./data/:/var/jenkins_home/
root@localhost jekins_docker]# docker logs -f jekins
[root@localhost jekins_docker]# ls
data docker-compose.yml
[root@localhost jekins_docker]# ll
total 4
drwxr-xr-x. 2 root root 6 Aug 2 08:12 data
-rw-r--r--. 1 root root 191 Aug 2 08:12 docker-compose.yml
[root@localhost jekins_docker]# chmod -R 777 data
浏览器访问jenkins:http://192.168.160.129:8080
密码就在日志里面(见上上面截图)
进入–》选择插件安装–》安装–》等待安装插件。。(有些可能会安装失败,不过不要紧)
这里选择继续,进去之后再选择安装
搜索Git Parameter和Publish Over SSH,选择Install without restart
配置jenkins
[root@localhost data]# cd /usr/local
[root@localhost local]# ls
bin docker etc games include jdk lib lib64 libexec maven sbin share src
[root@localhost local]# cd docker/jekins_docker/
[root@localhost jekins_docker]# cd data
[root@localhost data]# pwd
/usr/local/docker/jekins_docker/data
[root@localhost data]# mv /usr/local/jdk/ ./
[root@localhost data]# mv /usr/local/maven/ ./
[root@localhost ~]# docker exec -it jekins bash
jenkins@7cf18e40f55d:/$ cd ~
jenkins@7cf18e40f55d:~$ pwd
/var/jenkins_home
jenkins@7cf18e40f55d:~$ ls
config.xml nodes
copy_reference_file.log plugins
hudson.model.UpdateCenter.xml secret.key
identity.key.enc secret.key.not-so-secret
jdk secrets
jenkins.install.InstallUtil.installingPlugins updates
jenkins.telemetry.Correlator.xml userContent
jobs users
maven war
nodeMonitors.xml
jenkins@7cf18e40f55d:~$ exit
exit
配置好后点击应用、保存
增加目标服务器如下图:
[root@localhost ~]# cd /usr/local
[root@localhost local]# mkdir test
[root@localhost local]# ls
bin docker etc games include lib lib64 libexec sbin share src test
简单走一下CI流程
IDEA创建一个SpringBoot项目:
只勾选web就行了,做一个简单的
package com.houlijuan.demo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class TestController{@GetMapping("/test")public String test(){return "Hello Jenkins!!!";}
}
在之前的centos-gitlab的gitlab中创建一个空白项目
将代码推送至仓库中(如上图)
回到jenkins======新建Item
由于电脑原因跑下去了,后面截视频的图吧,卡得太厉害了。。。。。。。
docker exec -it jenkins bash
cd ~
cd workspace
ls //有src和pom.xml文件
回到jenkins中:
把jar包推送至目标服务器:
https://hub.daocloud.io/
为了方便管理:
出现的问题:
jenkins就是8080端口,冲突了
运行起来了!!
后期需要修改,直接修改后推送到gitlab,然后在jenkins上重新构建即可!!
补充命令:删除为null的镜像
补充基础CD操作
sonarQube安装
docker pull postgres
docker pull sonarqube:8.9.6-communitycd /usr/local/docker
mkdir sonarque_docker
vi docker-compose.ymlversion: '3.6'
services:db:image: postgrescontainer_name: dbports:- 5432:5432networks:- sonarnetenvironment:POSTGRES_USER: sonarPOSTGRES_PASSWORD: sonarsonarqube:image: sonarqube:8.9.6-communitycontainer_name: sonarqubedepends_on:- db //不是容器名,是最上面那个ports:- 9000:9000networks:- sonarnet environment:SONAR_JDBC_URL: jdbc:postgressql://db:5432/sonarSONAR_JDBC_USERNAME: sonarSONAR_JDBC_PASSWORD: sonar
networks:sonarnet:driver: bridge
docker-compose up -d
错误修改:
vi /etc/sysctl.conf
sysctl -p
docker-compose up -d
Maven方式:
sonar-scanner方式:
mv ~/sonar-scanner ./ //就是/usr/local/docker/jenkins-docker/data
cd sonar-scanner
cd conf/
vi sonar-scanner.properties
jenkins整合sonarQube
错误:删除插件的残余
Harbor安装(镜像仓库)
github下载:
tar -zxvf harbor-offline-installer-v2.3.4.tgz -C /usr/local
cd usr/local/harbor
cp harbor.yml.tmpl harbor.yml
修改harbor.yml文件:
./install.sh
vi /etc/docker/daemon.json
{"insecure-registries":["192.168.11.102:80"]
}
docker tag 镜像ID 192.168.11.102:80/repo/mytest:v1.0.0
systemctl restart docker //重启docker,daemon.json文件才能生效
docker login -u admin -p Harbor12345 192.168.11.102:80
docker push 192.168.11.102:80/repo/mytest:v1.0.0
如果目标服务器要拉取镜像,命令为:
docker pull 192.168.11.102:80/repo/mytest:v1.0.0
把harbor整合到jenkins
首先,需要jenkins内部能直接使用宿主机上的docker,要修改文件权限:
cd /var/run
chmod o+rw docker.sock
ll
cd /usr/local/docker/jenkins/jenkins_docker/
ls
vi docker-compose.yml
version: "3.6"
services:jekins:image: jenkins/jenkins:2.339container_name: jekinsports:- 8080:8080- 50000:50000volumes:- ./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
docker-compose up -d
docker exec -it jenkins bash
docker version
shell中:
mv target/*.jar docker/
docker build -t mytest:$tag docker/
docker login -u admin -p Harbor12345 192.168.11.102:80
docker tag mytest:$tag 192.168.11.102:80/repo/mytest:$tag
docker push 192.168.11.102:80/repo/mytest:$tag
思路:在目标服务器编写一个脚本文件,能够接收jenkins传来的上图参数
vi deploy.sh
chmod a+x deploy.sh
horbar_addr=$1
horbar_repo=$2
project=$3
version=$4
port=$5imageName=$horbar_addr/$horbar_repo/$project:$version
echo $imageName
运行测试:
./deploy.sh 192.168.11.102:80 repo mytest v3.0.0 8081
horbar_addr=$1
horbar_repo=$2
project=$3
version=$4
container_port=$5
host_port=$6imageName=$horbar_addr/$horbar_repo/$project:$version
echo $imageNamecontainerId=`docker ps -a | grep ${project} | awk '{print $1}'`
echo $containerIdif [ "$containerId" != "" ] ; thendocker stop $containerIddocker rm $containerId
fitag= `docker images | grep ${project} | awk '{print $2}')`
echo $tagif[[ "$tag"=~"$version" ]] ; thendocker rmi $imageName
fidocker login -u admin -p Harbor12345 $harbor_addr
docker pull $imageName
docker run -d -p $host_port:$container_port--name $project $imageName
echo "SUCESS"
jenkins流水线
//所有的脚本命令都放在pipeline中
pipeline{//指定任务在哪个集群节点中执行agent any//声明全局变量environment {key = 'value'}stages{stage('拉取git仓库代码'){steps{echo '拉取git仓库代码-SUCCESS'}}stage('通过maven构建项目'){steps{echo '通过maven构建项目-SUCCESS'}}stage('通过sonarqbe进行代码质量检测'){steps{echo '通过sonarqbe进行代码质量检测-SUCCESS'}}stage('通过docker制作自定义镜像'){steps{echo '通过docker制作自定义镜像-SUCCESS'}}stage('将自定义镜像推送到harbor中'){steps{echo '将自定义镜像推送到harbor中-SUCCESS'}}stage('通过Publis Over SSH通知目标服务器'){steps{echo '通过Publis Over SSH通知目标服务器-SUCCESS'}}}
}
pipeline也可以通过git方式部署,就是要在项目中添加一个名为Jenkinsfile的文件,如下图:
通知钉钉
在jenkins中去安装Dingtalk这样一个插件
Kubernates
官网介绍:https://kubernetes.io/zh-cn/docs/concepts/overview/what-is-kubernetes/
https://kuboard.cn/
https://kuboard.cn/install/history-k8s/install-k8s-1.19.x.html
上面的网址中有各种操作步骤,跟着步骤走就可以了。。
安装k8s管理工具
https://kuboard.cn/install/v3/install-in-k8s.html#%E6%96%B9%E6%B3%95%E4%B8%80-%E4%BD%BF%E7%94%A8-hostpath-%E6%8F%90%E4%BE%9B%E6%8C%81%E4%B9%85%E5%8C%96
一个pod里面运行一个nginx的容器
kubectl get namespace
kubectl create ns test
kubectl delete ns test
vi namespace-test.ymlapiVersion: v1
kind: Namespace
metadata:name: test
kubectl apply -f namespace-test.yml
kubectl get ns
kubectl get pods
kubectl get pods -A
kubectl get pod -n testkubectl run nginx --image=nginx:latest
kubectl get pod -n default
kubectl decribe pod nginxkubectl delete pod nginx -n default\
kubectl run nginx --image=daocloud.io/library/nginx:1.9.1 -n test
kubectl get pod -n test//从主机
kubectl delete pod nginx -n test
kubectl run nginx --image=daocloud.io/library/nginx:1.9.1 -n test
kubectl get pod -n test
//Master
kubectl decribe pod nginx -n test
curl 10.100.162.196
kubectl logs -f nginx -n test
kubectl exec -it nginx -n test --bash
kubectl delete -f pod-nginx.yml
一个pod运行多个容器
vi pod-nginx-tomcat.ymlapiVersion: v1
kind: Pod
metadata:name: nginx-tomcatnamespace: test
spec:containers:- image: daocloud.io/library/nginx:1.9.1name: nginx- image: daocloud.io/library/tomcat:8.5.57name: tomcat
kubectl apply -f pod-nginx-tomcat.yml
kubectl get pod -n test
kubectl decribe pod nginx-tomcat -n test
deployment管理pod
kubectl get deploy
kubectl get deploy -n test
kubectl create deployment deploy-nginx --image=daocloud.io/library/nginx:1.9.1
kubectl delete deployment deploy-nginxkubectl create deployment deploy-nginx -n test --image=daocloud.io/library/nginx:1.9.1
kubectl get deploy -n test
kubectl apply -f deployment-nginx.yml
Service
kubectl expose deployment nginx-deployment --port=8888 --target-port=80 -n test
kubectl get service -n test
===============================
vi deployment-nginx.yml
Ingress操作
kubectl delete -f deployment-nginx.yml
vi deployment-nginx.yml
kubectl apply -f deployment-nginx.yml
hosts文件在:C:\Windows\System32\drivers\etc目录下
jenkins整合k8s
上图docker pull去掉,然后ip后面加上:80
先可以在master节点上试运行
==========================
添加目标主机为Master:
**centos-jenkins:**让jenkins无密码访问master
docker exec -it jenkins bash
cd ~
ls -a
cd .ssh
cat id_rsa.pub
//然后复制公钥内容
把刚刚复制的公钥粘贴在**authorized_keys(上面图片中写错了)**文件中,就可以实现两主机之间无密码连接了,很多集群也是这么做的!
自动化CI
【参考视频】https://www.bilibili.com/video/BV11u411z719
DevOps流程demo(实操记录)相关推荐
- oracle 读懂10046视频,10046、10053、实操记录
10046是一个Oracle的内部事件(event),通过设置这个事件可以得到Oracle内部执行系统解析.调用.等待.绑定变量等详细的trace信息,即帮助我们解析一条/多条SQL.PL/SQL语句 ...
- CNN实操记录(goal:一日一更新)
导师说:"最快的学习方式是看别人的博客,然后实操.你需要实操." 开始进行CNN实操记录!尽量一日一更新,依照忙的程度进行略微调整,看能坚持多久!争取在下个月汇报前做出点东西. - ...
- 电商数据分析流程 | Excel实操
世界上最深入人心的数据分析工具,是Excel,在日本的程序员考试中,程序语言部分,是可以选择Excel表格工具作为考试选项的.可见其重要性. 数据分析的步骤: 提出问题 理解数据 数据清洗 构建模型 ...
- Debian11安装Proxmox VE 7实操记录
目录 Debian11安装Proxmox VE 7,以下皆为作者借鉴官网教程实操并记录 IP 地址添加 /etc/hosts 使用hostname --ip-address命令测试设置是否正常 设置D ...
- 一文带你学会微信V3版本下单支付、退款、关单流程代码实操
目录 开篇介绍 一.微信支付-Maven依赖加入和代码参数准备 二.商户私钥证书代码读取 三.微信订单支付系列接口URL配置 四.快速验证统一下单接口 五.查询订单支付状态验证 六.关闭订单状态验证 ...
- 抖音极速版/快手极速版自动浏览-实操记录
根据作者繁梦溪所写教程抖音极速版/快手极速版自动浏览进行实际操作,记录其中跳入的坑,具体步骤可点进作者繁梦溪文章查看. 步骤1:安装Python需要的包 1.1 电脑安装Android SDK Pla ...
- 数据导出系统WeBankBlockchain-Data-Export实操记录
实操人:施绍求 概述: WeBankBlockchain-Data-Export是一款基于FISCO BCOS平台的数据导出工具,可以把非结构化的链上数据导出到关系型数据库或ES等数据源中存储,便于后 ...
- [实操记录]Centos8忘记密码了怎么办
Centos8忘记密码了怎么办 前言 步骤 1.重新启动系统 2.编辑配置 3.修改密码 4.重启 ps 前言 记录一次Centos8密码忘记后重置root密码 步骤 1.重新启动系统 在这个页面停住 ...
- 关于注册公司流程(实操)。
前言 自从离职之后,一直有注册公司的打算, 前些日子一直是在网上和实体店中咨询, 发现每个人说的注册流程与要点都不同(这里就不细说了),于是我决定自己去跑一跑这个流程. 我是在天津这边注册的公司, 每 ...
- 注册公司流程(实操)。
秦子帅 明确目标,每天进步一点点..... 前言 自从离职之后,一直有注册公司的打算, 前些日子一直是在网上和实体店中咨询, 发现每个人说的注册流程与要点都不同(这里就不细说了),于是我决定自己去跑一 ...
最新文章
- 太励志!80 后草根创业者自学编程年收入上亿
- adc0808温度换算公式_温湿度传感器的三种模拟量换算关系
- 我的世界之史蒂夫生存记
- ASP.NET中使用Global.asax文件
- mysql 不匹配的_mysql – 如何从两个表中获取不匹配的记录
- WSL2 支持挂载物理磁盘,Windows 可直接访问 ext4
- Java EE 8 MVC:使用bean参数
- 天池 在线编程 条件串(DP)
- 鸟类南飞,去的是哪个“南方”?
- python动态添加类方法_Python 动态添加类方法
- python filter函数_第九篇:Python中lambda、filter和map函数
- CentOS 7.X配置连接网络
- 泛微oa系统服务器怎么填写,泛微协同办公平台Ecology8安装部署手册(105页)-原创力文档...
- 技术交底书(二)-----一种基于移动终端的安全防护系统
- 计算机图形学-二维图形的裁剪
- IDEA修改运行内存
- Windows AD域功能介绍、Windows AD域方案介绍
- 如何搭建用户体验指标体系?
- 【Vue3从零开始-实战】S14:详情页回退事件及路由参数的传递获取数据
- 跨浏览器书签同步(Floccus + WebDav)
热门文章
- 计算机五笔教学软件,指法练习 XP
- 将一个数组中的值按逆序重新存放。例如,原来顺序为8,6,5,4,1。要求改为1,4,5,6,8
- Hint: If you want to see a list of allocated tensors when OOM happens 的解决办法
- rabbitmq port is already allocated
- PAT A1154 Vertex Coloring ——多少楼台烟雨中
- 基于图片的三维重建深度图与原图
- NB-IOT经典案例
- 网站打开速度测试常用的两种工具及操作方法
- tplink 文件服务器,tplink云服务器
- ppt如何替换其他mo ban_相见恨晚的10个PPT制作小技巧!提高你的PPT制作效率