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

Jenkins的使用及Pipeline语法讲解

Jenkins简介

Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成。

什么是持续集成(CI)?
CI(Continuous integration,中文意思是持续集成)是一种软件开发实践。持续集成强调开发人员提交了新代码之后,立刻进行构建、编译、(单元)测试等这个过程,每次提交新代码都要进行此类重复操作,为了提高工作效率,避免重复工作及重复工作导致差别化问题。

什么是持续部署(CD)?
CD(Continuous Delivery, 中文意思持续交付)是在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境中,也就是说它是CI后紧跟的一个环节,当代码审核完毕打包成成品后,需要部署到真实的环境中去,这个过程也会根据代码的跟新持续的进行。

Jenkins安装
采用docker形式安装,首先安装好docker服务,然后在安装机器中对要存储Jenkins数据的目录进行赋权:

# groupadd jenkins -g 1000 && useradd jenkins -u 1000 -g jenkins
# chown -R 1000:1000 /jenkins
uid 和 gid必须是1000,和Jenkins镜像中的对应

开始安装:

# docker network create jenkins# docker run \--name jenkins-docker \--detach \--privileged \--network jenkins \--network-alias docker \--env DOCKER_TLS_CERTDIR=/certs \--volume /jenkins/certs:/certs/client \--volume /jenkins/data:/var/jenkins_home \--publish 8080:8080 \--publish 50000:50000 \jenkins/jenkins:latest

执行此命令获取初始密码

# docker exec -it jenkins-docker cat /var/jenkins_home/secrets/initialAdminPassword

这个时候就可以通过 serverip:8080 来访问到Jenkins。

流水线(pipeline)概括

想要更好的使用Jenkins,必须掌握其流水线(pipeline)的使用。

流水线概述
默认文件名为 Jenkinsfile

采用 Groovy 语法

其可以实现对代码的整合、编译、质量检测或部署等一系列操作,相当于我们说的“脚本”

流水线脚本的分类包括:脚本式、声明式#
脚本式语法结构

node {stage('Example') {try {sh 'exit 1'}catch (exc) {echo 'Something failed, I should sound the klaxons!'throw}}
}

声明式语法结构

pipeline {agent anystages {stage('Example') {steps {echo 'Hello World'script {def browsers = ['chrome', 'firefox']for (int i = 0; i < browsers.size(); ++i) {echo "Testing the ${browsers[i]} browser"}}}}}
}

我们应该用哪种方式来编写 Jenkinsfile?

推荐使用声明式语法结构来编写 Jenkinsfile,声明式语法结构的灵活性及可读性都要比脚本式语法结构要高,并且声明式结构中可以包含脚本式结构,可以说更强大一些,并且便于学习。

如何快速上手Jenkinsfile?
多看Jenkinsfile示例文件,及官方的语法介绍:Pipeline Syntax (jenkins.io),对语法有一个基础掌握。

学会使用脚本生成器

声明式常用语法介绍
1、最外层的pipeline,整条流水线的开始,里边定义了流水线所有内容

pipeline{}

2、agent,指定了流水线的执行节点,可以在pipeline的下行指定,也可以在stages的下行指定,agent有四个可选参数:

pipeline{
agent{
node{
label “container”
customWorkspace ‘/some/other/path’ //指定自定义的工作空间,其实就是指定自定义路径
}
}
}
any:在任意节点执行pipeline

none:未定义,当顶层的agent none时,必须在每个stage下再单独定义agent

label:指定运行节点的label

node:自定义运行节点配置,例如指定label或customWorkspace,agent { node { label ‘labelName’ } } 和 agent { label ‘labelName’ }相同, 但 node支持其他选项 (比如customWorkspace).

3、stages(阶段):包含一个或多个stage的序列,大部分执行操作都在这里,将每个离散部分串接起来,比如构建、测试和部署。

4、stage:包含在stages中,pipeline完成的所有实际工作都需要包含到stage中,每一个阶段都要有一个名字。

5、steps(步骤):1个stage中,一般都要运行1个steps,里边可以直接运行linux命令。相当于3-5点是一个连续的、互相关联的,例如:

pipeline {agent anystages { stage('Example') {agent {  //选择执行节点,可以在此层级指定label 'nginx'}steps {  //执行的步骤echo 'Hello World'}}}
}

6、post:定义Pipeline或stage运行结束时的操作有以下多个参数可选:

示例:

pipeline {agent anystages {stage('Example') {steps {echo 'Hello World'}}}post { always { echo 'I will always say Hello again!'}}
}

always:无论Pipeline运行的完成状态如何都会运行

changed:只有当前Pipeline或steps运行的状态与先前完成的Pipeline的状态不同时,才能运行

failure:仅当当前Pipeline或steps处于“失败”状态时才运行

success:仅当当前Pipeline或steps具有“成功”状态时才运行

unstable:只有当前Pipeline或steps具有“不稳定”状态才能运行

aborted:只有当前Pipeline或steps处于“中止”状态时才能运行

unsuccessful:只有当前Pipeline或steps运行为“未成功”状态才能运行

cleanup:无论Pipeline或steps运行后为什么状态,只要前边定义的状态都没匹配到,则运行

7、environment:环境变量,可以定义全局变量和特定的阶段变量,取决于其在流水线的位置,该指定支持一个特殊的方法credentials(),此方法可用于在Jenkins环境中通过标识符访问预定义的凭证,其有很多种类型:

示例1:

pipeline {agent anyenvironment { CC = 'clang'}stages {stage('Example Secret Text') {environment { // 需要提前将凭据创建好Secret Text类型的凭据AN_ACCESS_KEY = credentials('my-predefined-secret-text') }steps {sh 'printenv'}}}
}

示例2:

pipeline {agent anystages {stage('Example Username/Password') {environment {// 提前创建好Username and Password类型的凭据SERVICE_CREDS = credentials('my-predefined-username-password')}steps {sh 'echo "Service user is $SERVICE_CREDS_USR"'sh 'echo "Service password is $SERVICE_CREDS_PSW"'}}stage('Example SSH Username with private key') {environment {// 提前创建好SSH Username with private key类型的凭据SSH_CREDS = credentials('my-predefined-ssh-creds')}steps {sh 'echo "SSH private key is located at $SSH_CREDS"'sh 'echo "SSH user is $SSH_CREDS_USR"'sh 'echo "SSH passphrase is $SSH_CREDS_PSW"'}}}
}

Secret Text:指定的环境变量将设置为密文内容

Secret File:指定的环境变量将设置为临时创建的文件的位置

Username and password:指定的环境变量将设置为username:password,并将自动定义为两个环境变量:MYVARNAME_USR和MYVARNAME_PSW

SSH with Private Key:指定的环境变量将设置为临时创建的SSH密钥文件的位置,并且可以自动定义为两个环境变量:MYVARNAME_USR和MYVARNAME_PSW

8、options:此指令允许从Pipeline本身中配置一些特定的选项。Pipeline提供了许多这样的选项,例如buildDiscarder,也可以由插件提供,例如timestamps。分享一些参数:

buildDiscarder:保持构建的最大个数,示例:options { buildDiscarder(logRotator(numToKeepStr: ‘1’)) }

checkoutToSubdirectory:在workspace的子目录中执行源代码自动管理切换,示例:options { checkoutToSubdirectory(‘foo’) }

disableConcurrentBuilds:不允许同时执行管道。可用于防止同时访问共享资源等,示例:options { disableConcurrentBuilds() }

disableResume:如果控制器重新启动,则不允许恢复pipeline,示例: options { disableResume() }

newContainerPerStage:使用docker或dockerfile agent时。每个stage将在同一节点上的新容器实例中运行,而不是在同一容器实例中运行的所有stages。

overrideIndexTriggers:

retry:失败时,按指定次数重试整个管道,可以针对Pipeline或者Stage,示例:options { retry(3) }

skipStagesAfterUnstable:一旦构建状态变得不稳定,就跳过各个stages。示例: options { skipStagesAfterUnstable() }

timeout:设置管道运行的超时时间,此参数可以针对Pipeline或者Stage,例如:options { timeout(time: 1, unit: ‘HOURS’) }

timestamps: 所有控制台输出前加上线路发出的时间,此参数可以针对Pipeline或者Stage,示例:options { timestamps() }

pipeline {agent anyoptions {timeout(time:1, unit:'HOURS') timestamps()buildDiscarder(logRotator(numToKeepStr:'10'))}stages {stage('Example') {options {timeout(time:1200, unit:'SECONDS') }steps {echo 'Hello World'}}}
}

9、parameters:为Pipeline运行前提供参数,有几种参数类型供选择:

pipeline {
agent any
parameters {
string(name:‘PERSON’, defaultValue:‘Mr Jenkins’, description:‘Who should I say hello to?’)
text(name:‘BIOGRAPHY’, defaultValue:‘’, description:‘Enter some information about the person’)
booleanParam(name:‘TOGGLE’, defaultValue:true, description:‘Toggle this value’)
choice(name:‘CHOICE’, choices: [‘One’, ‘Two’, ‘Three’], description:‘Pick something’)
password(name:‘PASSWORD’, defaultValue:‘SECRET’, description:‘Enter a password’)
}
stages {
stage(‘Example’) {
steps {
echo “Hello ${params.PERSON}”
echo “Biography: ${params.BIOGRAPHY}”
echo “Toggle: ${params.TOGGLE}”
echo “Choice: ${params.CHOICE}”
echo “Password: ${params.PASSWORD}”
}
}
}
}
使用parameters参数有一个bug,首次构建时不会让你选择参数,第二次才可以选择。

string:字符串类型,示例:parameters { string(name: ‘DEPLOY_ENV’, defaultValue: ‘staging’, description: ‘’) }

text:文本类型,可以包含多行,示例: parameters { text(name: ‘DEPLOY_TEXT’, defaultValue: ‘One\nTwo\nThree\n’, description: ‘’) }

booleanParam:布尔类型,示例: parameters { booleanParam(name: ‘DEBUG_BUILD’, defaultValue: true, description: ‘’) }

choice:选择类型,多个选项任选其一,示例: parameters { choice(name: ‘CHOICES’, choices: [‘one’, ‘two’, ‘three’], description: ‘’) }

password:密码类型,可以提前设置密码,示例: parameters { password(name: ‘PASSWORD’, defaultValue: ‘SECRET’, description: ‘A secret password’) }

10、triggers:触发器,定义了Pipeline自动化触发的方式,可触发的方式有:

pipeline {agent anytriggers {cron('H */4 * * 1-5')}stages {stage('Example') {steps {echo 'Hello World'}}}
}

Jenkins cron syntax

Jenkins cron语法遵循cron公共的语法(略有不同),每行由5个字段组成,由制表符或空格分隔。
在这里插入图片描述

要为一个字段指定多个值,可以使用以下运算符。按优先顺序展示:

为了允许定期调度的任务在系统上产生均匀负载,应尽可能使用符号H(表示“哈希”),使其执行pipeline的时间分散,更好的利用资源。

此外,支持使用 @yearly, @annually, @monthly, @weekly, @daily, @midnight, and @hourly 作为别名,他们都等同于使用哈希自动的进行均衡,例如@hourly 与H * * * *相同,表示1小时内任意时间执行即可。

举一些cron例子:

    • 指定所有的值
  • M-N 指定值得范围

  • M-N/X or */X 在指定的范围或者整个范围内,按照 X的值为间隔步长

  • A,B,…,Z指定多个值

  • cron:计划任务定期触发,示例: triggers { cron(‘H */4 * * 1-5’) }

  • pollSCM:与cron方式类似,但是必须发现有源码的变化,才会触发,示例: triggers { pollSCM(‘H */4 * * 1-5’) }

    pollSCM触发器仅在Jenkins 2.22或更高版本中可用。

  • upstream:接受以逗号分隔的作业字符串和阈值。当字符串中的任何作业以最小阈值结束时,将会触发,示例:triggers { upstream(upstreamProjects: ‘job1,job2’, threshold: hudson.model.Result.SUCCESS) }

每15分钟执行一次,可以是 at :07, :22, :37, :52:triggers{ cron(‘H/15 * * * *’) }

在每小时的前30分钟,每10分钟执行一次:triggers{ cron(‘H(0-29)/10 * * * *’) }

每周的周一到周五的,9点-16点之间的第45分钟每两个小时执行一次:triggers{ cron(‘45 9-16/2 * * 1-5’) }

1-11月的每个1号和15号都要随机执行一次:triggers{ cron(‘H H 1,15 1-11 *’) }

11、tools:工具,目前仅支持三种工具:maven、jdk和gradle。工具的名称必须在系统设置—>全局工具配置中定义。定义好后即可开始调用:

pipeline {agent anytools {maven 'apache-maven-3.0.1' }stages {stage('Example') {steps {sh 'mvn --version'}}}
}

第一次运行此工具时,如果没有会去下载,或者会根据你指定的获取方式去获取,比如直接从其他机器打包过来解压等方式。

12、input:stage 的 input 指令允许你使用 input step提示输入。 在应用了 options 后,进入 stage 的 agent 或评估 when 条件前, stage 将暂停。 如果 input 被批准, stage 将会继续。 作为 input 提交的任何参数都将在环境中用于其他 stage 使用。可选配置:

示例:

pipeline {agent anystages {stage('Example') {input {message "Should we continue?"ok "Yes, we should."submitter "alice,bob"parameters {string(name:'PERSON', defaultValue:'Mr Jenkins', description:'Who should I say hello to?')}}steps {echo "Hello, ${PERSON}, nice to meet you."}}}
}

message:必需的。 呈现给用户的信息。

id:可选的, 默认为 stage 名称。

ok:可选的,表单中 ok 按钮的描述文本。

submitter:可选的,以逗号分割的用户列表,只有列表用户才可以提交input内容。

parameters:可选参数列表,与前文介绍的相同。

13、when:逻辑判断,可以给定条件决定要不要执行此stage,when指令必须包含至少一个条件,如果when包含多个条件,则必须所有的条件都返回true,stage才会运行。内置条件有:

示例:

pipeline {agent anyparameters {choice(name:'BRANCH_NAME', choices: ['production', 'staging'], description:'Pick something')string defaultValue:'production', name:'DEPLOY_TO', trim:true}stages {stage('Example Build') {when {expression { BRANCH_NAME ==~ /(production|staging)/ }}steps {echo "Start building ${BRANCH_NAME}"}}stage('Example Deploy') {when {anyOf {environment name:'DEPLOY_TO', value:'production'environment name:'DEPLOY_TO', value:'staging'}}steps {echo 'Deploying'}}}
}

brance:分支匹配,当正在构建的分支与预设给定的分支匹配时,执行此stage,例如: when { branch ‘master’ },此参数仅适用于多分支流水线。

environment:当指定的环境变量是给定的值时,执行此stage,例如:when { environment name: ‘DEPLOY_TO’, value: ‘production’ }

expression:当指定的Groovy表达式评估为true时,执行此stage,例如: when { expression { return params.DEBUG_BUILD } }

not:当嵌套条件是错误时,执行这个stage,必须包含一个条件,例如: when { not { branch ‘master’ } }

allOf:当所有的嵌套条件都正确时(当when中有多个条件时,默认就是此策略),执行这个此stage,必须包含至少一个条件,例如: when { allOf { branch ‘master’; environment name: ‘DEPLOY_TO’, value: ‘production’ } }

anyOf:当至少有一个嵌套条件为真时,执行这个阶段,必须包含至少一个条件,例如: when { anyOf { branch ‘master’; branch ‘staging’ } }

beforeAgent:默认为false,默认情况下,如果在stage中包含agent,则会在执行when之前会先执行agent,如果将beforeAgent设置为true,则表示先执行when条件,when条件判断为执行stage后,才执行agent。

14、Parallel:并行,声明式流水线的stage可以在他们内部声明多个嵌套stage, 它们将并行执行。注意,一个stage必须只有一个 steps 或 parallel ,嵌套的stage本身不能再进入 parallel 阶段,任何包含parallel的stage不能包含agent或tools,因为它们没有相关的step。

另外,可以添加 failFast true 到包含 parallel的 stage 中,表示当其中一个进程失败时,所有的 parallel 阶段都将被终止。

示例:

pipeline {agent anyoptions {parallelsAlwaysFailFast() //表示后续所有的parallel阶段中都设置为failFast truetimestamps()}stages {stage('Build Stage') {steps {echo 'This stage is Build.'}}stage('Parallel Stage --> Deploy') {when {not{branch 'prod'}}parallel {stage('Branch dev') {agent {label "dev"}steps {echo "On Branch dev deploy"}}stage('Branch int') {agent {label "int"}steps {echo "On Branch int deploy"}}stage('Branch test') {agent {label "test"}stages {stage('Nested 1') {steps {echo "In stage Nested 1 within Branch test"}}stage('Nested 2') {steps {echo "In stage Nested 2 within Branch test"}}}}}}}
}

此示例中:只要当branch不是prod时,则将同时在dev/int/test三个环境中deploy,test环境的deploy又分为两个stage,此两个stage并不是并行执行,而是串行执行。

15、script:脚本式语法,可以在声明式流水线中使用,包含在step里,调用script { }块,示例如下:

pipeline {agent anystages {stage('Example') {steps {echo 'Hello World'script {def browsers = ['chrome', 'firefox']for (int i = 0; i < browsers.size(); ++i) {echo "Testing the ${browsers[i]} browser"}}}}}
}

脚本式语法
脚本式pipeline也是建立在底层流水线上的,与声明式不同的是, 脚本化流水线实际上是由 Groovy构建的通用 DSL, Groovy 语言提供的大部分功能都可以用于脚本化流水线。

脚本化流水线从 Jenkinsfile 的顶部开始向下串行执行, 就像 Groovy 或其他语言中的大多数传统脚本一样。 因此,提供流控制取决于 Groovy 表达式, 比如 if/else 条件, 例如:

node {stage('Example') {if (env.BRANCH_NAME == 'master') {echo 'I only execute on the master branch'} else {echo 'I execute elsewhere'}}
}

另一种方法是使用Groovy的异常处理支持来管理脚本化流水线流控制。当 步骤 失败 ,无论什么原因,它们都会抛出一个异常。处理错误的行为必须使用Groovy中的 try/catch/finally 块 , 例如:

node {stage('Example') {try {sh 'exit 1'}catch (exc) {echo 'Something failed, I should sound the klaxons!'throw}}
}

相关文章:

Jenkins的使用及Pipeline语法讲解

Jenkins简介 Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件项目可以进行持续集成。 什么是持续集成&#xff08;CI&#xff09;&#xff1f; CI(…...

【MySQL】初识数据库

目录 一.什么是数据库 二.数据库和数据结构的关系 三. 数据库服务器、数据库与表之间的关系 四.关系型数据库 五. SQL介绍 SQL分类 六.MySQL架构&#xff08;面试重点&#xff09; 七. 库的基本操作 1.查看数据库 2.创建数据库 字符集编码和校验&#xff08;排序&…...

Android tinyalsa库函数剖析

1. PCM 流控制函数 打开、关闭及状态检查 pcm_open(unsigned int card, unsigned int device, unsigned int flags, struct pcm_config *config) 打开指定声卡&#xff08;card&#xff09;和设备&#xff08;device&#xff09;的 PCM 流。 flags 参数确定流的方向&#xff1…...

DFS/BFS专练-搞定图论基础!(从海岛问题过渡至图论基础应用C++/C)

:: 图论基础理论 :: 紧接着&#xff0c;图论基础理论中&#xff0c;咱们讲到&#xff0c;图论的遍历主要由&#xff08;dfs与bfs决定&#xff09; 那咱们本篇博客就来聊聊dfs与bfs。 dfs&#xff08;深度优先搜索&#xff09;、bfs&#xff08;广度优先搜索&#xff09;的区别…...

2024年RIS SCI2区:自适应天鹰算法AAO,深度解析+性能实测

目录 1.摘要2.天鹰算法AO原理3.改进策略4.结果展示5.参考文献6.代码获取 1.摘要 智能电网通过集成可再生能源并管理供需动态平衡来提高效率&#xff0c;本文提出了自适应天鹰算法&#xff08;AAO&#xff09;&#xff0c;AAO使用Sigmoid因子来平衡探索和开发&#xff0c;根据迭…...

orcad csi 17.4 DRC规则设置及检查

rCAD绘制完原理图之后总是需要开启DRC检测&#xff0c;但是DRC一般都是英文版的&#xff0c;下面基于Cadence17.4 的orCAD16.6 对DRC的界面做简单的介绍 首先&#xff0c;鼠标点击原理图&#xff0c;然后再点击右上方的小勾图标 desine rules check option选项的界面 电气规…...

前端实战:基于 Vue 与 QRCode 库实现动态二维码合成与下载功能

在现代 Web 应用开发中&#xff0c;二维码的应用越来越广泛&#xff0c;从电子票务到信息传递&#xff0c;它都扮演着重要角色。本文将分享如何在 Vue 项目中&#xff0c;结合QRCode库实现动态二维码的生成、与背景图合成以及图片下载功能&#xff0c;打造一个完整且实用的二维…...

天梯赛DFS合集

1.DFS特殊输入&#xff1a;PTA | 程序设计类实验辅助教学平台 这题其他还是蛮容易&#xff0c;直接用递归即可&#xff0c;问题在于怎么输入&#xff0c;其实可以在递归到底层时输入即可&#xff0c;也就是边递归边输入&#xff0c;另外提一嘴跟这个题没什么关系的点&#xff…...

Qt中读写结构体字节数据

在Qt中读写结构体字节数据通常涉及将结构体转换为字节数组(QByteArray)或直接从内存中读写。以下是几种常见方法&#xff1a; 方法1&#xff1a;使用QDataStream读写结构体 cpp #include <QFile> #include <QDataStream>// 定义结构体 #pragma pack(push, 1) //…...

关于yarn和hadoop

1.yarn的定义&#xff1f; YARN&#xff08;Yet Another Resource Negotiator&#xff09;是 Apache Hadoop 的一个关键组件&#xff0c;它是一个资源管理平台&#xff0c;负责管理和调度计算资源。YARN 允许多个数据处理引擎&#xff08;如 MapReduce、Spark、Flink 等&#…...

【全部更新】2025妈妈杯D题1-4问mathercupD题数学建模挑战赛D题数学建模思路代码文章教学短途运输货量预测及车辆调度问题

完整内容请看文章最下面的推广群 先进行摘要和结果的展示、再给出完整的思路 问题1&#xff1a;通过时间序列或机器学习模型预测货量&#xff0c;并按历史分布拆分到10分钟颗粒度。 问题2&#xff1a;基于货量生成运输需求&#xff0c;用贪心算法或整数规划优化车辆调度。 问…...

考研408第一章计算机系统概述——1.1-1.2操作系统的基本概念与发展历程

考研408计算机系统概述——操作系统的基本概念与发展历程 一、操作系统的基本概念 1.1 操作系统的定义与功能 1.1.1 定义 操作系统(Operating System, OS)是管理计算机硬件与软件资源的程序集合,为应用程序和用户提供接口与服务。其核心功能包括: 资源管理者:处理机、…...

《从理论到实践:CRC校验的魔法之旅》

循环冗余校验&#xff08;Cyclic Redundancy Check ,CRC &#xff09;是一种用于检测数据传输或存储过程中错误的算法。他通过计算数据的校验值&#xff08;也称为CRC码&#xff09;&#xff0c;并在数据接收端验证校验值是饭否正确&#xff0c;从而检测数据是否在传输过程中被…...

【算法笔记】整除与最大公约数(GCD)专题整理

参考文章链接&#xff08;已获得作者授权&#xff09; 一、整除&#xff1a;数学中的"完美分割" 定义 若整数 a a a能整除整数 b b b&#xff08;记作 a ∣ b a\mid b a∣b&#xff09;&#xff0c;则存在整数 k k k使得 b a ⋅ k ba\cdot k ba⋅k。 通俗理解&…...

JDBC 与 MyBatis 详解:从基础到实践

目录 一、JDBC 介绍 二、使用 JDBC 查询用户信息 三、ResultSet 结果集 四、预编译 SQL - SQL 注入问题 五、预编译 SQL - 性能更高 六、JDBC 增删改操作 插入数据&#xff1a; 更新数据&#xff1a; 删除数据&#xff1a; 七、MyBatis 介绍 八、MyBatis 入门程序 引…...

虚拟机开发环境搭建与内网迁移

以下是关于在虚拟机中搭建开发环境并迁移至内网的详细步骤及注意事项&#xff0c;适用于需要在内网隔离环境中进行开发的场景&#xff08;如企业安全要求、离线开发等&#xff09;&#xff1a; ‌一、虚拟机开发环境搭建‌ ‌1. 选择虚拟机平台‌ ‌推荐工具‌&#xff1a; ‌V…...

【HFP】蓝牙HFP协议音频连接核心技术深度解析

目录 一、音频连接建立的总体要求 1.1 发起主体与时机 1.2 前提条件 1.3 同步连接的建立 1.4 通知机制 二、不同主体发起的音频连接建立流程 2.1 连接建立触发矩阵 2.2 AG 发起的音频连接建立 2.3 HF 发起的音频连接建立 三、编解码器连接建立流程 3.1 发起条件 3.…...

PowerBI 表格显示无关联的表数据

假设有两张没有建立关联的数据表: 产品表 库存表 我们将他们放入表格里显示&#xff0c;数据会出问题。 因为 [库存表] 里的数据有除 [产品表] 以外的产品的数据&#xff0c;所以PBI无法从两张表中找到一一对应的数据。 解决方法:(不建立关联关系的情况下) 新建一个度量值&a…...

观察者模式详解与C++实现

1. 模式定义 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型设计模式&#xff0c;定义了对象间的一对多依赖关系。当一个对象&#xff08;被观察者/主题&#xff09;状态改变时&#xff0c;所有依赖它的对象&#xff08;观察者&#xff09;都会自动收到通知…...

用ffmpeg 实现拉取h265的flv视频转存成264的mp4 实现方案

1.需要对ffmpeg进行源码修改 这里使用 https://github.com/numberwolf/FFmpeg-QuQi-H265-FLV-RTMP 这位大神提供的源码 需要 x265_3.2.1.tar.gz last_x264.tar.bz2 fdk-aac-2.0.1.tar.gz FFmpeg-QuQi-H265-FLV-RTMP-master.zip 这些包 升级ubuntu18.04 apt update a…...

《AI赋能职场:大模型高效应用课》第8课 AI辅助职场沟通与协作

【本课目标】 掌握AI辅助邮件、沟通话术的优化技巧。学习利用AI快速生成高效的会议纪要。通过实操演练&#xff0c;提升职场沟通效率与协作能力。 【准备工具】 DeepSeek大模型&#xff08;deepseek.com&#xff09;百度文心一言&#xff08;yiyan.baidu.com&#xff09; 一…...

PowerBI下载安装教程

1、打开官方下载链接&#xff0c;或者Microsoft store里搜索下载&#xff08;通过官网下载可以选择安装路径&#xff0c;应用商店直接会安装到默认路径里&#xff09;。 2、等待下载成功后&#xff0c;直接点击【打开】即可。...

PowerBI如何钻取到明细

PowerBI如何钻取到明细 最近做项目领导提到一需求&#xff0c;在查看账龄的时候&#xff0c;还想查看到它的一个明细情况。 PowerBI如何钻取到明细&#xff0c;以一个案例分享下&#xff1a; 第一步&#xff1a;我们先查看账龄的一个分布情况&#xff1a; 第二步&#xff1a;…...

常见算法题

import java.util.*;class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.val val; }TreeNode(int val, TreeNode left, TreeNode right) {this.val val;this.left left;this.right right;} }public class test_04_16 {//获取二叉…...

C语言超详细结构体知识

1.自定义类型&#xff1a;结构体的介绍 在之前的博客中&#xff0c;我们简单介绍过了关于结构体的基本知识&#xff0c;这里我们稍微复习一下。 结构体(struct)是C语言中一种重要的复合数据类型&#xff0c;它允许将不同类型的数据组合成一个整体。 1.1结构体的定义 结构体使…...

2N60-ASEMI功业控制与自动化专用2N60

编辑&#xff1a;ll 2N60-ASEMI功业控制与自动化专用2N60 型号&#xff1a;2N60 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220F 批号&#xff1a;最新 最大漏源电流&#xff1a;2A 漏源击穿电压&#xff1a;600V RDS&#xff08;ON&#xff09;Max&#xff1a;5.00Ω…...

发现“横”字手写有难度,对比两个“横”字

我发现手写体“横”字“好看”程度&#xff0c;难以比得上印刷体&#xff1a; 两个从方正简体启体来的“横”字&#xff1a; 哪个更好看&#xff1f;我是倾向于左边一点。 <div style"transform: rotate(180deg); display: inline-block;"> 左边是我从方正简…...

深入解析 HTML5 Web IndexedDB 数据库:构建高效离线应用的基石

摘要 在现代 Web 应用开发中,离线访问和高效处理大量结构化数据的需求日益增长。HTML5 的 IndexedDB 作为一种强大的客户端 NoSQL 数据库,为开发者提供了可靠的解决方案。本文将全面介绍 IndexedDB 的特性、语法、方法、应用实例、使用场景,以及其优势与劣势,帮助开发者深…...

17-算法打卡-哈希表-快乐数-leetcode(202)-第十七天

1 题目地址 202. 快乐数 - 力扣&#xff08;LeetCode&#xff09;202. 快乐数 - 编写一个算法来判断一个数 n 是不是快乐数。「快乐数」 定义为&#xff1a; * 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。 * 然后重复这个过程直到这个数变为 1…...

决战浏览器渲染:减少重绘(Repaint)与重排(Reflow)的性能优化策略

在现代Web开发中&#xff0c;流畅的用户体验是衡量应用质量的关键指标之一。用户与界面的每一次交互&#xff0c;背后都牵动着浏览器复杂而精密的渲染过程。当这个过程不够高效时&#xff0c;用户就会感受到卡顿、延迟&#xff0c;甚至页面“掉帧”。在众多影响渲染性能的因素中…...

深度解析生成对抗网络:原理、应用与未来趋势

在人工智能的浩瀚星空中&#xff0c;生成对抗网络&#xff08;Generative Adversarial Networks&#xff0c;GAN&#xff09;犹如一颗璀璨的明星&#xff0c;自 2014 年由 Ian Goodfellow 等人提出以来&#xff0c;便以其独特而强大的生成能力&#xff0c;在计算机视觉、自然语…...

电能质量治理解决方案:构建高效、安全的电力系统

随着“双碳”目标的推进及新型电力系统的快速发展&#xff0c;大量电力电子设备&#xff08;如光伏逆变器、充电桩、变频器等&#xff09;接入电网&#xff0c;导致谐波畸变、无功功率激增、电压波动等问题日益突出。电能质量恶化不仅威胁设备安全&#xff0c;还影响电网稳定运…...

生态篇|多总线融合与网关设计

引言 1. 车内多总线概览 2. 主流车载总线技术对比 3. 网关设计原则与架构 4. 协议转换与映射策略 5. 安全与诊断功能集成...

热门与冷门并存,25西电—电子工程学院(考研录取情况)

1、电子工程学院各个方向 2、电子工程学院近三年复试分数线对比 学长、学姐分析 由表可看出&#xff1a; 1、电子科学与技术25年相较于24年上升20分 2、信息与通信工程、控制科学与工程、新一代电子信息技术&#xff08;专硕&#xff09;25年相较于24年下降25分 3、25vs24推…...

HDFS入门】HDFS安全与权限管理解析:从认证到加密的完整指南

目录 引言 1 认证与授权机制 1.1 Kerberos认证集成 1.2 HDFS ACL细粒度控制 2 数据加密保护 2.1 传输层加密(SSL/TLS) 2.2 静态数据加密 3 审计与监控体系 3.1 操作审计流程 3.2 安全监控指标 4 权限模型详解 4.1 用户/组权限模型 4.2 umask配置原理 5 安全最佳实…...

合成数据中的对抗样本生成与应用:让AI模型更强、更稳、更安全

目录 合成数据中的对抗样本生成与应用&#xff1a;让AI模型更强、更稳、更安全 一、什么是对抗样本&#xff1f; 二、为什么要在合成数据中引入对抗样本&#xff1f; 三、对抗样本在图像合成数据中的生成方法 ✅ 方法1&#xff1a;FGSM&#xff08;Fast Gradient Sign Met…...

考研系列-计算机网络-第二章、物理层

一、通信基础 1.物理层基本概念 2.数据通信基础知识...

uni-app 安卓10以上上传原图解决方案

在Android 10及以上版本中&#xff0c;由于系统对文件访问的限制&#xff0c;使用chooseImage并勾选原图上传后&#xff0c;返回的是图片的外部存储路径&#xff0c;如&#xff1a;file:///storage/emulated/0/DCIM/Camera/。这种外部存储路径&#xff0c;无法直接转换成所需要…...

关于element的dialog的取消(关闭弹窗)方法触发两次

在这里插入图片描述 关闭的时候加个修饰符.native close.native...

vue,uniapp解决h5跨域问题

如果有这样的跨域问题&#xff0c;解决办法&#xff1a; ✅ 第一步&#xff1a;在项目根目录下创建 vue.config.js 和 package.json 同级目录。 // vue.config.js module.exports {devServer: {proxy: {/api: {target: https://app.yycjkb.cn, // 你的后端接口地址changeOrig…...

2025-04-18 李沐深度学习3 —— 线性代数

文章目录 1 线性代数1.1 标量、向量与矩阵1.2 矩阵概念1.3 按特定轴求和 2 实战&#xff1a;线性代数2.1 标量2.2 向量2.3 矩阵2.4 张量2.5 降维2.6 点积2.7 矩阵-向量积2.8 矩阵-矩阵乘法2.9 范数2.10 练习 1 线性代数 1.1 标量、向量与矩阵 标量&#xff08;Scalar&#xff…...

2026《数据结构》考研复习笔记三(C++高级教程)

C高级教程 一、文件和流二、异常处理三、命名空间四、模板五、信号处理六、多线程 一、文件和流 iostream 用于标准输入/输出&#xff08;控制台I/O&#xff09;&#xff0c;处理与终端&#xff08;键盘输入和屏幕输出&#xff09;的交互 包含以下全局流对象&#xff1a; cin&…...

python进阶: 深入了解调试利器 Pdb

Python是一种广泛使用的编程语言&#xff0c;以其简洁和可读性著称。在开发和调试过程中&#xff0c;遇到错误和问题是不可避免的。Python为此提供了一个强大的调试工具——Pdb&#xff08;Python Debugger&#xff09;。 Pdb是Python标准库中自带的调试器&#xff0c;可以帮助…...

前端资源加载失败后重试加载(CSS,JS等引用资源)

前端资源加载失败后的重试 .前端引用资源时出现了资源加载失败(这里针对的是路径引用异常或者url解析错误时) 解决这个问题首先要明确一下几个步骤 1.什么情况或者什么时候重试 2.如何重试 3.重试过程中的边界处理 这里引入里三个测试脚本&#xff0c;分别加载里三个不同的脚…...

每日算法【双指针算法】(Day 2-复写零)

双指针算法 1.算法题目(复写零)2.讲解算法原理3.编写代码 1.算法题目(复写零) 注意&#xff1a;不要越界&#xff0c;不能开额外的数组&#xff0c;只能从现有数组上进行操作&#xff0c;没有返回值。 2.讲解算法原理 解法&#xff1a;双指针操作 先根据“异地”操作&#xf…...

【C++深入系列】:模版详解(上)

&#x1f525; 本文专栏&#xff1a;c &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; 你不需要很厉害才能开始&#xff0c;但你需要开始才能很厉害。 ★★★ 本文前置知识&#xff1a; 类和对象&#xff08;上&#xff09; …...

PyCharm Flask 使用 Tailwind CSS v3 配置

安装 Tailwind CSS 步骤 1&#xff1a;初始化项目 在 PyCharm 终端运行&#xff1a;npm init -y安装 Tailwind CSS&#xff1a;npm install -D tailwindcss3 postcss autoprefixer初始化 Tailwind 配置文件&#xff1a;npx tailwindcss init这会生成 tailwind.config.js。 步…...

设计模式每日硬核训练 Day 15:享元模式(Flyweight Pattern)完整讲解与实战应用

&#x1f504; 回顾 Day 14&#xff1a;组合模式小结 在 Day 14 中&#xff0c;我们学习了组合模式&#xff08;Composite Pattern&#xff09;&#xff1a; 适用于构建树状层级结构&#xff0c;使得“单个对象”和“对象集合”统一操作。广泛用于文件系统、UI 控件树、组织结…...

使用Service发布应用程序

使用Service发布应用程序 文章目录 使用Service发布应用程序[toc]一、什么是Service二、通过Endpoints理解Service的工作机制1.什么是Endpoints2.创建Service以验证Endpoints 三、Service的负载均衡机制四、Service的服务发现机制五、定义Service六、Service类型七、无头Servic…...

美家市场2025电视版分享码-美家市场电视直播软件分享码免费获取

美家市场2025电视版作为一款备受欢迎的应用市场&#xff0c;为用户提供了海量的电视直播软件&#xff0c;而分享码则是免费获取这些资源的重要途径。与此同时&#xff0c;乐看家桌面也是一款在智能电视领域极具特色的软件&#xff0c;它能与美家市场搭配使用&#xff0c;为用户…...