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

Jenkins部署与自动化构建

Jenkins笔记

一、安装Jenkins

docker 安装 Jenkins

  1. 拉取稳定版Jenkins镜像

    注意: docker拉取镜像的时候要拉取 jenkins/jenkins 而不是jenkins 要装稳定版,否则后面会有很多插件装不上

    docker pull jenkins/jenkins:lts
    
  2. 挂载对应的容器卷

    #给需要挂载的文件夹授权
    mkdir jenkins_home
    chmod 777 /docker/jenkins_home/#启动容器
    docker run -d -p 8090:8080 -p 8091:50000 --privileged=true --name jenkins_8090 -v /docker/jenkins_home:/var/jenkins_home -v /etc/localtime:/etc/localtime 55860ee0cd73-d 后台运行镜像
    -p 8090:8080 将镜像的8080端口映射到服务器的8090端口。
    -p 8091:50000 将镜像的50000端口映射到服务器的8091端口
    -v /data/jenkins_home:/var/jenkins_home /var/jenkins_home目录为容器jenkins工作目录,我们将硬盘上的一个目录挂载到这个位置,方便后续更新镜像后继续使用原来的工作目录。这里我们设置的就是上面我们创建的 /data/jenkins_home目录
    -v /etc/localtime:/etc/localtime让容器使用和服务器同样的时间设置。
    –name jenkins_8090 给容器起一个别名
    http://mirror.esuni.jp/jenkins/updates/update-center.json
    
  3. 修改插件下载镜像源为清华镜像(可以先直接尝试一下是否可以安装成功)

    # 修改xml
    vim jenkins_home/hudson.model.UpdateCenter.xml 
    #将 <url>https://updates.jenkins.io/update-center.json</url>替换为 <url>http://mirror.esuni.jp/jenkins/updates/update-center.json</url>
    http://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json# 修改jenkins/updetes/default.json文件
    ①把:“http://www.google.com/” 改成 “http://www.baidu.com/”
    ②把:“https://updates.jenkins.io/download” 全部替换成 “http://mirrors.tuna.tsinghua.edu.cn/jenkins”sed -i 's#https://updates.jenkins.io/download#https://mirrors.tuna.tsinghua.edu.cn/jenkins#g' default.json
    sed -i 's#https://www.google.com#https://www.baidu.com#g' default.jsonsed -i 's#https://updates.jenkins.io/download#https://mirrors.huaweicloud.com/jenkins#g' default.json && sed -i 's#http://www.google.com#https://www.baidu.com#g' default.json http://ip:9090/pluginManager/advanced
    https://cdn.jsdelivr.net/gh/jenkins-zh/update-center-mirror/tsinghua/current/update-center.json# 重启服务docker stop jenkins_8090docker start jenkins_8090 
  4. 访问web页面 http://IP:8090/

  5. 去查看第一次登录的密码

    #查看输出日志
    docker logs jenkins_8090#在日志中会有一段密码
    Jenkins initial setup is required. An admin user has been created and a password generated.
    Please use the following password to proceed to installation:800c8b5201284979a1ea16c1893358d5This may also be found at: /var/jenkins_home/secrets/initialAdminPassword#或者也可以去它上面给的地址中查看密码
    将密码填入上面的文本框中
    
  6. 等待一会后,开始安装插件

    我这里选择的是按照推荐安装在这里插入图片描述

  7. 后续需要通过maven来构建我们的项目,所以需要在容器内安装mavne

    # 将maven下载好后解压
    unzip /mavne/apache-maven-3.8.6 -d ./# 修改maven的镜像源
    vim /mavne/apache-maven-3.8.6/conf/setting.xml#将里面的镜像换为阿里云镜像
    <mirror>  
    <id>alimaven</id>              
    <name>aliyun maven</name>  
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>  
    <mirrorOf>central</mirrorOf>          
    </mirror>#增加软连接 (不需要进入到原来的路径也可以验证Maven安装)
    ln -s /maven/apache-maven-3.8.6/bin/mvn /usr/local/bin/mvn#验证是安装成功
    mvn -v 

Java启动war包直接安装

  1. 下载适合的war包 https://mirrors.jenkins.io/war-stable/

    我这里用的jdk1.8 所以下载的版本为jenkins 2.346.1

  2. 利用java命令启动

    touch temp.txt
    # 这种方式会在后台运行 不会被关闭
    nohup java -jar jenkins.war --httpPort=8090 >temp.txt &
    
  3. 访问 ip:8090 后续操作同上4⃣️

二、配置maven+Git自动构建jar包

  1. 安装maven插件

    在这里插入图片描述

    安装好后进入新增item,出现小猫头鹰即安装成功

在这里插入图片描述

  1. 创建一个任务

    在这里插入图片描述

  2. 选择Git ,此时下面会提示git连接错误

    在这里插入图片描述

    可以配置下凭证

    在这里插入图片描述

  3. 安装git

    yum install -y git
    # 安装完毕后验证一下
    git --verison
    
  4. 设置需要构建的分支

    在这里插入图片描述

  5. 配置maven路径

    在这里插入图片描述

    配置安装的maven路径

    在这里插入图片描述

  6. 设置需要构建的pom文件路径

    在这里插入图片描述

  7. 保存后开始构建

    在这里插入图片描述

    可以在构建中看到控制台输出(记得将maven的镜像地址换成阿里云地址

    在这里插入图片描述

三、自动化发布到测试服务器运行

  1. 安装服务器连接插件 Publish Over SSH

    在这里插入图片描述

  2. 进入配置后管理界面

    在这里插入图片描述

    在这里插入图片描述

    选择这个选项

  3. 配置测试服务器连接

    因为我们需要增加一台远程服务器,所以我们需要做一些配置信息

    在这里插入图片描述

    在这里插入图片描述

  4. 添加一台远程服务器

    在这里插入图片描述

  5. 此时在原先的地方就有了我们刚添加的服务器

    在这里插入图片描述

    配置相关数据

    1. 构建前Pre Steps

    在这里插入图片描述

    构建后Post Steps

    在这里插入图片描述

超时机制

  1. 启动脚本问题会导致超时,从而导致启动不成功

    可以设置超时时间为0 这样就可以不会因为超时而不成功

nohup java -jar /jenkins/build_jar/first1/*.jar &
# 这条语句会超时,原因是因为没有指明日志输出到哪里,控制台会一直等待#修改为如下
nohup java -jar /jenkins/build_jar/first1/*.jar >/jenkins/build_jar/first1/mylog.log 2>&1 &# 也可以简化为
nohup java -jar /jenkins/build_jar/first1/*.jar &>/jenkins/build_jar/first1/mylog.log  &

数据流重定向

数据流重定向就是将某个命令执行后应该要出现在屏幕上的数据传输到其他地方

# 标准输入:代码为0,使用<或者<<
# 标准输出:代码为1,使用>或者>>
# 标准错误输出:代码为2,使用2>或者2>>
# 若以>输出到一个已存在的文件中,那么这个文件会被覆盖
# > 覆盖写
# >> 追加写

编写清理Shell脚本

jps|grep -v Jps|awk '{print $1}'#将 xxxx写入xxx.txt
echo "xxxx">xxx.txt#!/bin/bash#获取程序运行的pid
ps -ef|grep jenkins_demo #会获取到两条记录 有一条是grep的数据#利用grep -v 再次过滤 grep -v 需要过滤掉的信息
ps -ef|grep jenkins_demo|grep -v grep#利用grep '需要的信息' 进行过滤
ps -ef|grep jenkins_demo|grep 'SNAPSHOT'#获取打印出来的信息的第二列数据PID
`ps -ef|grep jenkins_demo|grep 'SNAPSHOT'|awk '{printf $2}'`

部署前shell操作(删除原来的包,同时关闭上一次运行的pid)

#!/bin/bash
#删除原来的包
rm -rf /jenkins/build_jar/first1#传入一个参数
appname=$1
if [ -z $appname ]
thenappname='jenkins_demo'
fi
echo $appname#获取pid
pid=`ps -ef | grep $appname | grep 'java -jar' | awk  '{printf $2}'`echo $pid#如果pid为空的话,提示一下,否则执行kill命令
if [ -z $pid ]
#使用-z来判断是否是空值
thenecho "$appname not started"
elsekill -9 $pidecho "$appname stoping..."
fi#再次精准匹配 查看是否已经kill完 -w是精准匹配
check=`ps -ef|grep -w $pid |grep java`
if [ -z $check ]
thenecho "$appname pid:$pid is stop"
elseecho "$appname stop Failed"
fi
  1. 配置构建前执行shell脚本

    在这里插入图片描述

  2. 此时构建的话,Jenkins会自动帮我们删除以前的版本数据,同时kill掉以前运行的pid

四、构建触发器

触发器可以通过一些事件触发Jenkins的自动构建,如:上传代码,合并代码等。

1. 生成API token

  • 1.1 进入jenkins安全设置,开启安全域及授权策略

    配置开启

    在这里插入图片描述

  • 1.2 生成api token

    在这里插入图片描述

2. Jenkins项目配置触发器

  • 2.1 选择测试项目-配置-构建触发器,选择触发远程构建,将token粘贴在身份验证令牌处,保存

    在这里插入图片描述

  • 2.2 通过访问 JENKINS_URL/job/first/build?token=TOKEN_NAME 观察项目是否进入构建队列

3. 远程Git仓库配置WebHooks

(GitLab GitHub)同理

  • 3.1在Jenkins中安装Gitee插件(同上)

  • 3.2在项目设置中配置Gitee令牌地址等

    在这里插入图片描述

    在这里插入图片描述

  • 3.3增加webHooks管理

    在这里插入图片描述

  • 3.4添加post地址和token 这里的地址直接用上面Jenkins的链接,token则是刚才生成的密码

    在这里插入图片描述

  • 3.5尝试重新上传代码,可以发现现在会自动触发构建

    在这里插入图片描述

4. 几种构建方式

在这里插入图片描述

1、快照依赖构建/Build whenever a SNAPSHOT dependency is built

  • 当依赖的快照被构建时执行本job

2、触发远程构建 (例如,使用脚本)

  • 远程调用本job的restapi时执行本job

3、job依赖构建/Build after other projects are built

  • 当依赖的job被构建时执行本job

4、定时构建/Build periodically

  • 使用cron表达式定时构建本job

5、向GitHub提交代码时触发Jenkins自动构建/GitHub hook trigger for GITScm polling

  • Github-WebHook出发时构建本job

6、定期检查代码变更/Poll SCM

  • 使用cron表达式定时检查代码变更,变更后构建本job

5. 定期构建cron表达式

在构建中Build periodically与Poll SCM接收的参数都是cron表达式

与标准的cron表达式不同,没有秒字段

cron表达式网站

第一个 * 表示每个小时的第几分钟,取值0~590 */1 * * *
H:每小时0分执行一次第二颗 * 表示小时,取值0~23* 15 * * * 表示每天下午3点
* 1 * * *  表示每天凌晨1点第三颗 * 表示一个月的第几天,取值1~31
* 1 5 * *  表示每月5日凌晨1点第四颗 * 表示第几月,取值1~12
* 15 5 1 *  表示每年一月5日15时的每一分钟执行第五颗 * 表示一周中的第几天,取值0~7,其中0和7代表的都是周日

H (hash散列)

  • hash散列值,以job名取值,获取到以job名为入参的唯一值,相同名称值也相同,这个偏移量会和实际时间相加,获得一个真实的运行时间。

  • 意义在于:不同的项目在不同的时间运行,即使配置的值是一样的,比如 都是15 * * * * ,表示每个小时的第15分钟开始执行任务,那么会造成同一时间内在Jenkins中启动很多job,换成H/15 * * * *,那么在首次启动任务时,会有随机值参与进来,有的会在17分钟启动 有的会在19分钟启动,随后的启动时间也是这个值。这样就能错开相同cron值的任务执行减轻同一时间拉起的Job太多

  • H的值也可以设置范围

  • H * * * *表示一小时内的任意时间*/10 * * * *每10分钟H/10 * * * *每10分钟,可能是7,17,27,起始时间定hash,后续不会变45 3 * * 1-6 每个周一至周六,凌晨3点45 执行1次45 3-5 * * 1-6 每个周一至周六,凌晨3点45 ,凌晨4点45,凌晨5点45 各执行1次H(40-48) 3-5 * * 1-6 在40~48之间取值 其他同上45 3-5/2 * * 1-6 每个周一至周六,凌晨3点45 ,凌晨5点45 各执行1次45 0-6/2 * * * 0点开始,6点结束,每间隔2小时执行一次 0:45、2:45、4:45、6:45
  • 如图 配置后会每天凌晨两点的某一分钟为我们构建 H 2 * * *

    在这里插入图片描述

6. Poll SCM(轮询)

​ 这个是由Jenkins服务发起对远程git仓库的访问,比较配置的分支上是否有新的内容,如果有则会发起一次构建,轮询频率控制是通过cron表达式控制。

在这里插入图片描述

五、配置邮箱接收构建信息

1. 设置管理员邮箱(发件邮箱)

  • 1.1 登录163邮箱,进入邮箱协议设置

    在这里插入图片描述

  • 1.2 获取授权密码(ZSJRNM*********)

    在这里插入图片描述

2. Jenkins邮件设置配置

  • 在管理界面Configure System中

    在这里插入图片描述

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G2Cr5m0K-1680142247362)(/Users/lvhao/zixuexi/git学习/practice-and-learning/笔记/云原生/图片/邮件配置2.png)]

    在这里插入图片描述

    在这里插入图片描述

    此时可以点击下面的发送邮件测试是否能成功发送

    在这里插入图片描述

  • 在项目管理里配置构建后邮件通知

  • 重新构建项目,可以看到已经有短信通知了

3.邮件设置中的坑

  1. 点击发送测试信息的时候,提示**AuthenticationFailedException: 550 User has no permission**错误

    那就是授权出现了错误,此时就需要重新获取授权码再授权一次,但记得邮箱设置页面中已获得授权的设备一定要记得删除,防止自己的邮箱账号被盗

  2. 点击发送测试信息的时候,提示MailConnectException: Couldn't connect to host, port: smtp.163.com, 25; timeout 60000;

    这个话是因为可能你使用的是Linux服务器,防火墙25端口没有开,有两种解决办法

    1.开启防火墙25端口

    注意:如果你和我一样使用的为阿里云服务器的话,阿里云为了安全考虑默认是关闭25端口的,如果你想要开启的话需要提交申请审批,大概需要3-5天

    2.使用SSL协议号

    • 下面配上网易163邮箱的相关服务器信息:

      在这里插入图片描述

    我这里使用的是465端口,同时启用SSL协议

  3. 点击发送测试信息的时候,提示MessagingException: Got bad greeting from SMTP host: smtp.163.com, port: 465, response: [EOF],则查看使用的端口是否需要使用SSL协议

    在这里插入图片描述

  4. 用来发送的邮箱要和管理员设置的邮箱一致

    在这里插入图片描述

    这样就可以开开心心的发邮件啦!以上这些坑不幸的我都踩到了😭

在这里插入图片描述

相关文章:

Jenkins部署与自动化构建

Jenkins笔记 文章目录Jenkins笔记[toc]一、安装Jenkinsdocker 安装 JenkinsJava启动war包直接安装二、配置mavenGit自动构建jar包三、自动化发布到测试服务器运行超时机制数据流重定向编写清理Shell脚本四、构建触发器1. 生成API token2. Jenkins项目配置触发器3. 远程Git仓库配…...

网络编程三要素

网络编程三要素 IP、端口号、协议 三要素分别代表什么 ip&#xff1a;设备在网络中的地址&#xff0c;是唯一的标识 端口号&#xff1a;应用程序在设备中的唯一标识 协议&#xff1a;数据在网络中传输的规则 常见的协议有UDP、TCP、http、https、ftp ip&#xff1a;IPv4和…...

如何编写一个自己的web前端脚手架

脚手架简介 脚手架是创建前端项目的命令行工具&#xff0c;集成了常用的功能和配置&#xff0c;方便我们快速搭建项目&#xff0c;目前网络上也有很多可供选择的脚手架。 一个"简单脚手架"的构成其实非常少&#xff0c;即 代码模板 命令行工具。其中代码模板是脚手…...

计算机网络第1章(概述)

文章目录1.1、计算机网络在信息时代的作用1.2、因特网概述1、网络、互连网&#xff08;互联网&#xff09;和因特网2、因特网发展的三个阶段3、因特网的标准化工作4、因特网的组成1.3 三种交换方式1、电路交换&#xff08;Circuit Switching&#xff09;2、分组交换&#xff08…...

grid布局

一、概述 CSS Grid 布局是 CSS 中最强大的布局系统。与 flexbox 的一维布局系统不同&#xff0c;CSS Grid 布局是一个二维布局系统&#xff0c;也就意味着它可以同时处理列和行。通过将 CSS 规则应用于 父元素 (成为 Grid Container 网格容器)和其 子元素&#xff08;成为 Gri…...

博客平台打造出色的个人资料管理与展示:实用技巧与代码示例

个人资料管理与展示是博客平台的重要功能之一。本文将通过设计思路、技术实现和代码示例&#xff0c;详细讲解如何构建出色的个人资料管理与展示功能。结合CodeInsight平台的实践案例&#xff0c;帮助您深入了解个人资料管理与展示的设计原则和技术实现。 一、设计思路 在设计…...

【genius_platform软件平台开发】第九十三讲:串口通信(485通信)

485通信1. 485通信1.1 termios结构1.2 头文件1.3 函数讲解1.3.1 tcgetattr1.3.2 tcsetattr1.4 示例工程1.5 参考文献1.5.1 stty命令1.5.2 命令格式1.5.2 microcom命令1.5.2.1介绍1.5.2.2指令1.5.3 echo命令1.5.3.1 语法1.5.3.2 选项列表1.5.3.3 使用示例1.5.3.4 e cho > 输出…...

JavaScript动画相关讲解

JavaScript是一种非常流行的脚本语言&#xff0c;广泛应用于Web开发、游戏开发、移动应用开发等领域。在Web开发中&#xff0c;动画效果是非常重要的一部分&#xff0c;可以提高网站的用户体验和吸引力。JavaScript提供了一些基本的动画函数&#xff0c;但是这些函数往往不能满…...

InnoSetup制作安装包(EXE)

功能描述 1.666666.war为项目war包&#xff0c;666666.bat为启动war包脚本&#xff0c;通过InnoSetup将它们打包到安装包666666.exe 2.666666.exe安装包安装过程中将666666.bat注册为自启动服务&#xff0c;安装结束自动执行脚本启动项目666666.war --------------------------…...

CASE WHEN函数语句多条件下使用详解

目录 CASE 的两种格式&#xff1a; 简单CASE函数 和 CASE搜索函数 同时配合 SUM 以及 COUNT 方法的使用 ① SUM函数 ② COUNT函数 CASE WHEN函数语句&#xff0c;实现简单CASE函数和CASE搜索函数两种格式。同时配合 SUM以及COUNT方法的使用 CASE 的两种格式&#xff1a; 简…...

2.31、守护进程(2)

2.31、守护进程&#xff08;2&#xff09;1.守护进程的创建步骤2.什么情况下子进程不会继承父进程的组ID3.哪些操作会导致子进程的组ID发生改变4.kill怎么杀掉守护进程的实现守护进程1.守护进程的创建步骤 执行一个 fork()&#xff0c;之后父进程退出&#xff0c;子进程继续执…...

记录上传文件异常 /tmp/tomcat... (No space left on device)

一&#xff0c;问题描述 用postman调用上传接口&#xff0c;基本每两次调用会有一次报错&#xff0c;如下 {"timestamp": "2023-04-11T03:00:15.4690000","status": 500,"error": "Internal Server Error","exceptio…...

无向连通图中长度为 n 的循环

给定一个无向连通图和一个数字 n,计算图中长度为 n 的循环总数。长度为 n 的圈简单地表示该圈包含 n 个顶点和 n 条边。我们必须计算所有存在的此类循环。 示例: 输入:n = 4 输出:总周期数 = 3 解释 :遵循 3 个独特的循环0 -> 1 -> 2 -> 3 -> 0 0 -> 1 …...

打造出ChatGPT的,是怎样一群人?

震惊世界的ChatGPT&#xff0c;要多少人才能开发出来&#xff1f;几百&#xff0c;还是几千&#xff1f; 答案是&#xff1a;87个人。 老实说&#xff0c;刚看到这个数字真是惊到我了&#xff0c;印象里&#xff0c;之前看媒体报道各大巨头人工智能人才储备时&#xff0c;动辄…...

数据结构——栈与队列相关题目

数据结构——栈与队列相关题目232. 用栈实现队列思路225. 用队列实现栈1.两个队列实现栈2.一个队列实现栈20. 有效的括号思路1047. 删除字符串中的所有相邻重复项思路155. 最小栈150. 逆波兰表达式求值思路239. 滑动窗口最大值单调队列347. 前 K 个高频元素思路232. 用栈实现队…...

Redhat6.7离线安装rabbitmq

一、下载资源文件&#xff08;.rpm文件&#xff09; 链接: https://pan.baidu.com/s/1j2Ze_Jjm0oMrP-r95PPCtA?pwdv3is 提取码: v3is 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 创建rabbit文件夹Mkdir rabbit 三、通过ftp上传文件 四、安装erlang环境 …...

EasyCVR平台基于GB28181协议的语音对讲配置操作教程

EasyCVR基于云边端协同&#xff0c;具有强大的数据接入、处理及分发能力&#xff0c;平台可支持海量视频的轻量化接入与汇聚管理&#xff0c;可提供视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、平台级联等功能…...

谷歌发布Self-Debug方法,让大模型学会自己修bug,一次性生成正确代码

文 | 智商掉了一地你有没有想过&#xff0c;让一台计算机诊断和修复自己生成的错误代码&#xff1f;一篇最新的研究论文介绍了一种名为 Self-Debugging 的技术&#xff0c;通过在生成的代码中添加自解释的信息&#xff0c;让计算机像一个可以自己修复代码的程序员一样调试自己的…...

行为型模式-模板方法

行为型模式-模板方法 模板方法(Template Method)解决算法框架问题描述适用环境优点:缺点:违反原则:代码实现模板方法(Template Method) 解决算法框架问题 描述 定义了一个算法的骨架,并将某些步骤延迟到子类中进行实现,从而使得算法的具体实现能够在子类中自由变化…...

正则表达式识别日期

正则表达式识别日期 正则表达式识别各种格式的日期 import redef extract_dates(text):# 正则表达式&#xff0c;用于识别常见的日期格式date_pattern r"""(?P<date>(?P<year_only>\d{4}(?![\d年]))| # …...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...