DevOps持续集成-Jenkins(3)
文章目录
- DevOps
- DevOps概述
- Jenkins实战3:实战1和实战2的加强版(新增SonarQube和Harbor)⭐
- 环境准备⭐
- 项目架构图
- 对比Jenkins实战1和实战2,新增内容有哪些?
- SonarQube教程
- 采用Docker安装SonarQube (在Jenkins所在的服务器上安装)⭐
- 访问SonarQube可视化界面⭐
- 首次登陆SonarQube需要修改密码
- 安装SonarQube中文插件 ⭐
- SonarQube的简单使用⭐
- 下载sonar-scanner(并上传到Jenkins所在的服务器上)
- 安装sonar-scanner
- SonarQube案例1:使用sonar-scanner进行代码质量检测⭐
- Jenkins整合SonarQube进行代码质量检测⭐
- 在Jenkins下载SonarQube Scanner插件⭐
- 在Jenkins配置SonarQube(系统配置)⭐
- 在Jenkins配置SonarQube(全局配置)⭐
- 架构图第4步案例:给Jenkins的mytest任务配置SonarQube自动进行代码质量检测(重点⭐)
- Harbor v2.4.2教程
- 下载安装Harbor⭐
- 访问Harbor⭐
- 创建一个新的Harbor项目
- 将本地镜像mytest推送到Harbor仓库中⭐
- 修改daemon.json文件(添加insecure-registries配置⭐)
- 给mytest镜像改名,使其可以push到Harbor镜像仓库中⭐
- 开始推送到Harbor仓库⭐
- 测试拉取Harbor镜像
- Jenkins整合Harbor⭐
- 让Jenkins容器内部可以使用Docker⭐
- 架构图第5步案例:Jenkins制作自定义镜像并上传到Harbor⭐
- 架构图第6-7步案例:通知目标服务器可以从Harbor上拉取镜像,并运行容器⭐
DevOps
DevOps概述
软件开发最初是由两个团队共同组成:(没有采用DevOps之前)
- 开发团队:从头开始设计和整体系统的构建(编写代码)。需要系统不停的迭代更新。
- 运维团队:将开发团队的代码进行测试通过后再部署上线。确保系统稳定运行。
没有采用DevOps的缺点:
- 这看似两个目标不同的团队需要协同完成一个软件的开发。在开发团队指定好计划并完成编写代码后,需要把代码交给运维团队。运维团队向开发团队反馈需要修复的BUG以及一些需要返工的任务。这时开发团队需要经常等待运维团队的反馈。这无疑会延长整个软件开发的周期。
采用DevOps的优点?
- DevOps的方式可以让公司能够更快地应对更新和市场发展变化,开发可以快速交付,部署也更加稳定。核心就在于简化Dev和Ops团队之间的流程,使整体软件开发过程更快速。说白了就是DevOps有利于快速完成项目,不会浪费时间)
整体的软件开发流程:
- PLAN:开发团队根据客户的目标制定开发计划
- CODE:根据PLAN开始编码过程,需要将不同版本的代码存储在一个库中。
- BUILD:编码完成后,需要将代码构建并且运行。
- TEST:成功构建项目后,需要测试代码是否存在BUG或错误。
- DEPLOY:代码经过手动测试和自动化测试后,认定代码已经准备好部署并且交给运维团队。
- OPERATE:运维团队将代码部署到生产环境中。
- MONITOR:项目部署上线后,需要持续的监控产品。
- INTEGRATE:然后将监控阶段收到的反馈发送回PLAN阶段,整体反复的流程就是DevOps的核心,即持续集成、持续部署。
为了保证整体流程可以高效的完成,各个阶段都有比较常见的工具,如下图:
Jenkins实战3:实战1和实战2的加强版(新增SonarQube和Harbor)⭐
环境准备⭐
- 该Jenkins实战3建立在完成Jenkins实战1和Jenkins实战2的内容的基础上!
项目架构图
对比Jenkins实战1和实战2,新增内容有哪些?
- 新增内容有如下:
- 1:Jenkins整合SonarQube实现代码质量检测。
- 2:将Jenkins制作好的镜像推送到Harbor仓库。
SonarQube教程
采用Docker安装SonarQube (在Jenkins所在的服务器上安装)⭐
注意:由于新版的SonarQube不再支持MySQL,而是支持PostgreSQL。那么安装SonarQube时需要先安装PostgreSQL。
- 1:安装Postgres数据库:
docker pull postgres
- 2:安装SonarQube:(版本是8.9.9社区版)
docker pull sonarqube:8.9.9-community
- 3:新建sonarqube目录:
mkdir -p /usr/local/docker/sonarqube_docker
- 4:跳转到sonarqube目录:
cd /usr/local/docker/sonarqube_docker
- 5:编写sonarqube的docker-compose文件:
vi docker-compose.yml
内容如下:
version: "3.1"
services:db:image: postgrescontainer_name: dbports:- 5432:5432networks:- sonarnetenvironment:POSTGRES_USER: sonarPOSTGRES_PASSWORD: sonarsonarqube:image: sonarqube:8.9.9-communitycontainer_name: sonarqubedepends_on:- dbports:- "9000:9000"networks:- sonarnetenvironment:SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonarSONAR_JDBC_USERNAME: sonarSONAR_JDBC_PASSWORD: sonar
networks:sonarnet:driver: bridge
- 6:修改/etc/sysctl.conf文件:
vi /etc/sysctl.conf
在该配置文件中,添加下面的内容:(直接复制下面的内容到配置文件中,保存退出即可!)
vm.max_map_count=262144
- 7:让刚刚修改的配置生效:
[root@centos7-jenkins sonarqube_docker]# sysctl -p
vm.max_map_count = 262144
- 8:执行docker-compose文件:
docker-compose up -d
访问SonarQube可视化界面⭐
-
访问地址:sonarqube的ip+9000端口。
-
SonarQube的账号和密码都是admin !
首次登陆SonarQube需要修改密码
- 我的SonarQube密码修改成admin123456
安装SonarQube中文插件 ⭐
SonarQube的简单使用⭐
下载sonar-scanner(并上传到Jenkins所在的服务器上)
sonar-scanner官网下载地址
- 查看sonar-scanner-cli是否上传成功:
[root@centos7-jenkins ~]# ls
apache-maven-3.8.6-bin.tar.gz jenkins anaconda-ks.cfg jdk-8u333-linux-x64.tar.gz sonar-scanner-cli-4.6.2.2472-linux.zip
安装sonar-scanner
- 1:由于sonar-scanner-cli是zip格式的压缩文件,而Linux下载解压这种格式文件需要安装一个工具:
yum -y install unzip
- 2:使用unzip解压刚刚上传的sonar-scanner包:
- 注意:我们下载的sonar-scanner名字可能会不一样,所以这里需要更改!!
unzip sonar-scanner-cli-4.6.2.2472-linux.zip
- 3:修改sonar-scanner解压出来的文件夹名字:
mv sonar-scanner-4.6.2.2472-linux sonar-scanner
SonarQube案例1:使用sonar-scanner进行代码质量检测⭐
- 1:跳转Jenkins宿主机数据卷目录:
[root@centos7-jenkins ~]# cd /usr/local/docker/jenkins_docker/data
- 2:把解压出来的sonar-scanner目录移动到Jenkins宿主机数据卷目录中:
[root@centos7-jenkins data]# mv /root/sonar-scanner ./
- 3:在Jenkins宿主机数据卷目录下执行下面命令,修改sonar-scanner配置:
[root@centos7-jenkins data]# vi sonar-scanner/conf/sonar-scanner.properties
我们的配置文件内容如下:(记得下面的ip 192.168.184.80要换成你SonarQube的IP。)
#Configure here general information about the environment, such as SonarQube server connection details for example
#No information about specific project should appear here#----- Default SonarQube server
sonar.host.url=http://192.168.184.80:9000#----- Default source code encoding
sonar.sourceEncoding=UTF-8
- 4:查看sonar-scanner工具:(所在位置为Jenkins宿主机数据卷的sonar-scanner文件夹中的bin目录下):
- 跳转到sonar-scanner工具目录下:
[root@centos7-jenkins ~]# cd /usr/local/docker/jenkins_docker/data/sonar-scanner/bin/
可以看到下面的sonar-scanner就是我们需要的代码质量检测工具:
[root@centos7-jenkins bin]# ls
sonar-scanner sonar-scanner-debug
- 5:跳转到我们的Jenkins从gitlab上拉取的mytest项目目录中(该gitlab上的项目也就是我们创建的名为mytest的项目):
- Jenkins的项目目录也就是在/usr/local/docker/jenkins_docker/data/workspace下。
[root@centos7-jenkins ~]# cd /usr/local/docker/jenkins_docker/data/workspace/mytest
- 6:获取SonarQube的Token:
- 可以看到我们生成的token是:fa58b2f8903333918bfa22cf0bc07f3ac0e92435
- 7:查看当前所在目录:
[root@centos7-jenkins mytest]# pwd
/usr/local/docker/jenkins_docker/data/workspace/mytest
- 8:利用sonar-scanner工具对Jenkins拉取的gitlab项目名为“mytest”的项目进行代码质量检测:⭐
- /usr/local/docker/jenkins_docker/data/sonar-scanner/bin/sonar-scanner:上面所说的sonar-scanner工具所在的路径。(如果前面按照我们这样配置,则不需要更改!)
- -Dsonar.source=./ :需要检测的代码所在的目录(由于上面我们已经切换到代码所在目录中,所在只需要指定./即可,如果前面按照我们这样操作,则不需要更改!)
- -Dsonar.projectname=linux-mytest:随便指定一个名称作为sonar-scanner的项目名。
- -Dsonar.login=fa58b2f8903333918bfa22cf0bc07f3ac0e92435:把刚刚复制的token粘贴上去(需要根据自己生成的token进行更改⭐)
- -Dsonar.projectKey=linux-mytest :随便指定一个名称。
- -Dsonar.java.binaries=./target/ :指定我们gitlab上的项目生成的二进制文件(也就是class类文件)所在目录,说白了也就是指定gitlab上的项目的target文件夹路径。
[root@centos7-jenkins mytest]# /usr/local/docker/jenkins_docker/data/sonar-scanner/bin/sonar-scanner -Dsonar.source=./ -Dsonar.projectname=linux-mytest -Dsonar.login=fa58b2f8903333918bfa22cf0bc07f3ac0e92435 -Dsonar.projectKey=linux-mytest -Dsonar.java.binaries=./target/
Jenkins整合SonarQube进行代码质量检测⭐
在Jenkins下载SonarQube Scanner插件⭐
在Jenkins配置SonarQube(系统配置)⭐
在Jenkins配置SonarQube(全局配置)⭐
- 配置提示:
- 1:SONAR_RUNNER_HOME的值:/var/jenkins_home/sonar-scanner
架构图第4步案例:给Jenkins的mytest任务配置SonarQube自动进行代码质量检测(重点⭐)
-
配置提示:
- Execute SonarQube Scanner下面的Analysis properties配置:
sonar.projectname=${JOB_NAME} sonar.projectKey=${JOB_NAME} sonar.source=./ sonar.java.binaries=target
-
1:由于我们刚刚案例执行过了一次,所以要在Jenkins宿主机上先删除一个目录:
[root@centos7-jenkins ~]# rm -rf /usr/local/docker/jenkins_docker/data/workspace/mytest/.scannerwork/
- 2:开始配置:
- 3:测试构建(可以看到我们的SonarQube已经整合到Jenkins中了):
Harbor v2.4.2教程
下载安装Harbor⭐
- 1:先下载好Harbor,然后通过xftp传到服务器上(这里我们还是放在Jenkins所在的服务器上,节约成本):
Harbor v2.4.2下载链接
- 2:查看是否上传成功:(可以看到上传成功了)
[root@centos7-jenkins ~]# ls | grep harbor
harbor-offline-installer-v2.4.2.tgz
- 3:将Harbor解压到/usr/local下:
tar -zxvf harbor-offline-installer-v2.4.2.tgz -C /usr/local
cd /usr/local/harbor/
- 4:将harbor.yaml的模板文件复制一份:
- Harbor启动时只会加载harbor.yml,而不会加载harbor.yml.tmpl
cp harbor.yml.tmpl harbor.yml
- 5:修改harbor.yml:
vim harbor.yml
- 6:执行Harbor的install脚本文件:(在这之前必须要安装了Docker和Docker Compose。)
- 当前所在的路径:
[root@centos7-jenkins harbor]# pwd
/usr/local/harbor
开始执行:(然后会加载一大堆的东西,需要等一下)
[root@centos7-jenkins harbor]# ./install.sh
访问Harbor⭐
- 访问链接:
- harbor的ip地址:80端口
创建一个新的Harbor项目
将本地镜像mytest推送到Harbor仓库中⭐
- 如何将本地镜像推送到Harbor仓库中,最重要的一点就是要将镜像进行改名,格式如下:(只有这样格式的镜像才能够被push到Harbor仓库)
- 格式为:Harbor地址/Harbor项目名/镜像名:版本
修改daemon.json文件(添加insecure-registries配置⭐)
- 1:进入编辑器:
vi /etc/docker/daemon.json
内容如下:
- 只添加insecure-registries配置,对应的值为你当前的Harbor地址!!
{"registry-mirrors": ["https://u01jo9qv.mirror.aliyuncs.com","https://hub-mirror.c.163.com","https://mirror.baidubce.com"],"insecure-registries": ["192.168.184.80:80"]
}
- 2:重启Docker服务:
systemctl restart docker
给mytest镜像改名,使其可以push到Harbor镜像仓库中⭐
- 1:改名之前,先查看一下mytest镜像:
[root@centos7-jenkins harbor]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mytest v1.0.0 fc62ecfe296d 10 hours ago 661MB
- 2:给mytest镜像进行改名:(注意:下面的镜像的IP地址一定要改成你当前Harbor的地址)
- mytest:v1.0.0:旧镜像名称
- 192.168.184.80:80/repo/mytest:v1.0.0:新镜像名称
docker tag mytest:v1.0.0 192.168.184.80:80/repo/mytest:v1.0.0
- 3:再次查看mytest镜像:(可以看到旧镜像和新镜像的IMAGE ID都是一样的,可以说明这两个其实就是同一个镜像。只是名字不同罢了)
[root@centos7-jenkins harbor]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mytest v1.0.0 fc62ecfe296d 11 hours ago 661MB
192.168.184.80:80/repo/mytest v1.0.0 fc62ecfe296d 11 hours ago 661MB
开始推送到Harbor仓库⭐
- 1:首先Docker要先登录Harbor仓库:(docker login):
- 格式为:docker login -u 用户名 -p 密码 Harbor地址
- 注意:我们Harbor默认的账号是admin,密码是Harbor12345,所以我们可以用这个账号密码去登录
- 还有下面的Harbor地址别忘了改成你自己的Harbor地址。
docker login -u admin -p Harbor12345 192.168.184.80:80
- 2:开始push:
[root@centos7-jenkins harbor]# docker push 192.168.184.80:80/repo/mytest:v1.0.0
The push refers to repository [192.168.184.80:80/repo/mytest]
5f70bf18a086: Pushed
34589845b783: Pushed
35c20f26d188: Pushed
c3fe59dd9556: Pushed
6ed1a81ba5b6: Pushed
a3483ce177ce: Pushed
ce6c8756685b: Pushed
30339f20ced0: Pushed
0eb22bfb707d: Pushed
a2ae92ffcd29: Pushed
v1.0.0: digest: sha256:b9504aee3cc90755bb237d9f91795b75f816558330657ffae4fd3ff92fdaee7d size: 2418
- 3:查看是否成功Push到Harbor仓库:
测试拉取Harbor镜像
- 1:先删除原来的mytest镜像:
[root@centos7-jenkins harbor]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.184.80:80/repo/mytest v1.0.0 fc62ecfe296d 25 hours ago 661MB
mytest v1.0.0 fc62ecfe296d 25 hours ago 661MB
[root@centos7-jenkins harbor]# docker rmi -f fc62ecfe296d
Untagged: 192.168.184.80:80/repo/mytest:v1.0.0
Untagged: 192.168.184.80:80/repo/mytest@sha256:b9504aee3cc90755bb237d9f91795b75f816558330657ffae4fd3ff92fdaee7d
Untagged: mytest:v1.0.0
Deleted: sha256:fc62ecfe296d996c03ac5ef9a0c073f5772aacf382e7f8215d18052d18707982
- 2:拉取刚刚上传到Harbor仓库的mytest镜像:(注意:这个Harbor镜像被我们设置为公开类型,如果不是公开类型,则不能这样拉取!)
- 80端口别忘了写。
[root@centos7-jenkins harbor]# docker pull 192.168.184.80:80/repo/mytest:v1.0.0
v1.0.0: Pulling from repo/mytest
7448db3b31eb: Already exists
c36604fa7939: Already exists
29e8ef0e3340: Already exists
a0c934d2565d: Already exists
a360a17c9cab: Already exists
cfcc996af805: Already exists
2cf014724202: Already exists
4bc402a00dfe: Already exists
bce9a3522658: Already exists
4f4fb700ef54: Already exists
Digest: sha256:b9504aee3cc90755bb237d9f91795b75f816558330657ffae4fd3ff92fdaee7d
Status: Downloaded newer image for 192.168.184.80:80/repo/mytest:v1.0.0
192.168.184.80:80/repo/mytest:v1.0.0
Jenkins整合Harbor⭐
让Jenkins容器内部可以使用Docker⭐
默认情况下,Jenkins容器内部是使用不了Docker的,我们这次就是为了解决这种情况。
解决方法有两个:(我们使用的是第二种)
第一种:在Jenkins容器内部安装一个Docker。(缺点是会占用很多的资源,浪费容器空间,不推荐使用)。
第二种:Jenkins容器内部使用宿主机的Docker,也就是说Jenkins容器和宿主机共同使用同一个Docker。(推荐!)
- 1:切换目录到/var/run/:
[root@centos7-jenkins harbor]# cd /var/run/
- 2:修改docker.sock文件的所属组:
[root@centos7-jenkins run]# chown root:root docker.sock
- 3:修改docker.sock文件的权限:
[root@centos7-jenkins run]# chmod o+rw docker.sock
- 4:切换到Jenkins的docker-compose.yml文件的所在目录上:
[root@centos7-jenkins ~]# cd /root/jenkins/
- 5:如果启动了Jenkins的docker-compose文件,则执行下面的down命令:
[root@centos7-jenkins jenkins]# docker-compose down
- 6:删除这个docker-compose文件:
[root@centos7-jenkins jenkins]# rm -rf docker-compose.yml
- 7:重新编辑Jenkins的docker-compose.yml文件:(其实就是在原来的Jenkins的docker-compose文件多添加了一些volume罢了,所以干脆删除了重新编辑。)
[root@centos7-jenkins jenkins]# vi docker-compose.yml
新文件内容如下:
version: "3.1"
services:jenkins:image: jenkins/jenkins:2.359container_name: jenkinsports:- 9200:8080- 50000:50000volumes:- /usr/local/docker/jenkins_docker/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
- 8:启动Jenkins的docker-compose:
docker-compose up -d
- 9:进入Jenkins容器内部,测试现在是否可以使用Docker:(现在我们的Jenkins容器就可以使用Docker了)
[root@centos7-jenkins jenkins]# docker exec -it jenkins bash
[root@centos7-jenkins jenkins容器]# docker version
架构图第5步案例:Jenkins制作自定义镜像并上传到Harbor⭐
- 1:修改我们的springboot项目:
-
2:配置Jenkins:
- 提示,Execute shell的内容:
- 修改点1:下面的IP地址要改成你的Harbor的IP地址。
- 修改点2:harbor账号密码要是和我的不一样则也需要更改。
mv target/*.jar docker/ docker build -t mytest:$tag docker/ docker login -u admin -p Harbor12345 192.168.184.80:80 docker tag mytest:$tag 192.168.184.80:80/repo/mytest:$tag docker push 192.168.184.80:80/repo/mytest:$tag
- 提示,Execute shell的内容:
架构图第6-7步案例:通知目标服务器可以从Harbor上拉取镜像,并运行容器⭐
- 1:在所有目标服务器上都放一份shell脚本文件:(原理是:Jenkins通知目标服务器去执行shell脚本文件,从而让目标服务器在Harbor上面拉取指定镜像。)
- 原来的架构图上是把Dockerfile传到目标服务器,让目标服务器通过docker build构建镜像(缺点是当目标服务器有多台,那每一台目标服务器都需要build构建一次,n台服务器就是n次,这样十分浪费服务器资源)。
- 现在的架构图是把镜像在Jenkins容器内构建,然后把镜像push到Harbor上,Jenkins通知所有目标服务器(不管有多少台),然后目标服务器就会执行下面的shell脚本,会从Harbor拉取指定镜像,这样一来,不管有多少台目标服务器都只是build构建一次,节省了很多资源。
vi /root/deploy.sh
内容如下:
harbor_addr=$1
harbor_repo=$2
project=$3
version=$4
host_port=$5
container_port=$6imageName=$harbor_addr/$harbor_repo/$project:$versioncontainerId=`docker ps -a | grep ${project} | awk '{print $1}'`
if [ "$containerId" != "" ] ; thendocker stop $containerIddocker rm $containerId
fitag=`docker images | grep ${project} | awk '{print $2}'`if [[ "$tag" =~ "$version" ]] ; thendocker rmi -f $imageName
fidocker login -u admin -p Harbor12345 $harbor_addrdocker pull $imageNamedocker run -d -p $host_port:$container_port --name $project $imageNameecho "SUCCESS"
- 2:给deploy.sh权限:
chmod a+x /root/deploy.sh
- 3:测试运行deploy.sh:(要更改对应的值)
- shell脚本参数传值解释:
- 配置文件的$1为:192.168.184.80:80 (harbor_addr。harbor的地址)
- 配置文件的$2为:repo(harbor_repo。harbor的项目名)
- 配置文件的$3为:mytest(project。拉取的镜像名)
- 配置文件的$4为:v3.0.0(version。拉取的镜像版本)
- 配置文件的$5为:8082(host_port。宿主机端口)
- 配置文件的$6为:8082(container_port。容器的端口)
- shell脚本参数传值解释:
cd /root
[root@centos7-jenkins ~]# ./deploy.sh 192.168.184.80:80 repo mytest v3.0.0 8082 8082
3fd32cbb9557
3fd32cbb9557
Untagged: 192.168.184.80:80/repo/mytest:v3.0.0
Untagged: 192.168.184.80:80/repo/mytest@sha256:bd9556efbf06af2fba04b482e318111266a725cc2b10edf215e1190874df06b3
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded
v3.0.0: Pulling from repo/mytest
Digest: sha256:bd9556efbf06af2fba04b482e318111266a725cc2b10edf215e1190874df06b3
Status: Downloaded newer image for 192.168.184.80:80/repo/mytest:v3.0.0
192.168.184.80:80/repo/mytest:v3.0.0
2f73780159ee473a62e0d9e43874c8abcc7e173ac23ee0adfe162c442187e0f4
SUCCESS
- 4:查看项目镜像容器是否启动:
[root@centos7-jenkins ~]# docker ps | grep mytest
3fd32cbb9557 192.168.184.80:80/repo/mytest:v3.0.0 "/bin/sh -c 'java -j…" 38 seconds ago Up 37 seconds 0.0.0.0:8082->8082/tcp, :::8082->8082/tcp mytest
- 5:测试访问项目:
- 6:把所有目标服务器的deploy.sh都放到/usr/bin下:
[root@centos7-jenkins ~]# mv /root/deploy.sh /usr/bin/
- 7:配置两个端口的字符串参数(宿主机端口和容器端口):
-
8:配置Jenkins构建后操作:
-
提示:
- Exec command的内容:
deploy.sh 192.168.184.80:80 repo ${JOB_NAME} $tag $host_port $container_port
-
- 9:测试构建:
相关文章:

DevOps持续集成-Jenkins(3)
文章目录 DevOpsDevOps概述Jenkins实战3:实战1和实战2的加强版(新增SonarQube和Harbor)⭐环境准备⭐项目架构图对比Jenkins实战1和实战2,新增内容有哪些?SonarQube教程采用Docker安装SonarQube (在Jenkins所…...

TypeScript之索引签名
1. 索引签名 在 TypeScript 中,索引签名是一种定义对象类型的方式,它允许我们使用字符串或数字作为索引来访问对象的属性。 索引签名最主要的作用就是允许我们动态地添加或访问对象的属性,通过使用索引签名,我们可以在编译时无法…...

k8s-----24、亲和力Affinity
1、应用场景 pod和节点间的关系: 某些Pod优先选择有ssdtrue标签的节点,如果没有在考虑部署到其它节点;某些Pod需要部署在ssdtrue和typephysical的节点上,但是优先部署在ssdtrue的节点上; pod和pod间的关系: 同一个应用的Pod不…...

860. 柠檬水找零
在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。 每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,…...

Flink将数据写入MySQL(JDBC)
一、写在前面 在实际的生产环境中,我们经常会把Flink处理的数据写入MySQL、Doris等数据库中,下面以MySQL为例,使用JDBC的方式将Flink的数据实时数据写入MySQL。 二、代码示例 2.1 版本说明 <flink.version>1.14.6</flink.version…...

react-typescript-demo
1.使用 Context 来存储数据...

Alexon:在云原生环境中快速部署应用服务
Alexon是一个旨在快速部署WEB应用服务到分布式系统中的工具,适用于云原生环境。 Alexon由SymeCloud Limited(syme.dev) 发布,使用GNU Guile编写而成,支持函数编程概念。 SymeCloud 公司主要致力于 AI-Infra 方面的研发,从 OpenAI …...

5G技术在职业教育领域的应用:产生巨变的技术
5G技术在职业教育领域的应用:产生巨变的技术 职业教育领域正面临着前所未有的挑战和机遇。随着5G技术的快速发展和普及,其高速度、低延迟、大容量和连接数的特性给职业教育带来了革命性的改变。本文将深入探讨5G技术在职业教育领域的应用场景、技术原理和…...

【触想智能】工控一体机与5G物联网技术结合是未来发展趋势
工控一体机也叫工业电脑一体机,是工业应用非常重要的一种产品。目前,工控一体机在工业领域的应用已经非常普及,在繁忙的生产车间、数字化机床、自助服务终端设备等场景中,我们都有看到它的身影。 工控一体机应用的普及已经潜移默化…...

LuatOS-SOC接口文档(air780E)--lvgl - LVGL图像库
lvgl.draw_mask_radius_param_t() 创建一个lv_draw_mask_radius_param_t 参数 无 返回值 返回值类型 解释 userdata lv_draw_mask_radius_param_t指针 例子 local radius lvgl.draw_mask_radius_param_t()lvgl.draw_mask_radius_param_t_free(radius) 释放一个lv_d…...

LuatOS-SOC接口文档(air780E)--lora2 - lora2驱动模块(支持多挂)
常量 常量 类型 解释 lora2.SLEEP number SLEEP模式 lora2.STANDBY number STANDBY模式 lora2.init(ic, loraconfig,spiconfig) lora初始化 参数 传入值类型 解释 string lora 型号,当前支持: llcc68 sx1268 table lora配置参数,与具体…...

WKWebView iOS17设置UserAgent
WKWebView 设置 user-agent 参考文档 之前设置 user-agent 都是通过设置NSUserDefaults来实现的,不过升级到了iOS17之后这个方式不好用了。 老的设置方式: [[NSUserDefaults standardUserDefaults] registerDefaults:dictionnary];目前看通过设置 we…...

持续集成部署-k8s-服务发现-Service
持续集成部署-k8s-服务发现-Service:配置讲解及基础命令 1. Service 简介2. 基础命令3. 基于 Service 访问外部服务4. 代理外部域名5. Endpoints 常用类型1. Service 简介 在K8s中,Service 是一种可以暴露一个或多个Pod的稳定的网络终点,从而形成逻辑上的应用服务单元,为服…...

RocksDB基本架构与原理详解
Rocksdb Flink提供基于流的有状态计算,除了提供实时数据流的处理能力,还需要将计算产生的状态存储起来。 为了满足状态存取需求,提供了memory、flie system、rocksdb三种类型的状态存储机制。 memory存取高效单空间有限,且可用…...

ArcGIS笔记12_ArcGIS搜索工具没法用?ArcGIS运行很慢很卡?
本文目录 前言Step 1 ArcGIS搜索工具没法用Step 2 ArcGIS运行很慢很卡 前言 这是笔者最近遇到的两个小问题,新换了台式机,安装上ArcGIS后发现搜索工具没法用,而且感觉还不如原来笔记本运行的流畅,加载图层很慢,编辑要…...

【VictoriaMetrics】单机版配置
为方便查看,释义都已翻译成中文,本文配置基于VictoriaMetrics 1.87.1版本 bigMergeConcurrencyint用于大合并的最大 CPU 核数。设置为 0 时使用默认值cacheExpireDuration30m0s...

【C语言】strcpy()函数
🦄个人主页:修修修也 🎏所属专栏:C语言 ⚙️操作环境:Visual Studio 2022 目录 一.strcpy()函数简介 1.函数功能 2.函数参数 1>.char * destination 2>.const char * source 3.函数返回值 4.函数头文件 二.strcpy()函数的具体使用 1.使用s…...

C++基础算法⑦——信奥一本通递归算法(放苹果、求最大公约数问题、2的幂次方表示、分数求和、因子分解、判断元素是否存在)
递归算法 1206:放苹果1207:求最大公约数问题1208:2的幂次方表示1209:分数求和1210:因子分解1211:判断元素是否存在 1206:放苹果 这道题还是有些难度的,我们要考虑几种放苹果的情况。…...

uni-app医院智能导诊系统源码
随着科技的迅速发展,人工智能已经逐渐渗透到我们生活的各个领域。在医疗行业中,智能导诊系统成为了一个备受关注的应用。本文将详细介绍智能导诊系统的概念、技术原理以及在医疗领域中的应用,分析其优势和未来发展趋势。 智能导诊系统通过人工…...

启动jar时指定nacos配置
背景 由于需要在不同服务上部署应用,避免频繁打包,需要在jar启动时灵活配置naocs配置 启动命令 java -Xms256m -Xmx512m -Dfile.encodingutf-8 -jar mes-gateway-1.0.1.jar --spring.cloud.nacos.discovery.server-addrhttp://127.0.0.1:8848 --spri…...

linux安装vscode vscode使用 创建项目并运行
下载 https://code.visualstudio.com/ 下载.deb文件 安装 假如文件被下载到了 /opt目录下 进入Opt目录,右键从当前目录打开终端。 输入下面的安装命令。 sudo apt-get install ./code_1.83.1-1696982868_amd64.deb 安装成功。 安装插件 使用c,必…...

如何解决数据倾斜
星光下的赶路人star的个人主页 臣书刷字墨淋漓,舒卷烟云势最奇 文章目录 1、数据倾斜的现象2、解决办法2.1 单表聚合(group bysum())2.2 多表关联(join) 3、倾斜原因 1、数据倾斜的现象 部分Reduce一直运行࿰…...

宏定义实现offsetof
在C语言中,有这样一个特殊的宏,叫offsetof,它的功能是啥呢? 我们来看看它的介绍 它的功能是:返回一个结构体的成员的大小(相较于起始地址的偏移量) 引用代码:http://t.csdnimg.cn…...

YOLOv5— Fruit Detection
🍨 本文为[🔗365天深度学习训练营学习记录博客 🍦 参考文章:365天深度学习训练营-第7周:咖啡豆识别(训练营内部成员可读) 🍖 原作者:[K同学啊 | 接辅导、项目定制](https…...

(PyTorch)PyTorch中的常见运算(*、@、Mul、Matmul)
1. 矩阵与标量 矩阵(张量)每一个元素与标量进行操作。 import torch a torch.tensor([1,2]) print(a1) >>> tensor([2, 3]) 2. 哈达玛积(Mul) 两个相同尺寸的张量相乘,然后对应元素的相乘就是这个哈达玛…...

cmd 命令关闭占用端口
工作中还是偶尔会遇到端口号被占用的情况,之前也有写过另一种关闭方式,但是发现没有命令方便,所以记录一下。 1、 查看 8081 端口占用的 pid 。 命令:netstat -ano |findstr 8081 由上图可知,占用 8081 端口的进程 id…...

PG14启动报错“max_stack_depth“ must not exceed 7680kB
问题描述 PG14编译安装后启动报错"max_stack_depth" must not exceed 7680kB [roottop132:/pgdb/data]$ systemctl start postgres Job for postgres.service failed because the control process exited with error code. See "systemctl status postgres.se…...

BES2700 蓝牙协议之RFCOMM通道使用方法
是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务 BES2700 RFCOMM通道使用方法 RFCOMM_CHANNEL_NUM 枚举定义了一系列的通道号码,并为每个通道号码指定了一个具体的名称。以下是其中一些通道的中文含义: RFCOMM_CHAN…...

简单介绍一下迁移学习
迁移学习是一种机器学习技术,旨在利用从一个任务或领域学习到的知识来改善另一个任务或领域的学习性能。在传统的机器学习方法中,通常假设训练数据和测试数据是从相同的分布中独立同分布采样的。然而,在现实世界中,这个假设并不总…...

PHP 同城服务共享茶室小程序系统是如何实现的?
随着互联网的快速发展和共享经济的兴起,同城服务共享茶室作为一种新型的商业模式,越来越受到人们的关注。通过开发一款基于PHP的同城服务共享茶室小程序系统,可以提供更加便捷、高效、个性化的服务体验。本文将详细介绍PHP同城服务共享茶室小…...