jenkins 使用教程

1. 安装最新长期稳定版 2.426.1

Redhat Jenkins Packages

sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo --no-check-certificate
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key
yum install -y fontconfig java-11
yum -y install jenkins-2.426.1-1.1.noarch
systemctl enable jenkins
systemctl start jenkins

2. 本地hosts文件解析域名

10.0.0.72 jenkins.tom.com

3. 浏览器访问jenkins.tom.com:8080

[root@jenkins tools]# cat /var/lib/jenkins/secrets/initialAdminPassword
c7c62614a5d74aefae2966ceff362e4a

4. 更改密码

5. 安装插件

安装方式有2种:

1.在线搜索需要的插件进行安装

2.离线安装,把已有的.jpi文件复制到 /var/lib/jenkins/plugins/ 目录下,然后重启Jenkins即可。

用这种方式既可以批量安装插件,安装时又可以忽视插件之间的关联性。若依赖的插件不存在或者存在版本问题,则重启之后会在Manage Jenkins中进行提示,根据提示逐一解决问题即可。如果需要对Jenkins的插件配置进行迁移,直接将plugins文件目录直接替换即可,或者将.jpi复制过去之后直接重启Jenkins即可。

[root@jenkins yum.repos.d]# ll /var/lib/jenkins/plugins/
drwxr-xr-x 4 jenkins jenkins      56 Jul 12 14:35 bouncycastle-api
-rw-r--r-- 1 jenkins jenkins 8853632 Jul 12 14:35 bouncycastle-api.jpi
drwxr-xr-x 4 jenkins jenkins      56 Jul 12 14:35 instance-identity
-rw-r--r-- 1 jenkins jenkins   18216 Jul 12 14:35 instance-identity.jpi
drwxr-xr-x 4 jenkins jenkins      56 Jul 12 14:35 javax-activation-api
-rw-r--r-- 1 jenkins jenkins   77217 Jul 12 14:35 javax-activation-api.jpi
drwxr-xr-x 4 jenkins jenkins      56 Jul 12 14:35 javax-mail-api
-rw-r--r-- 1 jenkins jenkins  632494 Jul 12 14:35 javax-mail-api.jpi
drwxr-xr-x 5 jenkins jenkins      68 Jul 12 14:29 locale
-rw-r--r-- 1 jenkins jenkins   13518 Jul 12 14:29 locale.jpi
drwxr-xr-x 4 jenkins jenkins      56 Jul 12 14:35 localization-support
-rw-r--r-- 1 jenkins jenkins   24084 Jul 12 14:35 localization-support.jpi
drwxr-xr-x 5 jenkins jenkins      70 Jul 12 14:35 localization-zh-cn
-rw-r--r-- 1 jenkins jenkins  569475 Jul 12 14:35 localization-zh-cn.jpi

6. jenkins汉化插件安装

1、主要安装如下插件:Locale、Localization: Chinese (Simplified)

Manage Jenkins --> Manage Plugins --> Available,搜索上面2个插件安装即可

2.重启jenkins,systemctl restart jenkins

7. 常用插件安装

git,git parameter,git hub,gitlab,ansible,docker,maven,Workspace Cleanup

8. 案例:创建一个项目

为了方便jenkins进行操作与管理各种节点,避免出现权限问题。这里把jenkins运行用户改为root

]# egrep "User|Group" /usr/lib/systemd/system/jenkins.service
User=root
Group=root]# systemctl daemon-reload
[root@jenkins yum.repos.d]# systemctl restart jenkins

项目目标:

通过运行jenkins 任务 
提示我们进行: 
选择 
dev  #开发环境 
prod #生产环境 
把选择结果放在变量中choose。 
jenkins执行脚本
case "$choose" in
DEV) echo "部署到测试环境" ;;
PROD) echo "部署到生产环境" ;;
esac 
echo "当前用户:`whoami`"
echo "当前路径: `pwd`"

9. 案例:拉取gitlab仓库代码,根据分支进行拉取代码

10. job内置变量

10.1. jenkins job有一些自带的环境变量,在配置中可以直接引用,这里列出基础参数。

BUILD_NUMBER:当前构建号,如1
BUILD_ID:构建的id编号,一般可为构建号,也可是时间戳(需添加时间戳插件,开启时间记录)
JOB_NAME:当前job名称 如: job-04-game-auto-webhook
BUILD_TAG:本次构建记录,一般标记为jenkins-{JOB_NAME}−{BUILD_NUMBER}
EXECUTOR_NUMBER:执行者编号,在“build executor status”中看到的数字
NODE_NAME:运行的节点名称
NODE_LABELS:运行的节点标签名称
WORKSPACE:job的工作区地址 如:/var/lib/jenkins/workspace/job-04-game-auto-webhook
HUDSON_URL:jenkins的url,如:http://jenkins.tom.com/
JOB_URL:job的url,如:http://jenkins.tom.com/job/job-04-game-auto-webhook/ 
BUILD_URL:构建记录的url,如:http://jenkins.tom.com/job/job-04-game-auto-webhook/7/ ,形式为 http://ip:端口/job/{JOB_NAME}/${BUILD_NUMBER}

10.2. 也可以安装Build Environment插件,可以通过查看历史构建记录得知本次构建的所有参数)

10.3. 如需查看系统环境变量,可在系统管理-系统属性中查询。

11. 案例:拉取gitlab仓库代码,根据tag标签拉取代码

这里jenkins做了免密登录web服务器,以实现代码推送到web服务器

ssh-keygen
ssh-copy-id root@web

ssh root@10.0.0.8 "mkdir -p /app/code-back"
dirname="/app/code-back/game-${git_tag}"
scp -o StrictHostKeyChecking=no -r ${WORKSPACE}  root@10.0.0.8:$dirname
ssh -o StrictHostKeyChecking=no root@10.0.0.8 "rm -rf /app/code/game"
ssh -o StrictHostKeyChecking=no root@10.0.0.8 "ln -s $dirname  /app/code/game"

如果不选参数,会报错

12. 案例:代码上传到测试分支,自动触发jenkins构建部署

注意:不可用于生产环境,如果代码故障会导致生产环境故障

步骤:

  1. jenkins添加gitlab插件
  2. jenkins创建钩子令牌认证
  3. gitlab配置jenkins钩子和令牌
  4. 向gitlab提交代码

12.1. 需要gitlab允许来自钩子和服务的对本地网络的请求,否则会报错误

12.2. jenkins URL设置,否则一会webhook的url是带8080的

12.3. 先记录下刚才jenkins生成的两个数据,gitlab会用

webhook url:  http://jenkins.tom.com/project/job-04-game-auto-webhook
Secret token: 1b061a9f1fa423f086b72882863d5132

12.4. gitlab新建钩子,加上jenkins的webhook地址

看到上面错误,不一定是真的无法完成构建,这里采用手动推送来试试,发现可以触发jenkins构建的。

13. 案例:java项目编译部署

13.1. jenkins服务器安装maven

cd /app/tools
wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz
ln -s apache-maven-3.8.8 maven
echo 'export PATH=/app/tools/maven/bin/:$PATH' >> /etc/profile
source /etc/profile
]# mvn --version
Apache Maven 3.8.8 (4c87b05d9aedce574290d1acc98575ed5eb6cd39)
Maven home: /app/tools/maven
Java version: 11.0.8, vendor: N/A, runtime: /usr/lib/jvm/java-11-openjdk-11.0.8.10-1.el7.x86_64
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-1160.el7.x86_64", arch: "amd64", family: "unix"

13.2. 配置maven仓库地址

vim maven/conf/settings.xml</mirrors><mirror><id>aliyunmaven</id><mirrorOf>*</mirrorOf><name>阿里云公共仓库</name><url>http://maven.aliyun.com/repository/public</url></mirror></mirrors>

13.3. jenkins全局工具配置里面添加maven路径

项目代码:

从gitee克隆一份代码(链接)到本地,然后在自己的gitlab仓库中新建一个项目,把代码上传到仓库

然后jenkins开始创建一个maven job

10.0.0.8上面是web服务器,上面安装了tomcat和jdk,构建完成后,访问10.0.0.8:8080可以可以看到项目已部署成功

14. 案例:java项目编译推送至docker仓库,然后在web服务器运行docker容器

14.1. 步骤:

  1. 代码上传至gitlab
  2. 书写测试dockerfile(只需要代码+docker环境即可)
  3. jenkins创建任务
    1. 拉取代码
    2. 执行构建,shell命令(docker build,docker push)
    3. web机器docker run 镜像
  1. 检测结果

14.2. 环境

gitlab

10.0.0.71

jenkins

10.0.0.72

web1

10.0.0.7

web2

10.0.0.8

docker harbor

10.0.0.81

14.3. jenkins 10.0.0.72 机器安装docker,并配置docker仓库地址

#1.安装相关依赖.
yum install -y yum-utils device-mapper-persistent-data lvm2
#2.下载官方的docker yum源文件
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#3.替换yum源地址
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
#4.安装docker-ce
yum makecache fast
yum -y install docker-ce docker-compose 
systemctl enable --now docker  mkdir -p /etc/docker
tee /etc/docker/daemon.json <<'EOF'
{"registry-mirrors": ["https://bjjtv7cs.mirror.aliyuncs.com"],"insecure-registries": ["harbor.tom.cn"]
}
EOF
systemctl daemon-reload
systemctl restart docker

14.4. docker harbor 安装docker-ce ,docker-compose,harbor

#----------------------------------------------------------------------------------
#1.安装相关依赖.
yum install -y yum-utils device-mapper-persistent-data lvm2
#2.下载官方的docker yum源文件
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#3.替换yum源地址
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
#4.安装docker-ce
yum makecache fast
yum -y install docker-ce docker-compose 
systemctl enable --now docker  mkdir -p /etc/docker
tee /etc/docker/daemon.json <<'EOF'
{"registry-mirrors": ["https://bjjtv7cs.mirror.aliyuncs.com"],"insecure-registries": ["harbor.tom.cn"]
}
EOF
systemctl daemon-reload
systemctl restart docker#----------------------------------------------------------------------------------
mkdir -p /app/tools/
cd /app/tools/
wget https://github.com/goharbor/harbor/releases/download/v2.11.0/harbor-offline-installer-v2.11.0.tgz
tar -xvf harbor-offline-installer-v2.11.0.tgz 
cd harbor
cp harbor.yml.tmpl harbor.yml
#----------------------------------------------------------------------------------
vim harbor.yml
#修改域名
hostname: harbor.tom.cn#注释掉证书配置
#https:
#  # https port for harbor, default is 443
#  port: 443
#  # The path of cert and key files for nginx
#  certificate: /your/certificate/path
#  private_key: /your/private/key/path#修改登录密码
harbor_admin_password: Admin
#----------------------------------------------------------------------------------
./install.sh  
#注意要检查80是否被占用
提示successfully
? ----Harbor has been installed and started 
successfully.----
#----------------------------------------------------------------------------------

14.5. 把代码上传到自己的gitlab仓库

源码:git clone zhrzzzzzzzzz/bird

14.6. web1和web2安装docker,并配置仓库地址(参照jenkins安装docker的过程)

14.7. jenkins新建项目

docker build  -t harbor.tom.cn/prod/nginx_bird:${git_tag} .
docker login -uadmin -padmin harbor.tom.cn
docker push harbor.tom.cn/prod/nginx_bird:${git_tag}
#部署
ansible -i /server/ansible/hosts web -m shell -a"\
docker rm -f bird; \
docker rmi harbor.tom.cn/prod/nginx_bird:${git_tag}; \
docker login -uadmin -padmin harbor.tom.cn; \
docker run -d --name bird -p 80:80 harbor.tom.cn/prod/nginx_bird:${git_tag}"

这里有个问题,如果同样的tag,被推送到harbor仓库以后,再次推送的是推不上相同的tag的,只能删除

这里提供如下方案,在push前,把相同tag的镜像从仓库里删除,再进行推送

HARBOR_URL="harbor.tom.cn"
PROJECT="prod"
REPOSITORY="nginx_bird"
USER="admin"
PASSWORD="admin"
curl -s -X DELETE "http://${HARBOR_URL}/api/v2.0/projects/${PROJECT}/repositories/${REPOSITORY}/artifacts/${git_tag}/tags/${git_tag}" -u "$USER:$PASSWORD"
docker build  -t ${HARBOR_URL}/${PROJECT}/${REPOSITORY}:${git_tag} .
docker login -uadmin -padmin ${HARBOR_URL}
docker push ${HARBOR_URL}/${PROJECT}/${REPOSITORY}:${git_tag}
#部署
ansible -i /server/ansible/hosts web -m shell -a"\
docker rm -f bird; \
docker rmi ${HARBOR_URL}/${PROJECT}/${REPOSITORY}:${git_tag}; \
docker login -u$USER -p$PASSWORD ${HARBOR_URL}; \
docker run -d --name bird -p 80:80 ${HARBOR_URL}/${PROJECT}/${REPOSITORY}:${git_tag}"

15. jenkins引入安全扫描工具sonarqube

sonarqube服务器:10.0.0.73,下面安装的软件都是在这台机器安装

15.1. jdk1.8安装

yum -y install java

15.2. 安装依赖

yum install git java unzip wget -y

15.3. 安装mysql 5.7

yum install -y https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
yum install -y mysql-community-server
systemctl start mysqld
]# grep -i password /var/log/mysqld.log 
2024-07-16T06:21:23.103934Z 1 [Note] A temporary password is generated for root@localhost: *PpB&()jE0<a
mysql -uroot -p"*PpB&()jE0<a"
mysql> alter user root@localhost identified by '新密码';#创建数据库及用户
mysql> create database sonarqube charset utf8;
mysql> grant all on sonarqube.* to 'sonarqube'@'localhost' identified by 'Sonar123...';

15.4. sonarqube安装

cd /app/tools
wget  https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-7.7.zip
unzip sonarqube-7.7.zip
ln -s sonarqube-7.7 sonar
useradd sonar
chown -R sonar.sonar /app/tools/sonar/
#修改配置文件
]# egrep -v '^$|^#' sonar/conf/sonar.properties
sonar.jdbc.username=sonarqube
sonar.jdbc.password=Sonar123...
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonarqube?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
#启动sonarqube
]# su - sonar -c '/app/tools/sonar/bin/linux-x86-64/sonar.sh start'
Starting SonarQube...
Started SonarQube.

15.5. 访问sonarqube界面 http://sonar.tom.cn:9000

点击login,输入用户名:admin 用户密码:admin

windows本地做host解析
10.0.0.73 sonar.tom.cn

15.6. sonarqube汉化

rm -rf sonar/extensions/plugins/
tar -xvf sonarqube_7.7.plugins_new.tar.gz -C ./sonar/extensions/
]# su - sonar -c '/app/tools/sonar/bin/linux-x86-64/sonar.sh restart'
Stopping SonarQube...
Stopped SonarQube.
Starting SonarQube...
Started SonarQube.

15.7. sonarqube新建一个项目,创建token,复制用于扫描java的maven命令

mvn sonar:sonar \-Dsonar.projectKey=test \-Dsonar.projectName=test \-Dsonar.host.url=http://sonar.tom.cn:9000 \-Dsonar.login=06fd5a5f31971847aa7c3caab9a87ee378a83c41

15.8. jenkins项目中调用sonarqube扫描

16. jenkins分布式

背景:

jenkins服务器上运行maven编译,ansible(执行剧本),docker build(构建镜像) ,jenkins慢了.

解决:

把一些功能拆分出去. 运行指定任务的时候指定这个新的(jenkins)节点即可.

16.1. 案例:拆分docker功能

目标:未来我们的任务中只要有docker build相关操作就交给对应docker节点.

16.1.1. 添加节点 :

  1. 准备节点上安装jdk/jre环境. yum install -y java-11
  2. web页面添加节点 Dashbord-->系统管理-->节点管理(Clouds)

16.1.2. 创建任务并绑定到指定节点中

注意:拉取代码会被拉到新建的节点机器上,shell部分的操作命令全都会在新节点上运行,就相当于jenkins让新节点干活了,所以新节点上要部署ansible,否则编译会报错

17. jenkins权限控制rbac认证

17.1. 安装插件

Role-based Authorization Strategy

Matrix Authorization Strategy

17.2. 启用rbac的认证

17.3. 配置权限

在系统管理页面点击Manage and Assign Roles进入角色管理页面:

17.4. 管理角色(manager roles)

选择该项可以创建全局角色、项目角色,并可以为角色分配权限

全局角色(Global roles)与项目角色(item roles)的区别就是,项目角色只能管理项目,没有管理jenkins的权限配置,全局角色适用于Jenkins中的任何项目,并覆盖您在项目角色中指定的任何内容。也就是说,当您在全局角色中为角色指定job read权限时,无论您在项目角色中指定什么,该角色都可以读取所有作业。在全局角色中提供job create将允许创建任何名称的作业。

添加项目角色时,需要指定匹配项目的模式,官方文档介绍该选项支持正则表达式,

"Roger-." 表示所有以Roger-开头的项目,

"(?i)roger-.*" 表示以roger-开头的项目并且不区分大小写,

"ABC|ABC.*",ABC开头的项目可以配置为“

"abc|bcd|efg" 直接匹配多个项目

"aa[^abc].*" 匹配以aa开头并且不包括abc的字符串:

全局角色:

OPS: 运维人员权限

项目角色:

上面根据项目,每个项目建立了2组角色,一个是开发用,一个测试用

DEV-DEV:  DEV环境 开发人员权限  
DEV-SIT: DEV环境 测试人员权限
PROD-DEV:  PROD环境 开发人员权限
PROD-SIT: PROD环境 测试人员权限

17.5. 新建用户:

OPS-01 
DEV-01
SIT-01

17.6. 给用户分配角色(assign roles)

18. jenkins pipeline

安装插件:Pipeline: Stage View Plugin,Pipeline Stage View

pipeline流水线:通过jenkins的工作框架,通过代码的方式,将多个任务联合起来

流水线优点:

  1. 模块化
  2. 方便检查
  3. 方便排错
  4. 整体运行流程清晰

18.1. pipeline代码书写格式

pipeline {agent anyenvironment {host="web1"}stages {stage('1.获取代码') {steps {echo "get code $host"}}stage('2.质量检测') {steps {echo "check code $host"}}stage('3.maven编译') {steps {echo "result code $host"}}}
}
所有代码都放在pipeline层内
agent定义在哪台机器上运行:any,none
environment{} 环境变量=变量值
stages{} 集合一个大项目的结合,用来包含stage子项目
stage{} 单个任务,用来包含steps{}部分
steps{} 用来实现具体动作(命令/脚本)

18.2. 新建一个流水线job

这里可以通过流水线语法生成流水线的部分代码,比如拉取代码等

Git Parameter | Jenkins plugin

Git plugin

pipeline {agent anyparameters {gitParameter branchFilter: 'origin.*/(.*)', defaultValue: 'main', name: 'git_tag', type: 'PT_TAG', useRepository: 'http://gitlab.tom.com/dev/helloworld.git'}stages {stage('1.获取代码') {steps {checkout([$class: 'GitSCM', branches: [[name: "${params.git_tag}"]], extensions: [], userRemoteConfigs: [[credentialsId: 'fc5d2626-f02d-4b07-b709-8c04f8709c57', url: 'http://gitlab.tom.com/dev/helloworld.git']]])	}}stage('2.质量检测') {steps {sh '''/app/tools/maven/bin/mvn sonar:sonar \-Dsonar.projectKey=${JOB_BASE_NAME} \-Dsonar.projectName=${JOB_BASE_NAME} \-Dsonar.host.url=http://sonar.tom.cn:9000 \-Dsonar.login=06fd5a5f31971847aa7c3caab9a87ee378a83c41'''}}stage('3.maven编译') {steps {sh '''/app/tools/maven/bin/mvn clean package''' }}stage('4.部署') {steps {sh '''scp ${WORKSPACE}/target/*.war root@10.0.0.8:/app/tools/tomcat/webapps/ROOT.war''' }}}
}

由于这里是根据tag进行拉取代码的,第一次构建的时候,页面上不出现选项,成功后,再次构建的时候,就会提示要选择tag,进行拉取代码了

19. Maven私服仓库配置-Nexus

19.1. nexus安装

#https://www.sonatype.com/download-oss-sonatype
#10.0.0.74机器,上传nexus压缩包
cd /app/tools/
tar -xvf nexus-3.13.0-01-unix.tar.gz
ln -s /app/tools/nexus-3.13.0-01/bin/nexus /bin/nexus
]# tar -xvf nexus-3.13.0-01-unix.tar.gz ^C
[root@nexus tools]# nexus --version
No suitable Java Virtual Machine could be found on your system.
The version of the JVM must be at least 1.8 and at most 1.8.
Please define INSTALL4J_JAVA_HOME to point to a suitable JVM.
#提示需要安装java1.8
yum -y install java-1.8.0
[root@nexus tools]# nexus --version
WARNING: ************************************************************
WARNING: Detected execution as "root" user.  This is NOT recommended!
WARNING: ************************************************************
Usage: /usr/bin/nexus {start|stop|run|run-redirect|status|restart|force-reload}
[root@nexus tools]# nexus start
WARNING: ************************************************************
WARNING: Detected execution as "root" user.  This is NOT recommended!
WARNING: ************************************************************
Starting nexus
[root@nexus tools]# nexus status
WARNING: ************************************************************
WARNING: Detected execution as "root" user.  This is NOT recommended!
WARNING: ************************************************************
nexus is running.

本地hosts做解析

10.0.0.74 nexus.tom.cn

访问:http://nexus.tom.cn:8081 用户名:admin 密码:admin123

admin登陆后,点击左侧【Security–Users】,在列表中选择用户,右键可更改密码和重围密码, 底部表格中可修改用户其余信息

System Requirement: max file descriptors [4096] likely too low, increase to at least [65536].

翻译nexus要求: 文件描述符过低,请增加到65536(每个进程可以打开的文件数量)

#配置后重启生效。
vim /etc/security/limits.conf
#新增* soft nofile 65536* hard nofile 65536
#命令临时重启后失效 ulimit -n 65536

19.2. nexus配置远程的仓库为阿里云的nexus地址

http://maven.aliyun.com/nexus/content/groups/public/

19.3. maven修改配置连接nexus

jenkins机器做hosts解析

echo '172.16.1.74 nexus.tom.cn' >> /etc/hosts

cp /app/tools/maven/conf/settings.xml{,.back}
cat /app/tools/maven/conf/settings.xml
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"><servers><server><id>my-nexus-releases</id><username>admin</username>  <password>admin123</password>  </server><server><id>my-nexus-snapshot</id><username>admin</username><password>admin123</password></server></servers><mirrors><mirror><id>nexus</id><mirrorOf>*</mirrorOf><url>http://nexus.tom.cn:8081/repository/maven-public/</url></mirror></mirrors><profiles><profile><id>nexus</id><repositories><repository><id>central</id><url>http://nexus.tom.cn:8081/repository/maven-public/</url><releases><enabled>true</enabled></releases><snapshots><enabled>true</enabled></snapshots></repository></repositories><pluginRepositories><pluginRepository><id>central</id><url>http://nexus.tom.cn:8081/repository/maven-public/</url><releases><enabled>true</enabled></releases><snapshots><enabled>true</enabled></snapshots></pluginRepository></pluginRepositories></profile></profiles>
<activeProfiles><activeProfile>nexus</activeProfile>
</activeProfiles>
</settings>

测试

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

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

相关文章

Linux云计算 |【第一阶段】ENGINEER-DAY2

主要内容&#xff1a; 磁盘空间管理fdisk、parted工具、开机自动挂载、文件系统、交换空间 KVM虚拟化 实操前骤&#xff1a; 1&#xff09;添加一块硬盘&#xff08;磁盘&#xff09;&#xff0c;需要关机才能进行操作&#xff0c;点击左下角【添加硬件】 2&#xff09;选择2…

如何成为学习高手

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 所有的学习方式&#xff0c;核心都是动脑加动手。 区别在于如何让…

配置RIPv2的认证

目录 一、配置IP地址、默认网关、启用端口 1. 路由器R1 2. 路由器R2 3. 路由器R3 4. Server1 5. Server2 二、搭建RIPv2网络 1. R1配置RIPv2 2. R2配置RIPv2 3. Server1 ping Server2 4. Server2 ping Server1 三、模拟网络攻击&#xff0c;为R3配置RIPv2 四、在R…

【机器学习】智能驱动未来:机器学习在能源效率提升与环境管理中的创新应用

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀目录 &#x1f50d;1. 引言&#x1f4d2;2. 机器学习能源环境领域的应用潜力&#x1f304;能源效率提升&#x1f3de;️环境管理⛰️具体案例…

Flink History Server配置

目录 问题复现 History Server配置 HADOOP_CLASSPATH配置 History Server配置 问题修复 启动flink集群 启动Histroty Server 问题复现 在bigdata111上执行如下命令开启socket&#xff1a; nc -lk 9999 如图&#xff1a; 在bigdata111上执行如下命令运行flink应用程序 …

【Java】用队列实现栈 力扣

文章目录 题目链接题目描述思路代码 题目链接 225.用队列实现栈 题目描述 思路 一个队列在模拟栈弹出元素的时候只要将队列头部的元素&#xff08;除了最后一个元素外&#xff09; 重新添加到队列尾部&#xff0c;此时再去弹出元素就是栈的顺序了。 代码 class MyStack {Q…

用EXCEL和python 计算马尔可夫链转移矩阵

目录 目标&#xff1a;用EXCEL和python 计算马尔可夫链转移矩阵 1 用EXCEL计算 1.1 马尔可夫链的基本应用 1.2 具体计算 2 用python计算马尔可夫转移矩阵 2.1 py代码 2.2 运行结果 3 上面2者计算结果相同 目标&#xff1a;用EXCEL和python 计算马尔可夫链转移矩阵 1 用…

神经网络模型实现(训练、测试)

目录 一、神经网络骨架&#xff1a;二、卷积操作&#xff1a;三、卷积层&#xff1a;四、池化层&#xff1a;五、激活函数&#xff08;以ReLU为例&#xff09;&#xff1a;六、模型搭建&#xff1a;七、损失函数、梯度下降&#xff1a;八、模型保存与加载&#xff1a;九、模型训…

Leetcode2160. 拆分数位后四位数字的最小和:

问题描述&#xff1a; 给你一个四位 正 整数 num 。请你使用 num 中的 数位 &#xff0c;将 num 拆成两个新的整数 new1 和 new2 。new1 和 new2 中可以有 前导 0 &#xff0c;且 num 中 所有 数位都必须使用。 比方说&#xff0c;给你 num 2932 &#xff0c;你拥有的数位包括…

AP ERP与汉得SRM系统集成案例(制药行业)

一、项目环境 江西某医药集团公司&#xff0c;是一家以医药产业为主营、资本经营为平台的大型民营企业集团。公司成立迄今&#xff0c;企业经营一直呈现稳健、快速发展的态势&#xff0c; 2008 年排名中国医药百强企业前 20 强&#xff0c;2009年集团总销售额约38亿元人民币…

(秋招复习)自动驾驶与机器人中的SLAM技术(一)

秋招复习之--自动驾驶与机器人中的SLAM技术1 前言第一章 自动驾驶基础知识第二章 基础数学知识回顾旋转的表示SO(3)的BCH近似运动学表示线速度与加速度的处理一些常见的雅可比滤波器和最优化理论 第三章 惯性导航与组合导航IMU系统运动学IMU航迹推算卫星导航基于ESKF的简单组合…

PostgreSQL的引号、数据类型转换和数据类型

一、单引号和双引号&#xff08;重要&#xff09;&#xff1a; 1、在mysql没啥区别 2、在pgsql中&#xff0c;实际字符串用单引号&#xff0c;双引号相当于mysql的,用来包含关键字&#xff1b; -- 单引号&#xff0c;表示user_name的字符串实际值 insert into t_user(user_nam…

【springboot】中使用--WebMvcConfigurer

WebMvcConfigurer 一、页面跳转控制器step1:创建视图&#xff0c;resources/templates/index.htmlstep2:创建SpringMVC配置类step3:测试功能 二、数据格式化step1:创建 DeviceInfo 数据类step2&#xff1a;自定义 Formatterstep3: 登记自定义的 DeviceFormatterstep4: 新建 Con…

Linux epoll 机制——原理图解与源码实现分析

epoll概述 epoll是Linux内核为处理大批量文件描述符而作了改进的poll&#xff0c;它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。 epoll可以理解为event poll&#xff0c;它是一种事件驱动的I/O模型&#xff0c;可以用来替代传统的select和poll模型…

数据结构 - 栈(精简介绍)

文章目录 普通栈Stack用法Q 最长有效括号 单调栈Q 接雨水 普通栈 栈就是一个先进后出的结构 想象一个容器&#xff0c;往里面一层一层放东西&#xff0c;最早放进去的东西被压在下面&#xff08;所以放元素也叫压栈&#xff09;&#xff0c;要拿到这个最低层的东西需要先把上面…

Puromycin(嘌呤霉素)— pac基因筛选抗生素

Puromycin是由Streptomyces alboniger&#xff08;白黑链霉菌&#xff09;产生的一种氨基糖苷类抗生素&#xff0c;可抑制原核细胞和真核细胞的肽基转移。Puromycin可抑制革兰氏阳性菌、多种动物细胞和昆虫细胞的生长&#xff0c;但是真菌和革兰氏阴性菌对Puromycin具有抗性&am…

CCF-Csp算法能力认证, 202312-2因子化简含解析

CCF-Csp算法能力认证&#xff0c; 202312-1仓库规划含解析 前言 推荐书目&#xff0c;在这里推荐那一本《算法笔记》&#xff08;胡明&#xff09;&#xff0c;需要PDF的话&#xff0c;链接如下 「链接&#xff1a;https://pan.xunlei.com/s/VNvz4BUFYqnx8kJ4BI4v1ywPA1?…

SCI一区级 | Matlab实现SSA-CNN-GRU-Multihead-Attention多变量时间序列预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.【SCI一区级】Matlab实现SSA-CNN-GRU-Multihead-Attention麻雀算法优化卷积门控循环单元融合多头注意力机制多变量时间序列预测&#xff0c;要求Matlab2023版以上&#xff1b; 2.输入多个特征&#xff0c;输出单个…

手机如何播放电脑的声音?

准备工具&#xff1a; 有线耳机&#xff0c;手机&#xff0c;电脑&#xff0c;远控软件 1.有线耳机插电脑上 2.电脑安装pc版远控软件&#xff0c;手机安装手机端控制版远控软件 3.手机控制电脑开启声音控制 用手机控制电脑后&#xff0c;打开声音控制&#xff0c;电脑播放视频…

Qt 使用Installer Framework制作安装包

Qt 使用Installer Framework制作安装包 引言一、下载安装 Qt Installer Framework二、简单使用2.1 创建目录结构 (文件夹结构)2.2 制作程序压缩包2.3 制作程序安装包 引言 Qt Installer Framework (安装程序框架)是一个强大的工具集&#xff0c;用于创建自定义的在线和离线安装…