当前位置: 首页 > news >正文

Jenkins 构建流水线

在 Linux 系统上安装 Jenkins 服务,以及配置自动化构建项目

前置准备环境:docker、docker-compose、jdk、maven

一、环境搭建

1. Jenkins 安装

(1)拉取镜像

# 安装镜像包,默认安装最新版本
docker pull jenkins/jenkins
# 查看是否安装成功
docker images

(2)启动并创建 Jenkins 容器

Jenkins工作空间目录:每新建一个项目都会在该目录下创建对应文件夹,拉取的代码等文件均在该路径下。
若是需要推送文件到目标服务器,默认从该项目文件夹下加载。例如:

  • 工作空间目录为:/var/jenkins_home/workspace
  • 项目名称为:demo

那么推送文件时所在路径为:/var/jenkins_home/workspace/demo,只需在脚本中维护后续路径即可

启动容器
docker run -u root -d \
-p 8080:8080 -p 50000:50000 \
-v /var/jenkins_home/workspace/:/var/jenkins_home/workspace \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
-v /usr/local/java:/usr/local/java \
-v /usr/local/maven/apache-maven-3.9.9:/usr/local/maven \
-e JAVA_OPTS="-Dorg.apache.commons.jelly.tags.fmt.timeZone='Asia/Shanghai" \
--restart=unless-stopped \
--name jenkins-server jenkins/jenkins:2.426.2-lts
启动命令解释
docker run -u root -d \
-p 80:8080 -p 81:50000 \                    				      # 镜像8080端口映射到宿主机80端口
-v /var/jenkins_home/workspace/:/var/jenkins_home/workspace \     # 挂载 jenkins 工作空间目录
-v /var/run/docker.sock:/var/run/docker.sock \                    # 挂载 docker
-v /usr/bin/docker:/usr/bin/docker \                              # 挂载 docker
-v /usr/local/java:/usr/local/java \                              # 挂载 jdk
-v /usr/local/maven/apache-maven-3.9.9:/usr/local/maven \         # 挂载 maven
-e JAVA_OPTS="-Dorg.apache.commons.jelly.tags.fmt.timeZone='Asia/Shanghai" \  # 同步时间
--restart=unless-stopped \                                                    # 重启策略
--name jenkins-server jenkins/jenkins:2.426.2-lts                              # jenkins-serve(自定义容器名称)  jenkins/jenkins:2.426.2-lts(镜像名称及版本)
安装并创建用户

浏览器打开 http://127.0.0.1:8080,输入超级管理密码进行登录

# 进入容器,查看管理员密码
docker exec -it jenkins-server bash
cat /var/jenkins_home/secrets/initialAdminPassword

在这里插入图片描述

  1. 选择安装推荐的插件,安装完成后创建管理员用户
    在这里插入图片描述

在这里插入图片描述

2. Harbor 镜像仓库安装

(1)下载在线安装包

mkdir -p /root/software/harbor
cd /home/software/harbor
wget https://all-share-public.oss-cn-shanghai.aliyuncs.com/install-harbor/harbor-online-installer-v2.10.1.tgz
tar -zxvf harbor-online-installer-v2.10.1.tgz
cd harbor

(2)配置 harbor.yml 文件

cp harbor.yml.tmpl harbor.yml

编辑 harbor.yml,并在对应位置写入以下内容

hostname: 192.168.1.1 # 设置为指定部署机器IP
......
http:
port: 8081 # 从80修改为指定端口(可选)
https: # 注释掉 https 相关(无证书必须注释掉)
......
harbor_admin_password: Harbor12345 # admin用户指定密码 (可选)
......
data_volume: /root/software/harbor/data # 数据存储目录(可选)
......
log:
......
local:
......
location: /root/software/harbor/logs # 日志目录(可选)

(3)编译安装

./prepare
./install.sh

浏览器打开 http://192.168.1.1:8081(admin/Harbor12345),新建镜像仓库

(4)修改 docker 配置

配置 docker 镜像源,添加 Harbor 镜像仓库地址,需重启 docker 生效

vim /etc/docker/daemon.json
{
......
"insecure-registries":["192.168.1.1:8081"]
.....
}

重启 docker

systemctl daemon-reload
systemctl restart docker

(5)设置开机自启动

vim /usr/lib/systemd/system/harbor.service
[Unit]
Description=Harbor service with docker-compose
Requires=docker.service
After=docker.service
[Service]
Restart=always
#Type=oneshot
RemainAfterExit=yes
StandardError=null
StandardOutput=null
# Harbor实际安装路径
WorkingDirectory=/home/software/harbor/harbor
# Remove old containers
ExecStartPre=/usr/local/bin/docker-compose -f /home/software/harbor/harbor/dockercompose.yml down -v
# Compose up
ExecStart=/usr/local/bin/docker-compose -f /home/software/harbor/harbor/dockercompose.yml up -d
# Compose down, remove containers
ExecStop=/usr/local/bin/docker-compose -f /home/software/harbor/harbor/dockercompose.yml down -v
[Install]
WantedBy=multi-user.target

设置自启动

systemctl daemon-reload
systemctl enable harbor

3. Sonarqube 代码检测工具安装

(1)下载在线安装包

mkdir -p /home/software/sonarqube
cd /home/software/sonarqube
wget https://all-share-public.oss-cn-shanghai.aliyuncs.com/install-sonarqube/sonarqube.tar
tar -zxvf sonarqube.tar
cd sonarqube

若是需要修改端口、挂载文件路径,编辑当前目录下 docker-compose.yml 文件即可

# 执行安装程序
./install.sh

(2)创建 Token 令牌

浏览器打开 http://192.168.1.1:8021,账号:admin/admin

创建 Token 令牌:生成的 Token 值要记录下来,配置 Jenkins 流水线时需要使用
在这里插入图片描述

二、Jenkins配置

1. 插件安装

需要安装以下插件:
Publish Over SSH:用于Jenkins 发送文件到远程服务器
Maven Integration:Maven 插件,打包项目
GitLab:Gitlab 插件,拉取代码
DingTalk:钉钉插件,用于推送项目构建状态等通知

系统管理 -> 插件管理,安装完成后重启 Jenkins
在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

2. 配置 JDK 和 Maven

点击:系统管理 -> 全局工具配置

在这里插入图片描述


在这里插入图片描述

3. 配置 SSH 连接

点击:系统管理 -> 系统配置 -> 找到SSH
在这里插入图片描述

4. 配置全局凭据

点击:系统管理 -> 凭据管理 -> System/全局 -> Add Credentials
根据合适的认证方式创建凭据(示例为用户名&密码)
在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

5. 配置钉钉通知

此配置为构建项目时钉钉推送通知,若是不需要可忽略

(1)生成钉钉 webhook 地址和密钥

打开钉钉 选择要推送的群 -> 群设置 -> 机器人 -> 添加机器人 -> 自定义 -> 添加 打开如下页面
在这里插入图片描述


在这里插入图片描述

(2)Jenkins中配置钉钉信息

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

三、Jenkins 构建项目

Jenkins中构建项目的类型有很多,实际上每种类型的构建都可以完成一样的构建过程与结果,只是在操作方式、灵活度等方面有所区别,在实际开发中可以根据自己的需求和习惯来选择。从灵活度上来说,流水线类型是最高的。常用的有以下三种:

  • 自由风格软件项目(FreeStyle Project)(推荐)
  • 流水线项目(Pipeline Project)(推荐)
  • Maven项目(Maven Project)

1. 新建任务(选择流水线)

在这里插入图片描述

2. 配置构建参数

用于在构建项目时动态维护的参数(例如 构建的代码分支、构建环境等)
在这里插入图片描述

3. 构建流水线(Pipeline)【重点】

Jenkins Pipeline Doc

tools :工具定义。可定义在脚本中使用的工具等;需在 系统管理 -> 全局配置管理 中维护,此处填写对应的 maven 和 jdk 名称即可
environment:变量定义。可将代码仓库地址,项目部署路径等信息在该模块下定义,方便维护
stages:Pipeline 各阶段定义。是必须出现的指令,包含一个或多个 stage,Pipeline 的大部分工作在此执行。可以在此处进行项目代码拉取、打包、推送仓库、部署等一系列操作
post:post 是在 Pipeline 或者 stages 执行结束后的操作,不是必须出现的指令。例如发送项目构建成功、失败等通知

在这里插入图片描述

以下为示例 Pipeline 脚本,可根据实际情况进行修改。

pipeline {agent anytools {// 需在 系统管理 -> 全局配置管理 中维护,此处填写对应的 maven 和 jdk 名称即可maven "maven3.9.9"jdk "java17"}environment {// 项目名称 projectName = "ruoyi-cloud-plus"// projectCodeParentPath = "./ruoyi-cloud-plus"    			 // 项目父模块代码路径// projectCodeSubPath = "./ruoyi-cloud-plus/admin-server"    // 项目子模块代码路径(如果没有子模块,则删除此变量,下面引用此变量的地方均修改为 $projectCodeParentPath) // 项目部署服务器路径serverPath = "/home/project/ruoyi-cloud-plus" // git仓库的url地址gitUrl = 'http://192.168.1.1/gitlab/demo/ruoyi-cloud-plus.git'// git仓库的认证凭据ID, 可前往 系统管理-> 凭据管理 查看gitCredentialsId = "git-demo"// sonarqube 的 url 地址sonarquebUrl = "http://192.168.1.1:8021"// sonarqube 的 token 令牌                             sonarquebToken = "sqa_05fxxxxxxxxxxxx227b1"// harbor 镜像仓库的用户名harborUser = "admin"// harbor镜像仓库的用户密码harborPasswrod="Harbor12345"// harbor仓库的url地址harborUrl = "192.168.1.1:8081"// harbor仓库项目名称harborRepo = "demo-library"// 钉钉机器人IDdingTalk = "Jenkins-DingTalk"}stages {stage('=========【拉取代码】=========') {steps{git branch: params.branchName, credentialsId: env.gitCredentialsId, url: env.gitUrl}}stage('=========【编译打包】=========') {steps {sh """mvn clean package -Dmaven.test.skip=true -P ${params.active}"""}}// stage('=========【sonarqueb代码质量检测】=========') {            //     steps {//         sh """                     //             /var/jenkins_home/sonar-scanner/bin/sonar-scanner \\//             -Dsonar.projectKey=${env.projectName}-${params.branchName} \\                //             -Dsonar.projectName=${env.projectName}-${params.branchName} \\          //             -Dsonar.sourceEncoding=UTF-8 \\//             -Dsonar.sources=${env.projectCodeParentPath} \\//             -Dsonar.java.binaries=${env.projectCodeSubPath}/target/ \\//             -Dsonar.host.url=${env.sonarquebUrl} \\//             -Dsonar.login=${env.sonarquebToken}//         """//     }// }stage('=========【构建镜像到Harbor仓库】=========') {steps {sh """echo "-------- 1. 构建镜像 ------------"docker build -t ruoyi-nacos:${params.imageTag} -f ruoyi-nacos/Dockerfile .docker build -t ruoyi-auth:${params.imageTag} -f ruoyi-auth/Dockerfile .docker build -t ruoyi-gateway:${params.imageTag} -f ruoyi-gateway/Dockerfile .docker build -t ruoyi-system:${params.imageTag} -f ruoyi-modules/ruoyi-system/Dockerfile .echo "-------- 2. 镜像打标签 ------------"docker login -u ${harborUser} -p ${harborPasswrod} ${harborUrl}docker tag ruoyi-nacos:${params.imageTag} ${harborUrl}/${harborRepo}/ruoyi-nacos:${params.imageTag}docker tag ruoyi-auth:${params.imageTag} ${harborUrl}/${harborRepo}/ruoyi-auth:${params.imageTag}docker tag ruoyi-gateway:${params.imageTag} ${harborUrl}/${harborRepo}/ruoyi-gateway:${params.imageTag}docker tag ruoyi-system:${params.imageTag} ${harborUrl}/${harborRepo}/ruoyi-system:${params.imageTag}echo "-------- 3. 推送镜像至Harbor ------------"docker push ${harborUrl}/${harborRepo}/ruoyi-nacos:${params.imageTag}docker push ${harborUrl}/${harborRepo}/ruoyi-auth:${params.imageTag}docker push ${harborUrl}/${harborRepo}/ruoyi-gateway:${params.imageTag}docker push ${harborUrl}/${harborRepo}/ruoyi-system:${params.imageTag}echo "-------- 4. 删除未被任何容器使用的镜像 ------------"// docker image prune -f"""}}stage('=========【拉取镜像并运行】=========') {        steps {   sshPublisher(publishers: [sshPublisherDesc(configName: 'service-160', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: """#!/bin/bashcd ${env.serverPath} ./deploy.sh ${env.harborUrl} ${env.harborUser} ${env.harborPasswrod} ${env.harborRepo} ${params.imageTag}""", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: """${env.servePath}""", remoteDirectorySDF: false, removePrefix: 'docker', sourceFiles: 'docker/docker-compose.yml')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true)])}}}// 若是不需要配置钉钉推送,则不需要下面的配置   post {        success {  dingtalk (                robot: '${dingTalk}',                type:'MARKDOWN',title: "${projectName}项目构建成功",                text: [                  "### ${projectName}项目构建成功",                 "---","- 环境: ${params.active}", "- 分支: ${params.branchName}",              "- 持续时间: ${currentBuild.durationString}",              "- 执行人:${currentBuild.buildCauses.shortDescription}"             ])   }failure {            dingtalk (                robot: '${dingTalk}',                type:'MARKDOWN',                title: "${projectName}项目构建失败",                text: [                  "### ${projectName}项目构建失败",                 "---","- 环境: ${params.active}", "- 分支: ${params.branchName}",              "- 持续时间: ${currentBuild.durationString}",              "- 执行人:${currentBuild.buildCauses.shortDescription}"             ])   } unstable {            dingtalk (                robot: '${dingTalk}',                type:'MARKDOWN',                title: "${projectName}项目构建异常",                text: [                  "### ${projectName}项目构建异常",                 "---",  "- 环境: ${params.active}", "- 分支: ${params.branchName}",              "- 持续时间: ${currentBuild.durationString}",              "- 执行人:${currentBuild.buildCauses.shortDescription}"             ])   } }  
}

4. 部署项目服务器上预置脚本

该步骤可忽略,需同时修改流水线脚本中【拉取镜像并运行】stage 对该脚本的引用

在需要部署应用的服务器中,然后在 environment 中 serverPath 路径下编写 deploy.sh(记得赋予执行权限)

下面是提供的 deploy.sh 示例模版(需根据自身项目修改)

#!/bin/bash
# 接收启动时的传参
harborUrl=$1
harborUser=$2
harborPasswrod=$3
harborRepo=$4
imageTag=$5# 拼接完整镜像地址变量,在docker-compose文件中可引用
nacos_image=$(echo "nacos_image=\"$harborUrl/$harborRepo/ruoyi-nacos:$imageTag\"")
auth_image=$(echo "auth_image=\"$harborUrl/$harborRepo/ruoyi-auth:$imageTag\"")
gateway_image=$(echo "gateway_image=\"$harborUrl/$harborRepo/ruoyi-gateway:$imageTag\"")
system_image=$(echo "system_image=\"$harborUrl/$harborRepo/ruoyi-system:$imageTag\"")# 新建 docker-compose 环境变量文件, 并写入镜像地址
envFile=".env"
rm -f "$envFile"echo "$nacos_image" >> "$envFile"
echo "$auth_image" >> "$envFile"
echo "$gateway_image" >> "$envFile"
echo "$system_image" >> "$envFile"# 登录 Harbor 仓库
docker login -u ${harborUser} -p ${harborPasswrod} ${harborUrl}# 停止并删除服务
docker-compose down# 启动 nginx
docker-compose up -d nginx-web# 启动 nacos            
docker-compose up -d nacos# 启动 ruoyi-gateway ruoyi-auth ruoyi-system
docker-compose up -d ruoyi-gateway ruoyi-auth ruoyi-system# 删除未被任何容器使用的镜像
docker image prune -f

至此配置完成,进行构建验证

四、Jenkins Pipeline语法

1. stages

Pipeline 阶段定义,是必须出现的指令,每个 Pipeline 包含一个或多个 stage,Pipeline 的大部分工作在此执行。可以在此处进行 项目代码拉取、打包、推送仓库、部署等一系列操作。其中 steps 块中可以包含script 块。

pipeline {agent anystages {stage('第一阶段') {steps {echo '第一阶段 拉取代码'}}stage('第二阶段') {steps {echo '第二阶段 项目打包'}}}
}

2. post

post是在Pipeline或者 stage执行结束后的操作,不是必须出现的指令,可设置以下触发条件:

  • always:无论 Pipeline 或者 stage 运行完成的状态如何都会运行
  • changed:只有当前 Pipeline 或者 stage 运行的状态与先前运行状态不同时才能运行
  • fixed:只有当前一次构建失败或者不稳定,而当前 Pipeline 或者 stage 运行成功时运行
  • regression:前一次运行成功,而当前 Pipeline 或者 stage 运行状态为 failure, unstable 或者 aborted 时运行
  • aborted:只有当前 Pipeline 或者 stage 处于 “aborted” 状态时才能运行,通常是手动终止。
  • failure:当前 Pipeline 或者 stage 处于 “failed” 状态时才运行
  • success:当前 Pipeline 或者 stage 具有 “success” 状态时才运行
  • unstable:当前 Pipeline 或者 stage 具有 “unstable” 状态才运行
  • unsuccessful:当前 Pipeline 或者 stage 不是 “success” 状态时运行
  • cleanup:不管 Pipeline 或 stage 的状态如何,在每一个 post 条件被执行之后运行。
pipeline {agent anystages {stages {stage('第一阶段') {steps {echo '第一阶段 拉取代码'}}}post {success {echo '代码拉取成功!'}failure {echo '代码拉取失败!'}always {echo 'goodbye'}}
}

3. 流水线语法生成

在配置流水线页面,点击流水线语法可打开语法生成器页面
在这里插入图片描述

(1)在此处可选择需要生成语法的类型

  • 拉取代码 :git:Git
  • 推送文件到远程服务器:sshPublisher:Send build artifacts over SSH
    在这里插入图片描述

(2)填写对应的参数信息,此处以文件推送示例

推送文件路径配置可结合文章开头Jenkins工作空间目录描述进行配置,其中docker/docker-compose.yml就位于/var/jenkins_home/workspace/demo路径下,此处只需配置docker/docker-compose.yml即可
在这里插入图片描述
填写完成后,点击下方的 “生成流水线脚本” 进行生成,最后复制生成的脚本到 steps 中即可

在这里插入图片描述


在这里插入图片描述

相关文章:

Jenkins 构建流水线

在 Linux 系统上安装 Jenkins 服务,以及配置自动化构建项目 前置准备环境:docker、docker-compose、jdk、maven 一、环境搭建 1. Jenkins 安装 (1)拉取镜像 # 安装镜像包,默认安装最新版本 docker pull jenkins/jen…...

RTK部分模糊度固定测量流程图

部分模糊度剔除常用测量: 周跳或失锁时间优先剔除;按俯仰角剔除;按浮点模糊度协方差大小剔除模糊度;按信号强度剔除卫星;...

力扣-数据结构-2【算法学习day.73】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?建议灵神的题单和代码随想录)和记录自己的学习过程,我的解析也不会做的非常详细,只会提供思路和一些关…...

操作系统导论读书笔记

目录 虚拟化抽象:进程抽象:进程概念 虚拟化 抽象:进程 本章讨论操作系统提供的基本的抽象—— 进程。进程的非正式定义非常简单:进程就是运行中的程序。程序本身是没有生命周期的,它只是存在磁盘上面的一些指令&…...

基于3D-Speaker进行区分说话人项目搭建过程报错记录 | 通话录音说话人区分以及语音识别 | 声纹识别以及语音识别 | pyannote-audio

0. 研究背景 在外呼系统中,我们的后台管理系统通常要对电话录音的内容进行提取和分析。那么说到分析,我们就要对录音中的两个人的对话进行分离,然后分别分析,比如分析客户是否有合作的意愿,分析客服讲的话术是否合理&…...

如何使用流式渲染技术提升用户体验

提示:记录工作中遇到的需求及解决办法 文章目录 什么是流式渲染?Node.js 实现简单流式渲染声明式 Shadow DOM,不依赖 javascript 实现react 实现流式渲染总结提示:以下是本篇文章正文内容,下面案例可供参考 什么是流式渲染? 流式渲染主要思想是将HTML文档分块(chunk)…...

【接口自动化连载】使用yaml配置文件自动生成接口case

直接上干货撸代码,有一些是通用的工具类代码,一次性封装永久使用,期待大家的关注,一起加油!!! 配置文件 根据不同的业务需求进行配置,例如Goods服务、Order服务分开配置&#xff0…...

前端安全 常见的攻击类型及防御措施

1. 跨站脚本攻击(XSS) 描述:跨站脚本(XSS:Cross-Site Scripting)是一种安全漏洞,允许攻击者向网站注入恶意客户端代码。该代码由受害者执行从而让攻击者绕过访问控制并冒充用户。XSS攻击可以分…...

来道面试题——CopyOnWriteArrayList

原理 初始化时候,CopyOnWriteArrayList内部维护了一个可变数组,用于存储元素当执行数据变更操作的时候,会先创建一个原数组的副本,在副本上进行写操作,修改副本中的元素。写操作完成之后,把原数组的引用指…...

【Rust自学】5.1. 定义并实例化struct

喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 5.1.1. 什么是struct struct的中文意思为结构体,它是一种自定义的数据类型,它允许程序为相关联的值命名和打包&am…...

React 生命周期完整指南

React 生命周期完整指南 1. 生命周期概述 1.1 React 16.3 之前的生命周期 初始化阶段 constructorcomponentWillMountrendercomponentDidMount 更新阶段 componentWillReceivePropsshouldComponentUpdatecomponentWillUpdaterendercomponentDidUpdate 卸载阶段 componentWil…...

python中os._exit(0) 强制关闭进程后来杀死线程

在 Python 中调用 os._exit(0) 会强制终止整个进程,包括所有正在运行的线程。以下是详细解释: os._exit(0) 的行为 立即终止进程:os._exit() 函数会立即终止当前进程,不会执行任何清理操作,如调用清理处理程序&#…...

LeetCode:257. 二叉树的所有路径

跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:257. 二叉树的所有路径 给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根…...

RSICV国产芯片之CHV208

1. 芯片选型分析的对比维度 分析或者对标应用的芯片替代思路 1.1 内核/主频/存储空间支持 内核能力/指令集支持(考虑工具链兼容性); 主频:对比计算能力是否满足基本要求 存储:内存--数据搬移空间决定数据运算的…...

理解神经网络

神经网络是一种模拟人类大脑工作方式的计算模型,是深度学习和机器学习领域的基础。 基本原理 神经网络的基本原理是模拟人脑神经系统的功能,通过多个节点(也叫神经元)的连接和计算,实现非线性模型的组合和输出。每个…...

Android 之 List 简述

一、简单创建方式 Android 开发中&#xff0c;列表有很多种类&#xff0c;如ArrayList、LinkedList、List、MutableList等&#xff0c;创建列表的方式如下所示&#xff1a; fun listDemo() {// 使用 listOf 创建不可变的空列表val list listOf<Int>()val list1 listOf…...

设计模式の中介者发布订阅备忘录模式

文章目录 前言一、中介者模式二、发布订阅模式三、备忘录模式 前言 本篇是关于设计模式中介者模式、观察者&#xff08;发布-订阅&#xff09;模式、以及备忘录模式的学习笔记。 一、中介者模式 中介者模式是一种行为型设计模式&#xff0c;其核心目的是为了减少对象之间的复杂…...

云手机群控能用来做什么?

随着云手机的发展&#xff0c;云手机群控技术逐渐从小众的游戏多开工具&#xff0c;发展为涵盖多个领域的智能操作平台。不论是手游搬砖、短视频运营&#xff0c;还是账号养成等场景&#xff0c;云手机群控都展现出了强大的应用潜力。本文将为大家详细解析云手机群控的应用场景…...

fpgafor循环语句使用

genvar i;//循环变量名称 generate for(i0;i<4;ii1)begin:tx//自己定义名称 //循环内容 end endgenerate12位的16进制乘以4就是48位位宽的2进制 因为 222*2(2^4)16...

【FastAPI】BaseHTTPMiddleware类

一、概述 在FastAPI中&#xff0c;BaseHTTPMiddleware 类是Starlette框架提供的一个抽象基类&#xff0c;它允许开发者基于HTTP请求/响应接口编写ASGI中间件。 这个类对于希望实现自定义中间件逻辑的开发者来说是非常重要的工具。 通过继承 BaseHTTPMiddleware 并实现特定的方…...

IM即时通讯软件,构建企业局域网内安全协作

安全与权限&#xff1a;协同办公的企业级保障 在协同办公场景中&#xff0c;BeeWorks 将安全机制贯穿全流程。文件在局域网内传输与存储时均采用加密处理&#xff0c;企业网盘支持水印预览、离线文档权限回收等功能&#xff0c;防止敏感资料外泄&#xff1b;多人在线编辑文档时…...

LabVIEW的AMC架构解析

此LabVIEW 程序基于消息队列&#xff08;Message Queue&#xff09;机制构建 AMC 架构&#xff0c;核心包含消息生成&#xff08;MessageGenerator &#xff09;与消息处理&#xff08;Message Processor &#xff09;两大循环&#xff0c;通过队列传递事件与指令&#xff0c;实…...

Stone 3D新版本发布,添加玩家控制和生物模拟等组件,增强路径编辑功能,优化材质编辑

后续版本号改为构建日期加小版本&#xff0c;所以最新版本为20250603.01 功能更新如下&#xff1a; 1. 改写fps-controls组件&#xff0c;简化游戏应用的创建&#xff0c;你只需要一个场景glb&#xff0c;然后给Scene节点添加fps-controls组件&#xff0c;即可完成一个第一人…...

算法blog合集

https://zhuanlan.zhihu.com/p/600245782 https://zhuanlan.zhihu.com/p/696212679 https://zhuanlan.zhihu.com/p/291406172 【推荐系统】DSSM双塔召回2_pair-wise训练和推理-CSDN博客 精通推荐算法1&#xff1a;为什么需要推荐系统&#xff08;系列文章&#xff0c;建议收…...

PDF处理控件Aspose.PDF教程:在 C# 中更改 PDF 页面大小

PDF 的页面大小决定了其内容的显示、打印或处理方式。我们通常在准备打印、转换格式或标准化布局时需要更改 PDF 页面大小。在本文中&#xff0c;您将学习如何使用 C# 更改任何 PDF 文件的页面大小。我们将通过完整的代码示例&#xff0c;逐步指导您完成操作。 Aspose.PDF最新…...

React Native开发鸿蒙运动健康类应用的项目实践记录

​​项目名称​​&#xff1a;HarmonyFitness - 基于React Native的鸿蒙运动健康应用 ​​技术栈​​&#xff1a;React Native 0.72.5 TypeScript HarmonyOS API ArkTS原生模块 一、环境搭建与项目初始化 ​​双环境配置​​ ​​React Native环境​​&#xff1a; npx re…...

【Oracle】锁

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 锁基础概述1.1 锁的概念与作用1.2 锁的工作原理1.3 Oracle锁的分类 2. 行级锁 (Row-Level Locks)2.1 行级锁的基本概念2.1.1 TX锁&#xff08;事务锁&#xff09;2.1.2 行级锁的工作机制 2.2 行级锁的类型2.…...

float和float32有什么区别

这是一个非常重要但容易混淆的问题。我们来一步一步讲清楚&#xff1a; ✅ 简答&#xff1a;float 和 float32 的区别 项目float&#xff08;通用名称&#xff09;float32&#xff08;精确定义&#xff09;含义通常指“浮点数”&#xff0c;具体精度由语言/平台决定明确指 32 …...

Docker MCP 目录和工具包简介:使用 MCP 为 AI 代理提供支持的简单安全方法

目录 Model Context Protocol 势头强劲 — 还需要改进哪些?发现正确的、官方的和/或值得信赖的工具是很困难的复杂的安装和分发身份验证和权限不足Docker 如何帮助解决这些挑战在安全、隔离的容器中轻松发现和运行 MCP 服务器一键式 MCP 客户端集成,内置安全认证企业就绪的 M…...

为什么要选择VR看房?VR看房有什么优点?

VR看房&#xff1a;革新传统&#xff0c;重塑体验 在当今社会&#xff0c;虚拟现实&#xff08;VR&#xff09;技术正以前所未有的速度渗透到我们生活的各个领域&#xff0c;其中VR看房作为房地产领域的重要创新。本文将讨论为什么要选择VR看房以及VR看房的主要优点&#xff0…...