技术分享-Jenkins

持续集成及Jenkins介绍

软件开发生命周期叫SDLC(Software Development Life Cycle),集合了计划、开发、测试、部署过程。
在平常的开发过程中, 需要频繁地(一天多次)将代码集成到主干,这个叫持续集成(Continuous Integration,简称CI),有个持续集成,还有持续部署(Continuous Deployment)。
在没有Jenkins的时候,需要本地打包,或者本地编译,然后把改动过的文件上传到服务器,然后重启服务,这样是比较麻烦的,特别是这次的修改文件比较多的时候,有了Jenkins,只需要点一下,就可以实现这个功能了。

持续集成的好处:

  1. 降低风险,由于持续集成不断去构建,编译和测试,可以很早期发现问题,所以修复的代价就少
  2. 对系统健康持续检查,减少发布风险带来的问题
  3. 减少重复性工作
  4. 持续部署,提供可部署单元包
  5. 持续交付可供使用的版本
  6. 增强团队信心

Jenkins介绍

Jenkins是一款流行的开源持续集成(Continuous Integration)工具,广泛用于项目开发,具有自动化构建测试和部署等功能。中文官网:https://www.jenkins.io/zh/。

Jenkins的特征:

  • 开源的Java语言开发持续集成工具,支持持续集成,持续部署
  • 易于安装部署配置:可通过yum安装,或下载war包以及通过docker容器等快速实现安装部署,可方便web界面配置管理
  • 消息通知及测试报告:集成RSS/E-mail通过RSS发布构建结果,或当构建完成时通过E-mail通知,生成JUnit/TestNG测试报告
  • 分布式构建:支持Jenkins能够让多台计算机一起构建/测试
  • 文件识别:Jenkins能够跟踪哪次构建生成哪些jar,哪次构建使用哪个版本的jar等
  • 丰富的插件支持:支持扩展插件,你可以开发适合自己团队使用的工具,如git,svn,maven,docker等

Jenkins安装和持续集成环境配置

流程:

  1. 开发人员每天进行代码提交,提交到Git仓库
  2. Jenkins作为持续集成工具,使用Git工具到Git仓库拉取代码到集成服务器,再配合JDK,Maven等软件完成代码编译,代码测试与审查,测试,打包等工作,在这个过程中每一步出错,都重新再执行一次整个流程
  3. Jenkins把生成的jar或war包分发到测试服务器或者生产服务器,测试人员或用户就可以访问应用

这里不得不说到一个东西:GitLab。

GitLab是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务。
GitLab和GitHub一样属于第三方基于Git开发的作品,免费且开源(基于MIT协议),与Github类似,可以注册用户,任意提交你的代码,添加SSHKey等等。不同的是,GitLab是可以部署到自己的服务器上,数据库等一切信息都掌握在自己手上,适合团队内部协作开发,简单来说可把GitLab看作个人版的GitHub。

# 安装相关依赖
[root@localhost ~]# yum -y install policycoreutils openssh-server openssh-clients postfix
# 启动ssh服务,设置开机启动
[root@localhost ~]# systemctl enable sshd && sudo systemctl start sshd
# 设置postfix开机自启,并启动postfix支持gitlab发信功能
[root@localhost ~]# systemctl enable postfix && systemctl start postfix
# 关闭防火墙
[root@localhost ~]# systemctl disable firewalld
# 在线下载安装包
[root@localhost ~]# wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el6/gitlab-ce-12.4.2-ce.0.el6.x86_64.rpm --no-check-certificate
# 安装GitLab
[root@localhost ~]# rpm -i gitlab-ce-12.4.2-ce.0.el6.x86_64.rpm
# 提示错误,说是缺少依赖,那我们安装依赖,如果没有报错,就不需要执行
[root@localhost ~]# yum -y install policycoreutils-python
# 再次执行安装命令,稍微等一会儿,就会提示安装成功了,在它给出的信息里,告诉我们,要去设置external_url并启动服务才能访问
[root@localhost ~]# rpm -i gitlab-ce-12.4.2-ce.0.el6.x86_64.rpm
# 修改域名和端口
[root@localhost ~]# vim /etc/gitlab/gitlab.rb
# 重载配置启动GitLab,reconfigure操作需要等待5分钟左右
[root@localhost ~]# gitlab-ctl reconfigure
[root@localhost ~]# gitlab-ctl restart

修改后的gitlab.rb文件

external_url 'http://192.168.216.123:8081'
nginx['listen_port'] = 8081

等GitLab启动起来,浏览器访问http://192.168.216.123:8081/即可看到我们的GitLab服务了。

GitLab添加组、创建用户、创建项目

创建组
点击Create a group就可以创建一个组,这里我取名叫test1_group,再点击Create group按钮。
创建项目
进入刚刚创建的test1_group,再点击New project创建项目,取名test1_project,最后点击Create project按钮创建项目。
创建用户
点击最上面的Admin Area,再点击Users,就进到了用户界面,这里可以添加用户,输入必要信息,其他保持默认即可,点击创建即可。在新创建用户界面右上角有个Edit,可以设置用户的密码。
将新建用户添加到组里
打开刚刚创建的test1_group,点击左侧的Members,在搜索框里搜索刚刚创建的用户,后面有个权限设置,这里无关紧要,后面会说,随便选一个,点击Add to group即可将用户加到组里。

  • Guest:可以创建issue、发表评论,不能读写版本库
  • Reporter:可以克隆代码,不能提交,QA、PM可以赋予这个权限
  • Developer:可以克隆代码、开发、提交、push,普通开发可以赋予这个权限
  • Maintainer:可以创建项目、添加tag、保护分支、添加项目成员、编辑项目,核心开发可以赋予这个权限
  • Owner:可以设置项目访问权限 - Visibility Level、删除项目、迁移项目、管理组成员,开发组组长可以赋予这个权限

源码上传到GitLab仓库

  1. 首先在本地IDEA里创建一个Web项目,只有一个index.html页面
  2. 开启版本控制:点击VCS-Enable Version Control Integration,选择Git
  3. 在项目上右键,选择Git-Add,将代码提交到缓存区
  4. 点击Commit,将代码提交到本地仓库
  5. 此时会提示定义一个远程仓库,我们点击Define remote
  6. 来到GitLab,找到之前创建的test1_project,点击右上角Clone,选择Clone with SSH的地址,粘贴到IDEA中,最后点击Push
  7. 来到GitLab,打开test1_project项目就可以看到刚刚提交的文件了

https://blog.csdn.net/qq_36551991/article/details/110352307

# 解压jdk-8u231-linux-x64.tar.gz到/opt/module/下
[root@localhost ~]# tar -xzvf /opt/software/jdk-8u231-linux-x64.tar.gz -C /opt/module/
# 设置环境变量
[root@localhost ~]# vim /etc/profile
# 添加如下内容到最后
# JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_231
export PATH=$PATH:$JAVA_HOME/bin
# 刷新环境变量
[root@localhost /]# source /etc/profile
# 测试Java环境
[root@localhost /]# java -version
# 下载Jenkins,可能会很慢,我用其他工具下载下来后,再上传到服务器上的
[root@localhost software]# wget http://archives.jenkins-ci.org/redhat-stable/jenkins-2.190.3-1.1.noarch.rpm
# 安装Jenkins
[root@localhost software]# rpm -ivh jenkins-2.190.3-1.1.noarch.rpm
# 修改Jenkins配置,将JENKINS_USER改成root,JENKINS_PORT改成8083(8082端口被GitLab的一个服务占用了)
[root@localhost software]# vim /etc/sysconfig/jenkins
# 告诉jenkins服务,Java服务的位置,将“/opt/module/jdk1.8.0_231/bin/java”加到candidates里面
[root@localhost software]# vim /etc/init.d/jenkins
# 重载jenkins启动配置
[root@localhost software]# systemctl daemon-reload
# 启动Jenkins
[root@localhost software]# systemctl start jenkins

浏览器访问http://192.168.216.123:8083/即可看到Jenkins的界面了,按照提示,需要解锁Jenkins,通过这个地址/var/lib/jenkins/secrets/initialAdminPassword获取密码,输入密码后,因为网络问题,安装插件会很耗时,这里跳过插件安装(选择“选择插件来安装”,然后选择“无”),后面根据需要再安装就行。
创建一个管理员账户,保存并完成,此时就可以看到熟悉的Jenkins界面了。
我们可以利用Role-based Authorization Strategy插件来管理Jenkins用户,如果是高版本的Jenkins,是不需要插件的,因为高版本直接集成进来了。
这里可以添加角色、用户、项目,然后就是给用户添加角色,给角色赋予权限,角色可以访问哪些项目。

Jenkins凭证管理

凭据可以用来存储需要密文保护的数据库密码、Gitlab密码信息、Docker私有仓库密码等,以便Jenkins可以和这些第三方的应用进行交互。
常用的凭证类型有:Username with password(用户密码)和SSH Username with private key(SSH 密钥)。
在这里插入图片描述
在这里插入图片描述

Maven安装和配置

在Jenkins服务器上,我们需要Maven来编译和打包项目,首先安装Maven。

[root@localhost ~]# cd /opt/software/
# 下载Maven
[root@localhost software]# wget https://dlcdn.apache.org/maven/maven-3/3.8.5/binaries/apache-maven-3.8.5-bin.tar.gz --no-check-certificate
# 解压Maven
[root@localhost software]# tar -zxvf apache-maven-3.8.5-bin.tar.gz -C /opt/module/
# 配置环境变量
[root@localhost software]# vim /etc/profile
# 使环境变量生效
[root@localhost software]# source /etc/profile
# 测试Maven是否安装成功
[root@localhost software]# mvn -v

在/etc/profile文件的最后加上如下内容:

# JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_231
# MAVEN_HOME
export MAVEN_HOME=/opt/module/apache-maven-3.8.5
# 将JAVA_HOME和MAVEN_HOME加到PATH里
export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin

让Jenkins关联JDK和Maven,Manage Jenkins-Global Tool Configuration-JDK-Add JDK,填入Name和JAVA_HOME的值,同理,在下面的Maven也是填入Name和MAVEN_HOME的值,取消勾选Install automatically,最后保存。
添加全局变量,Manage Jenkins-Config System-Global properties,添加3个全局变量。
在这里插入图片描述

Tomcat安装和配置

[root@localhost ~]# cd /opt/software/
# 下载Tomcat
[root@localhost software]# wget https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.78/bin/apache-tomcat-8.5.78.tar.gz --no-check-certificate
# 解压缩
[root@localhost software]# tar -zxvf apache-tomcat-8.5.78.tar.gz -C /opt/module/
# 启动Tomcat
[root@localhost ~]# cd /opt/module/apache-tomcat-8.5.78/bin/
[root@localhost bin]# ./startup.sh
# 此时访问8080会发现访问不到,好像是其台服务把8080给占用了,进入conf/server.xml,将8080端口改成8085就可以访问了

配置Tomcat角色权限
默认情况下,Tomcat是没有配置用户角色权限的,点击这里,会提示403错误,但是后序Jenkins部署到Tomcat,需要用到Tomcat的用户,所以修改Tomcat的tomcat-users.xml配置文件,添加用户及权限,这里添加了一个用户名、密码是tomcat的用户,并赋予它一些角色。
在这里插入图片描述

<tomcat-users><role rolename="tomcat"/><role rolename="role1"/><role rolename="manager-script"/><role rolename="manager-gui"/><role rolename="manager-status"/><role rolename="admin-gui"/><role rolename="admin-script"/><user username="tomcat" password="tomcat" roles="manager-gui,manager-script,tomcat,admin-gui,admin-script"/>
</tomcat-users>

修改context.xml文件,注释掉Value这一行。

<!--
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
-->

重启Tomcat后,访问http://192.168.216.123:8085/manager/html,输入刚才添加的用户名和密码(这里都是tomcat),就可以看到管理界面了。

Jenkins构建Maven项目

Jenkins中自动构建类型有很多,常用的有以下三种:

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

自由风格项目构建

拉取代码

在Jenkins里,新建一个FreeStyle Project。Source Code Management选择从GitLab拉取代码,并指定Credentials。

编译打包

在Build里找到Add build step,选择“Execute shell”,并输入以下内容,Apply,Save。

echo "开始编译和打包"
mvn clean package
echo "编译和打包结束"

部署

需要安装Deploy to container插件,添加Tomcat用户凭证(用户名密码都是tomcat)。
在这里插入图片描述
再回到FreeStyle Project的配置里,找到Post-build Actions,选择“Deploy war/ear to a container”,填写Tomcat URL。
在这里插入图片描述
最后,试一下Build Now。

Maven项目构建

首先需要安装一个Maven Integration的插件,然后创建一个Maven项目。设置好Source Code Management,和FreeStyle Project不同的是,在Build里需要指定pom.xml并设置Maven命令,在Goals and options里输入clean package。在Post-build Actions里选择Deploy war/ear to a container,指定war和Context path,最后保存并开始构建,查看结果。
在这里插入图片描述

Pipeline流水线项目构建

Pipeline,简单来说,就是一套运行在Jenkins上的工作流框架,将原来独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排和可视化的工作。
Pipeline脚本是由Groovy语言实现的,但是我们没必要单独去学习Groovy
Pipeline支持两种语法:Declarative(声明式)和Scripted Pipeline(脚本式)语法
Pipeline也有两种创建方法:可以直接在Jenkins的Web UI界面中输入脚本;也可以通过创建一个Jenkinsfile脚本文件放入项目源码库中(一般我们都推荐在Jenkins中直接从源代码控制(SCM)中直接载入Jenkinsfile Pipeline这种方法)
Declarative声明式-Pipeline

pipeline {agent anystages {stage('拉取代码') {steps {echo '拉取代码'}}stage('编译构建') {steps {echo '编译构建'}}stage('项目部署') {steps {echo '项目部署'}}}
}

点击Build Now,就完成了一个Pipeline项目的构建,要想看到Pipeline视图,还需要安装一个Pipeline: Stage View的插件。
Scripted Pipeline脚本式-Pipeline

node {def mvnHomestage('Preparation') { // for display purposes// Get some code from a GitHub repositorygit 'https://github.com/jglick/simple-maven-project-with-tests.git'// Get the Maven tool.// ** NOTE: This 'M3' Maven tool must be configured// **       in the global configuration.mvnHome = tool 'M3'}stage('Build') {// Run the maven buildwithEnv(["MVN_HOME=$mvnHome"]) {if (isUnix()) {sh '"$MVN_HOME/bin/mvn" -Dmaven.test.failure.ignore clean package'} else {bat(/"%MVN_HOME%\bin\mvn" -Dmaven.test.failure.ignore clean package/)}}}stage('Results') {junit '**/target/surefire-reports/TEST-*.xml'archiveArtifacts 'target/*.jar'}
}

node代表一个Jenkins结点,Master或者是Agent,是执行Step的具体运行环境,后续Jenkins的Master-Slave架构会用到。
Stage代表一个阶段,Pipeline执行可以划分为多个Stage,每个Stage代表一组操作,比如:Build、Test、Deploy,Stage是一个逻辑分组的概念。
Step代表一个步骤,是最基本的操作单元,可以是一个Shell脚本命令。
在Pipeline项目里,有一个Pipeline语法的超链接,点击过去,可以看到有一些常用的Steps,我们可以选择对应的模板,填充上需要的参数,这个Step就生成了,对于不会Pipeline语法的人来说,还是比较方便的。

拉取代码

在这里插入图片描述

编译打包

在这里插入图片描述

部署

在这里插入图片描述
将脚本复制出来。放到Pipeline脚本里的steps里,应用,保存。
最终的脚本如下:

pipeline {agent anystages {stage('pull code') {steps {checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: 'e689f397-c855-4783-9600-b990ea39ab83', url: 'git@192.168.216.123:test1_group/test1_project.git']]])}}stage('build projct') {steps {sh 'mvn clean package'}}stage('deploy project') {steps {deploy adapters: [tomcat8(credentialsId: 'f6769281-ec81-4b0b-bf5e-8921f8e7e67a', path: '', url: 'http://192.168.216.123:8085/')], contextPath: null, war: 'target/*.war'}}}
}

最后,应用,保存,Build Now进行测试。

Pipeline Script from SCM

在Jenkins里编写脚本,不方便维护,有一种方式款已解决这个问题,那就是把Pipeline Script放到项目里,用版本控制来跟踪记录。
在项目根目录新建一个Jenkinsfile文件,文件名是Jenkinsfile,将刚才的内容复制进来,提交代码后,来到Jenkins。
在这里插入图片描述
Apply,Save,Build Now,进行测试。

常见的构建触发器

Jenkins有4种构建触发器:

  • 触发远程构建
  • 其他工程构建后触发(Build after other projects are build)
  • 定时构建(Build periodically)
  • 轮询SCM(Poll SCM)

触发远程构建

打开一个项目的配置,找到Build Triggers,勾选“Trigger builds remotely”,并输入一个Authentication Token,也就是一个加密串,Apply,Save。
在这里插入图片描述
然后浏览器通过访问JENKINS_URL/job/pipeline01/build?token=TOKEN_NAME,注意把JENKINS_URL换成Jenkins的地址,把TOKEN_NAME换成刚才设置的加密串,把就可以发起一个Jenkins项目的构建。

其他工程构建后触发

找到Build Trigger,选择“Build after other projects are build”,输入其他项目的项目名,Apply,Save。
在这里插入图片描述

定时构建

定时构建,就需要我们配置一个表达式,Jenkins就会按照规则进行定时构建。找到Build Trigger,勾选“Build periodically”,这里以每分钟构建一次为例,Apply,Save。
在这里插入图片描述

轮询SCM

意思是Jenkins定时扫描代码仓库是否有变更,如果有变更,自动触发一次构建,但是这种方式对系统的开销比较大,不建议使用。
在这里插入图片描述

Git hook自动触发构建

前面介绍的轮询SCM方式,对系统开销比较大,不建议使用,其实还有其他的方案,可以在push代码后,自动触发构建操作,那就是利用GitLab的webhook来实现。
它们的区别是:
轮询SCM:Jenkins每隔多久去问GitLab:你那边有没有代码变动
webhook:GitLab代码变更后,通知Jenkins:你该触发构建了
首先需要安装:GitLab Hook插件。
找到Build Triggers,勾选新出现的这个选项,其他默认就可以,这里需要记住webhook URL,Apply,Save。
在这里插入图片描述
使用root登录GitLab,依次点击:Admin Area-Settings-Network,勾选“Allow requests to the local network from web hooks and services”,最后Save changes。
在这里插入图片描述
给项目添加webhook,依次点击项目-Settings-Integrations,输入刚才的webhook URL,最后Save changes。
在这里插入图片描述
再来到Jenkins里,Manage Jenkins-Configure System,取消“Enable authentication for ‘/project’ end-point”的勾选,Apply,Save。
来到刚才GitLab添加webhook的地方,找到Test,模拟发送一个Push事件,此时Jenkins里的项目就可以构建了,说明配置成功。

Jenkins的参数化构建

在这里插入图片描述
这里定义的参数,可以在Pipeline Script里使用,将'*/master'换成'*/${branch}',这里的${branch}就是动态的了。

配置邮箱服务器发送构建结果

安装Email Extension和Email Extension Template插件。设置邮箱相关参数:Manage Jenkins-Configure System。
设置发件人:
在这里插入图片描述
设置插件信息:
在这里插入图片描述
设置发件人的SMTP地址和密码等信息:
在这里插入图片描述
最下面有一个Test configuration,可以点一下试试,如果配置正确的话,可以成功发出邮件的。
对应Pipeline Script,这里用到的是post标签,关于post,可以在Pipeline Syntax-Declarative Directive Generator,选择“post: Post Stage or Build Conditions”,可以根据一些条件生成post语法。
在Pipeline Syntax-片段生成器,选择“emailext: Extended Email”,可以生成一些脚本。

pipeline {agent anystages {stage('pull code') {steps {checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: 'e689f397-c855-4783-9600-b990ea39ab83', url: 'git@192.168.216.123:test1_group/test1_project.git']]])}}stage('build projct') {steps {sh 'mvn clean package'}}stage('deploy project') {steps {deploy adapters: [tomcat8(credentialsId: 'f6769281-ec81-4b0b-bf5e-8921f8e7e67a', path: '', url: 'http://192.168.216.123:8085/')], contextPath: null, war: 'target/*.war'}}}post {always {emailext(subject: '构建通知:${PROJECT_NAME} - Build # ${BUILD_NUMBER} - ${BUILD_STATUS}!',body: '${FILE,path="email.html"}',to: '收件人的邮箱')}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/222350.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实力强的大模型都有哪些超能力?

实力强的大模型都有哪些超能力&#xff1f; 前几日&#xff0c;人工智能研究公司OpenAI CEO山姆奥特曼&#xff08;Sam Altman&#xff09;在谈及人工智能这项技术的潜力以及人们对它的担忧时&#xff0c;曾表示“AI发展速度快得吓人&#xff0c;就像停不下来的龙卷风。”可见&…

软件测试:最强面试题整理出炉附答案,一点点小总结,建议收藏

一、Web自动化测试 1.Selenium中hidden或者是display &#xff1d; none的元素是否可以定位到&#xff1f; 不能,可以写JavaScript将标签中的hidden先改为0&#xff0c;再定位元素 2.Selenium中如何保证操作元素的成功率&#xff1f;也就是说如何保证我点击的元素一定是可以点…

CMU\谷歌等最新研究综述:面向通用机器人的基础模型

构建能够在任何环境中无缝操作、使用各种技能处理不同物体和完成多样化任务的通用机器人&#xff0c;一直是人工智能领域的长期目标。然而&#xff0c;不幸的是&#xff0c;大多数现有的机器人系统受到限制——它们被设计用于特定任务、在特定数据集上进行训练&#xff0c;并在…

deCasteljau 递推

递推函数 P i r ( t ) ( 1 − t ) P i r − 1 ( t ) t P i 1 r − 1 ( t ) &#xff0c; \begin{equation} \bm{P}_{i}^r (t) (1-t) \bm{P}_{i}^{r-1} (t) t \bm{P}_{i1}^{r-1} (t)&#xff0c; \end{equation} Pir​(t)(1−t)Pir−1​(t)tPi1r−1​(t)&#xff0c;​​ …

在ClickHouse数据库中启用预测功能

在这篇博文中&#xff0c;我们将介绍如何将机器学习支持的预测功能与 ClickHouse 数据库集成。ClickHouse 是一个快速、开源、面向列的 SQL 数据库&#xff0c;对于数据分析和实时分析非常有用。该项目由 ClickHouse&#xff0c; Inc. 维护和支持。我们将探索它在需要数据准备以…

Java对接腾讯多人音视频房间回调接口示例

在前面我们已经对接好了腾讯多人音视频房间相关内容&#xff1a;Java对接腾讯多人音视频房间示例 为了完善业务逻辑&#xff0c;我们还需要对接它的一些回调接口 官方文档地址 主要就下面这些 这里因为比较简单直接上代码 里面有些工具类和上一章一样这里就没贴&#xff0c;需要…

【高效开发工具系列】eclipse部署web项目

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

15张超级有用的电商模版

电商即电子商务(Electronic Commerce) &#xff0c;是利用计算机技术、网络技术和远程通信技术&#xff0c;实现电子化、数字化和网络化的整个商务过程。本专题包含电商运营策略、电商平台底层逻辑、营销流程设计等模板内容。 如果你是一个电商小白&#xff0c;你需要以下的电…

大型医院PACS系统源码,影像存储与传输系统源码,支持多种图像处理及三维重建功能

PACS系统是医院影像科室中应用的一种系统&#xff0c;主要用于获取、传输、存档和处理医学影像。它通过各种接口&#xff0c;如模拟、DICOM和网络&#xff0c;以数字化的方式将各种医学影像&#xff0c;如核磁共振、CT扫描、超声波等保存起来&#xff0c;并在需要时能够快速调取…

Enge问题解决教程

目录 解决问题的一般步骤&#xff1a; 针对"Enge问题"的具体建议&#xff1a; 以下是一些普遍适用的解决问题的方法&#xff1a; 以下是一些更深入的Enge浏览器问题和解决办法&#xff1a; 浏览器性能问题&#xff1a; 浏览器插件与网站冲突&#xff1a; 浏览…

新型智慧视频监控系统:基于TSINGSEE青犀边缘计算AI视频识别技术的应用

边缘计算AI智能识别技术在视频监控领域的应用有很多。这项技术结合了边缘计算和人工智能技术&#xff0c;通过在摄像头或网关设备上运行AI算法&#xff0c;可以在现场实时处理和分析视频数据&#xff0c;从而实现智能识别和分析。目前来说&#xff0c;边缘计算AI视频智能技术可…

Leetcode 45 跳跃游戏 II

题意理解&#xff1a; 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。 还是从初始坐标i0的位置到达最后一个元素&#xff0c;但是问题不是能不能跳到&#xff0c;而是最少几步能跳到最后一个元素。 目标&…

Java|IDEA 中添加编译参数 --add-exports

方法1 File > Settings > Build, Execution, Deployment > Compiler > Java Compiler > Javac Options > Override compiler parameters per-module 点击&#xff1a; 点击OK 双击Compliation options&#xff0c;输入后回车&#xff1a; 方法2 找到出错…

阻塞 IO(BIO)

文章目录 阻塞 IO(BIO)模型等待队列头init_waitqueue_headDECLARE_WAIT_QUEUE_HEAD 等待队列项使用方法驱动程序应用程序模块使用参考 阻塞 IO(BIO) 模型 等待队列是内核实现阻塞和唤醒的内核机制。 等待队列以循环链表为基础结构&#xff0c;链表头和链表项分别为等待队列头和…

27、ResNet50处理STEW数据集,用于情感三分类+全备的代码

1、数据介绍 IEEE-Datasets-STEW:SIMULTANEOUS TASK EEG WORKLOAD DATASET &#xff1a; 该数据集由48名受试者的原始EEG数据组成&#xff0c;他们参加了利用SIMKAP多任务测试进行的多任务工作负荷实验。受试者在休息时的大脑活动也在测试前被记录下来&#xff0c;也包括在其…

【SpringBoot】之Security进阶使用

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《SpringBoot开发之Security系列》。&#x1f3af…

变分自动编码器【03/3】:使用 Docker 和 Bash 脚本进行超参数调整

一、说明 在深入研究第 1 部分中的介绍和实现&#xff0c;并在第 2 部分中探索训练过程之后&#xff0c;我们现在将重点转向在第 3 部分中通过超参数调整来优化模型的性能。要访问本系列的完整代码&#xff0c;请访问我们的 GitHub 存储库在GitHub - asokraju/ImageAutoEncoder…

直播电商“去网红化”势在必行,AI数字人打造品牌专属IP

近年来&#xff0c;网红直播带货“翻车”事件频发&#xff0c;给品牌商带来了信任危机和负面口碑的困扰&#xff0c;严重损害了企业的声誉。这证明强大的个人IP,对于吸引粉丝和流量确实能起到巨大的好处,堪称“金牌销售”,但太过强势的个人IP属性也会给企业带来一定风险&#x…

计算机网络:应用层

0 本节主要内容 问题描述 解决思路 1 问题描述 不同的网络服务&#xff1a; DNS&#xff1a;用来把人们使用的机器名字&#xff08;域名&#xff09;转换为 IP 地址&#xff1b;DHCP&#xff1a;允许一台计算机加入网络和获取 IP 地址&#xff0c;而不用手工配置&#xff1…

回顾丨2023 SpeechHome 第三届语音技术研讨会

下面是整体会议的内容回顾&#xff1a; 18日线上直播回顾 18日上午9:30&#xff0c;AISHELL & SpeechHome CEO卜辉宣布研讨会开始&#xff0c;并简要介绍本次研讨会的筹备情况以及报告内容。随后&#xff0c;CCF语音对话与听觉专委会副主任、清华大学教授郑方&#xff0c…