【轻松掌握】Jenkins入门指南:构建高效的CI/CD Pipeline

news2024/12/23 15:51:58

文章目录

  • 前言
  • 安装部署
    • 安装JDK
    • 安装Jenkins
      • 下载Jenkins
      • 运行Jenkins
          • 访问页面
          • 填写管理员密码
          • 安装推荐的插件
    • Maven安装
      • 下载
      • 上传到Linux
      • 解压
      • 配置镜像
      • 运行
      • 查看Maven使用的JDK版本
    • Jenkins安装Maven插件
  • 创建Demo项目
  • 创建Jenkins任务
    • 填写代码仓库地址
    • Linux安装GIT解决报错
    • 配置Maven版本
      • 配置刚才安装Maven的路径即可
      • 设置POM位置
  • 测试构建
  • 构建&手动运行Jar包
    • 构建
    • 查看Jar包
    • 安装JDK
    • 手动运行项目
      • 验证正常访问项目接口
  • 自动化发布到服务器
    • 安装插件
    • 配置SSH服务器(待发布服务的服务器)
    • 任务中配置SSH以及构建后操作
      • Transfer Set Source files
      • Remove prefix
      • Remote directory
      • Exec command
    • Jar包保存位置
    • 构建完成后执行的命令
    • 查看构建结果
      • 日志输出
      • 查看项目是否启动
    • SSH puslishers超时机制
      • 命令优化
      • 替换配置
      • 配置超时时间
    • 构建前执行的命令
      • Pre Steps
    • 构建前脚本开发
      • 清理Jar包和杀死进程
      • 增加逻辑判断和参数传入
        • 验证未有Jar包运行时
        • 验证有Jar包运行时
      • 优化脚本
        • 测试
    • Pre Steps增加参数
  • 提交代码测试
    • 旧版本
    • 提交新版本代码
    • 运行Jenkins
      • 发现问题
    • 修改Pre Steps配置的脚本
    • 修改Post Steps配置
      • 修改前
      • 修改后
        • 创建postStepsShell脚本
    • 重新测试
  • 使用Pipeline
    • 安装插件
    • 创建流水线
      • 创建任务
      • 配置Pipeline
      • 创建Pipeline脚本
        • 脚本解释
    • 执行流水线
      • 报错
      • 解决方案
    • 再次执行流水线
    • Java项目无法正常运行
      • 现象
      • 解决:在Pipeline中需要额外配置
        • 参考文章
  • 最终版Pipeline
    • 脚本解释
  • 本文示例项目地址
  • 最后

前言

本文提供了一份全面的Jenkins学习指南,旨在帮助你理解和掌握这一强大的持续集成/持续部署(CI/CD)工具。文章详细介绍了Jenkins的安装、配置过程,以及如何与Maven和Git等工具集成,帮助你从零开始搭建自己的CI/CD环境。

在学习过程中,你将逐步了解如何设置Jenkins、安装必要的插件,通过示例项目,最终实现应用的自动化部署。特别是通过Jenkins Pipeline,你将学会如何定义构建、部署等各个阶段。

快速使用:只看配置相关内容+最终版Pipeline+脚本解释即可

安装部署

Jenkins+Maven+Git

英文官网:https://www.jenkins.io

中文官网:https://www.jenkins.io/zh/

安装JDK

Linux检查是否安装了JDK

java -version

如果没找到就安装一个

查询所有可以安装版本

yum search java|grep jdk

在这里插入图片描述

下载安装JDK11(Jenkins支持一件安装插件的JDK版本最低是11,所以这里安装了11)

yum install -y java-11-openjdk

在这里插入图片描述

修改默认JDK版本

alternatives --config java
这里指定为11,避免后面一系列的问题

在这里插入图片描述

安装Jenkins

在这里插入图片描述

下载不了点这里

https://updates.jenkins.io/download/war/

下载Jenkins

下载2.387.3(目前最新插件最低支持的Jenkins版本是2.387.3)

在这里插入图片描述

在这里插入图片描述

运行Jenkins

/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64/bin/java -jar jenkins_2.387.3.war --httpPort=8080

在这里插入图片描述

访问页面

http://xxx.xxx.xx.xxx:8080/

填写管理员密码

在这里插入图片描述

这个密码存在于启动时的控制台界面上,也可以去下方路径的文件中查找

在这里插入图片描述

安装推荐的插件

在这里插入图片描述

Maven安装

下载

下载链接:https://maven.apache.org/download.cgi

在这里插入图片描述

上传到Linux

解压

mkdir -p /opt/maven-3.9.8
tar zxvf apache-maven-3.9.8-bin.tar.gz -C /opt/maven-3.9.8

配置镜像

<mirrors>
    <!-- 优先使用阿里云镜像 -->
    <mirror>
        <id>aliyun</id>
        <name>Aliyun Maven Mirror</name>
        <url>https://maven.aliyun.com/repository/public</url>
        <mirrorOf>central</mirrorOf>
    </mirror>

    <!-- 如果阿里云镜像不可用,再使用 Maven Central -->
    <mirror>
        <id>central</id>
        <name>Maven Central Repository</name>
        <url>https://repo.maven.apache.org/maven2</url>
        <mirrorOf>central</mirrorOf>
    </mirror>
</mirrors>

运行

/opt/maven-3.9.8/apache-maven-3.9.8/bin/mvn

在这里插入图片描述

查看Maven使用的JDK版本

/opt/maven-3.9.8/apache-maven-3.9.8/bin/mvn -v

在这里插入图片描述

Jenkins安装Maven插件

在这里插入图片描述

在这里插入图片描述

创建Demo项目

示例代码仓库:https://github.com/ChenJiahao0205/Jenkins-Learning

在这里插入图片描述

在这里插入图片描述

创建Jenkins任务

在这里插入图片描述

在这里插入图片描述

填写代码仓库地址

在这里插入图片描述

Linux安装GIT解决报错

yum install git

验证

在这里插入图片描述

配置Maven版本

在这里插入图片描述

配置刚才安装Maven的路径即可

在这里插入图片描述

保存完回到配置项目页面即可,忽略这个警告即可

设置POM位置

这里的POM指的是,项目中的POM位置

在这里插入图片描述

在这里插入图片描述

测试构建

在这里插入图片描述

在这里插入图片描述

构建&手动运行Jar包

构建

在这里插入图片描述

查看Jar包

在这里插入图片描述

安装JDK

yum install -y java-devel
sudo yum install -y java-11-openjdk-devel

手动运行项目

java -jar Jenkins-Learning-0.0.1-SNAPSHOT.jar

在这里插入图片描述

验证正常访问项目接口

在这里插入图片描述

自动化发布到服务器

安装插件

在这里插入图片描述

配置SSH服务器(待发布服务的服务器)

在这里插入图片描述

任务中配置SSH以及构建后操作

在这里插入图片描述

Transfer Set Source files

源文件路径

由构建日志可以得出构建后的Jar的存储目录

Remove prefix

去生成的远端目录中忽略源文件目录的哪些目录

Remote directory

保存的远端地址

Exec command

构建完成后执行的命令

Jar包保存位置

在这里插入图片描述

构建完成后执行的命令

nohup java -jar /root/jenkins/workspace/Jenkins-Learning*.jar &

查看构建结果

日志输出

在这里插入图片描述

查看项目是否启动

ps aux | grep java

在这里插入图片描述

SSH puslishers超时机制

命令优化

控制台执行下面命令的时候会卡顿

nohup java -jar /root/jenkins/workspace/Jenkins-Learning*.jar &

优化为

nohup java -jar /root/jenkins/workspace/Jenkins-Learning*.jar >mylog.log 2>&1 &
该命令可被替换为
nohup java -jar /root/jenkins/workspace/Jenkins-Learning*.jar &>mylog.log &
>覆盖写入
>>追加写入
2代表 标准错误输出
1代表 标准输出
2>&1 将正常输出和错误输出全部写入

替换配置

在这里插入图片描述

配置超时时间

在这里插入图片描述

构建前执行的命令

清理之前打包的Jar包、Kill正在执行的Jar包之类的操作

Pre Steps

编写shell脚本,批量执行操作

  • vi getPidAndKillShell.sh

    • #!/bin/bash
      echo "">/root/getPidAndKillShell.txt
      
  • 修改权限

    • chmod 777 getPidAndKillShell.sh
      
  • 添加配置

    • 在这里插入图片描述
  • 测试构建项目看能否正常执行脚本生成getPidAndKillShell.txt

构建前脚本开发

清理Jar包和杀死进程

修改getPidAndKillShell.sh内容

#!/bin/bash

# 删除历史数据
rm -rf jenkins

# 筛选正在执行的Jar包信息 并取出第二个字符(PID)
pid=`ps -ef | grep Jenkins-Learning | grep 'java -jar' | awk '{printf $2}'`    

# 杀掉当前Jar包进程
kill -9 $pid

增加逻辑判断和参数传入

没找到PID时不进行KILL

#!/bin/bash

appname=$1

# 删除历史数据
rm -rf jenkins

# 筛选正在执行的Jar包信息 并取出第二个字符(PID)
pid=`ps -ef | grep $appname | grep 'java -jar' | awk '{printf $2}'`    

# 如果PID为空(使用-z做空值判断),提示一下,否则执行KILL命令
if [ -z $pid ];
		then
			echo "$appname not start"
		else
			# 杀掉当前Jar包进程
			kill -9 $pid
			echo "$appname stoping......"
fi

运行./getPidAndKillShell.sh Jenkins-Learning

验证未有Jar包运行时

在这里插入图片描述

验证有Jar包运行时

在这里插入图片描述

优化脚本

#!/bin/bash

appname=$1

# 检查是否提供了应用名称参数
if [ -z "$appname" ]; then
    echo "Error: Application name is required."
    exit 1
fi

# 删除历史数据
rm -rf jenkins

# 筛选正在执行的Jar包信息 并取出第二个字符(PID)
pid=$(ps -ef | grep "$appname" | grep 'java -jar' | awk '{print $2}')

# 如果PID为空(使用-z做空值判断),提示一下,否则执行KILL命令
if [ -z "$pid" ]; then
    echo "$appname not start"
else
    # 杀掉当前Jar包进程
    kill -9 $pid
    echo "$appname stopping......"
    
    check=$(ps -ef | grep -w "$pid" | grep java)
    if [ -z "$check" ]; then
        echo "$appname pid:$pid is stopped"
    else
        echo "$appname stop failed"
    fi
fi

测试

在这里插入图片描述

Pre Steps增加参数

在这里插入图片描述

提交代码测试

旧版本

在这里插入图片描述

提交新版本代码

在这里插入图片描述

在这里插入图片描述

运行Jenkins

在这里插入图片描述

发现问题

在这里插入图片描述

两个Jar包都过来了

分析原因,Post Step进行源文件匹配时,匹配到了这两个文件,所以都传过来了

删除jenkins工作目录中旧的jar包

在这里插入图片描述

修改Pre Steps配置的脚本

getPidAndKillShell.sh

#!/bin/bash

appname=$1

# 检查是否提供了应用名称参数
if [ -z "$appname" ]; then
    echo "Error: Application name is required."
    exit 1
fi

# 筛选正在执行的Jar包信息 并取出第二个字符(PID)
pid=$(ps -ef | grep "$appname" | grep 'java -jar' | awk '{print $2}')

# 如果PID为空(使用-z做空值判断),提示一下,否则执行KILL命令
if [ -z "$pid" ]; then
    echo "$appname not start"
else
    # 杀掉当前Jar包进程
    kill -9 $pid
    echo "$appname stopping......"
    
    check=$(ps -ef | grep -w "$pid" | grep java)
    if [ -z "$check" ]; then
        echo "$appname pid:$pid is stopped"
    else
        echo "$appname stop failed"
    fi
fi

# 删除历史数据工作路径数据
rm -rf /root/.jenkins/workspace/learning-jenkins-demo-01/target/Jenkins-Learning*.jar

修改Post Steps配置

修改前

在这里插入图片描述

修改后

在这里插入图片描述

创建postStepsShell脚本
#!/bin/bash

# 找到最新的JAR包
latest_jar=$(ls -t /root/jenkins/workspace/Jenkins-Learning*.jar | head -n 1)

nohup java -jar "$latest_jar"  mylog.log 2>&1 &

重新测试

目前正在运行版本号为03

现在新增加了04版本

在这里插入图片描述

在这里插入图片描述

使用Pipeline

安装插件

pipeline插件和SSH Pipeline Steps插件

在这里插入图片描述

创建流水线

创建任务

在这里插入图片描述

配置Pipeline

在这里插入图片描述

创建Pipeline脚本

pipeline {
    agent any

    environment {
        WORKSPACE_DIR = "/root/.jenkins/workspace"
        TARGET_DIR = "/root/jenkins/workspace"
        JAR_NAME = ""
        APP_NAME = "Jenkins-Learning"
        REPO_URL = "https://github.com/ChenJiahao0205/Jenkins-Learning.git"
        JENKINS_TASK_NAME = "learning-jenkins-demo-02-pipeline"
    }
    
    // 定义 Maven 工具,确保它在 Jenkins 全局工具配置中已定义
    tools {
        maven "maven-3.9.8"
    }

    stages {
        stage('Checkout') {
            steps {
                script {
                    // 从 Git 仓库检出代码
                    checkout([$class: 'GitSCM',
                        branches: [[name: '*/master']], // 替换为你的分支名
                        userRemoteConfigs: [[url: "${REPO_URL}"]]
                    ])
                }
            }
        }

        stage('Clean History Jar') {
            steps {
                script {
                    // 删除历史数据工作路径数据
                    sh "rm -rf ${WORKSPACE_DIR}/${JENKINS_TASK_NAME}/target/Jenkins-Learning*.jar"
                }
            }
        }

        stage('Build') {
            steps {
                script {
                    // 使用 Maven 构建项目
                    sh 'mvn clean package'
                }
            }
        }

        stage('Find Latest Jar') {
            steps {
                script {
                    // 获取最新的 Jar 包名称
                    JAR_NAME = sh(script: "ls -t ${WORKSPACE_DIR}/${JENKINS_TASK_NAME}/target/*.jar | head -n 1", returnStdout: true).trim()
                    echo "Latest Jar: ${JAR_NAME}"
                }
            }
        }

        stage('Move Jar to Target Directory') {
            steps {
                script {
                    // 将最新的 Jar 包移动到目标目录
                    sh "mv ${JAR_NAME} ${TARGET_DIR}/"
                    echo "Moved Jar to Target Directory: ${TARGET_DIR}"
                    
                    // 使用 SSH 将最新的 Jar 包传输到目标服务器
                    // sshPublisher(publishers: [sshPublisherDesc(configName: 'my-server', 
                    // transfers: [sshTransfer(sourceFiles: "${JAR_NAME}", remoteDirectory: "${TARGET_DIR}")],
                    // usePromotionTimestamp: false, alwaysPublishFromMaster: true, paramPublish: true, failOnError: true)])
                }
            }
        }

        stage('Stop Running Application') {
            steps {
                script {
                    // 停止正在运行的 Jar 包
                    sh '''
                    pid=$(ps -ef | grep "${APP_NAME}" | grep 'java -jar' | awk '{print $2}')
                    
                    if [ -z "$pid" ]; then
                        echo "${APP_NAME} not start"
                    else
                        kill -9 $pid
                        echo "${APP_NAME} stopping......"
                        
                        check=$(ps -ef | grep -w "$pid" | grep java)
                        if [ -z "$check" ]; then
                            echo "${APP_NAME} pid:$pid is stopped"
                        else
                            echo "${APP_NAME} stop failed"
                        fi
                    fi
                    '''
                }
            }
        }

        stage('Deploy Application') {
            steps {
                script {
                    // 获取 JAR 文件的名称
                    def jarName = sh(script: "basename ${JAR_NAME}", returnStdout: true).trim()
                    // 启动新的 Jar 包
                    sh "nohup java -jar ${TARGET_DIR}/${jarName} > ${TARGET_DIR}/mylog.log 2>&1 &"
                    echo "Started Application with Jar: ${TARGET_DIR}/${jarName}"
                }
            }
        }
    }

    post {
        always {
            echo 'Pipeline completed.'
        }
        success {
            echo 'Deployment succeeded.'
        }
        failure {
            echo 'Deployment failed.'
        }
    }
}

脚本解释
  • Agent Any: 表示此 Pipeline 可以在任何可用的 Jenkins agent 上运行。

  • Environment: 定义了一些环境变量,比如工作目录和目标目录。

  • tools

    • maven:配置使用maven,在全局工具配置,maven安装中进行配置
  • Stages: 定义了多个阶段。

    • Clean History Jar: 清理历史Jar包
    • Build: 构建项目,使用 Maven 作为示例。如果你的项目不是使用 Maven 构建的,请根据实际情况修改。
    • Find Latest Jar: 使用 shell 命令查找生成的最新 Jar 包。
    • Move Jar to Target Directory: 模拟使用 sshPublisher 插件将最新的 Jar 包传输到目标服务器。这里使用MV代替了
    • Stop Running Application: 停止正在运行的Jar包
    • Deploy Application: 在目标服务器上通过 SSH 执行部署命令,启动 Jar 包。
    • Post Steps: 在 Pipeline 结束后执行的步骤。
  • Always: 无论 Pipeline 成功或失败,总是会执行这一步。

  • Success: 只有当 Pipeline 成功时,才会执行。

  • Failure: 只有当 Pipeline 失败时,才会执行。

执行流水线

报错

Started by user chenjiahao
org.jenkinsci.plugins.scriptsecurity.scripts.UnapprovedUsageException: script not yet approved for use
	at org.jenkinsci.plugins.scriptsecurity.scripts.ScriptApproval.using(ScriptApproval.java:668)
	at org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition.create(CpsFlowDefinition.java:123)
	at org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition.create(CpsFlowDefinition.java:69)
	at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:312)
	at hudson.model.ResourceController.execute(ResourceController.java:101)
	at hudson.model.Executor.run(Executor.java:442)
Finished: FAILURE

解决方案

在这里插入图片描述

批准脚本运行即可

再次执行流水线

在这里插入图片描述

Java项目无法正常运行

现象

流水线虽然执行成功了,但是程序没有成功启动

通过查看jps发现,程序启动了一瞬间就结束了

[root@jh-centos7 workspace]# jps
8823 war
9945 Jps
[root@jh-centos7 workspace]# jps
8823 war
9979 Jenkins-Learning-0.0.4-SNAPSHOT.jar
9966 Jps
[root@jh-centos7 workspace]# jps
8823 war
9979 -- process information unavailable
9997 Jps

查看日志

发现执行的命令是

nohup java -jar /root/jenkins/workspace/Jenkins-Learning-0.0.4-SNAPSHOT.jar

而非配置中的

"nohup java -jar ${TARGET_DIR}/${jarName} > ${TARGET_DIR}/mylog.log 2>&1 &"

解决:在Pipeline中需要额外配置

参考文章

https://blog.csdn.net/weixin_43767360/article/details/131980955

替换执行Java程序的命令为

JENKINS_NODE_COOKIE=dontKillMe nohup java -jar ${TARGET_DIR}/${jarName} > ${TARGET_DIR}/mylog.log 2>&1 &

最终版Pipeline

pipeline {
    agent any

    environment {
        WORKSPACE_DIR = "/root/.jenkins/workspace"
        TARGET_DIR = "/root/jenkins/workspace"
        JAR_NAME = ""
        APP_NAME = "Jenkins-Learning"
        REPO_URL = "https://github.com/ChenJiahao0205/Jenkins-Learning.git"
        JENKINS_TASK_NAME = "learning-jenkins-demo-02-pipeline"
    }
    
    // 定义 Maven 工具,确保它在 Jenkins 全局工具配置中已定义
    tools {
        maven "maven-3.9.8"
    }

    stages {
        stage('Checkout') {
            steps {
                script {
                    // 从 Git 仓库检出代码
                    checkout([$class: 'GitSCM',
                        branches: [[name: '*/master']], // 替换为你的分支名
                        userRemoteConfigs: [[url: "${REPO_URL}"]]
                    ])
                }
            }
        }

        stage('Clean History Jar') {
            steps {
                script {
                    // 删除历史数据工作路径数据
                    sh "rm -rf ${WORKSPACE_DIR}/${JENKINS_TASK_NAME}/target/Jenkins-Learning*.jar"
                }
            }
        }

        stage('Build') {
            steps {
                script {
                    // 使用 Maven 构建项目
                    sh 'mvn clean package'
                }
            }
        }

        stage('Find Latest Jar') {
            steps {
                script {
                    // 获取最新的 Jar 包名称
                    JAR_NAME = sh(script: "ls -t ${WORKSPACE_DIR}/${JENKINS_TASK_NAME}/target/*.jar | head -n 1", returnStdout: true).trim()
                    echo "Latest Jar: ${JAR_NAME}"
                }
            }
        }

        stage('Move Jar to Target Directory') {
            steps {
                script {
                    // 将最新的 Jar 包移动到目标目录
                    sh "mv ${JAR_NAME} ${TARGET_DIR}/"
                    echo "Moved Jar to Target Directory: ${TARGET_DIR}"
                    
                    // 使用 SSH 将最新的 Jar 包传输到目标服务器
                    // sshPublisher(publishers: [sshPublisherDesc(configName: 'my-server', 
                    // transfers: [sshTransfer(sourceFiles: "${JAR_NAME}", remoteDirectory: "${TARGET_DIR}")],
                    // usePromotionTimestamp: false, alwaysPublishFromMaster: true, paramPublish: true, failOnError: true)])
                }
            }
        }

        stage('Stop Running Application') {
            steps {
                script {
                    // Define variables
                    def pid = sh(script: "pgrep -f 'java -jar ${TARGET_DIR}/${APP_NAME}'", returnStdout: true).trim()
        
                    // Check if the PID exists
                    if (pid) {
                        echo "${APP_NAME} is running with PID: $pid. Stopping it..."
                        sh "kill -9 $pid"
        
                        // Verify if the application has stopped
                        def check = sh(script: "ps -p $pid", returnStatus: true)
                        if (check != 0) {
                            echo "${APP_NAME} pid:$pid has stopped successfully."
                        } else {
                            echo "${APP_NAME} stop failed. Process with PID $pid is still running."
                        }
                    } else {
                        echo "${APP_NAME} is not running."
                    }
                }
            }
        }


        stage('Deploy Application') {
            steps {
                script {
                    // 获取 JAR 文件的名称
                    def jarName = sh(script: "basename ${JAR_NAME}", returnStdout: true).trim()
                    // 启动新的 Jar 包
                    sh "JENKINS_NODE_COOKIE=dontKillMe nohup java -jar ${TARGET_DIR}/${jarName} > ${TARGET_DIR}/mylog.log 2>&1 &"
                        
                    echo "Started Application with Jar: ${TARGET_DIR}/${jarName}"
                }
            }
        }
    }

    post {
        always {
            echo 'Pipeline completed.'
        }
        success {
            echo 'Deployment succeeded.'
        }
        failure {
            echo 'Deployment failed.'
        }
    }
}

脚本解释

  • Agent Any: 表示此 Pipeline 可以在任何可用的 Jenkins agent 上运行。

  • Environment: 定义了一些环境变量,比如工作目录和目标目录。

  • tools

    • maven:配置使用maven,在全局工具配置,maven安装中进行配置
  • Stages: 定义了多个阶段。

    • Clean History Jar: 清理历史Jar包
    • Build: 构建项目,使用 Maven 作为示例。如果你的项目不是使用 Maven 构建的,请根据实际情况修改。
    • Find Latest Jar: 使用 shell 命令查找生成的最新 Jar 包。
    • Move Jar to Target Directory: 模拟使用 sshPublisher 插件将最新的 Jar 包传输到目标服务器。这里使用MV代替了
    • Stop Running Application: 停止正在运行的Jar包
    • Deploy Application: 在目标服务器上通过 SSH 执行部署命令,启动 Jar 包。
    • Post Steps: 在 Pipeline 结束后执行的步骤。
  • Always: 无论 Pipeline 成功或失败,总是会执行这一步。

  • Success: 只有当 Pipeline 成功时,才会执行。

  • Failure: 只有当 Pipeline 失败时,才会执行。

本文示例项目地址

https://github.com/ChenJiahao0205/Jenkins-Learning.git

最后

本文部分内容结合B站视频学习总结得到,参考视频:https://www.bilibili.com/video/BV1bS4y1471A

感谢大家看到这里,文章如有不足,欢迎大家指出;彦祖点个赞吧彦祖点个赞吧彦祖点个赞吧,欢迎关注程序员五条!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文吃透SpringMVC

一、SpringMVC简介 1、什么是MVC MVC是一种软件架构模式&#xff08;是一种软件架构设计思想&#xff0c;不止Java开发中用到&#xff0c;其它语言也需要用到&#xff09;&#xff0c;它将应用分为三块&#xff1a; M&#xff1a;Model&#xff08;模型&#xff09;&#xf…

Phone X│“齐刘海”里到底搭载了哪些传感器?

揭开 “齐刘海”面纱 随着iPhone X的发布&#xff0c;3D人脸识别功能一度成为人们口中津津乐道的新科技&#xff0c;下面就让SITRI的专业团队带领大家揭开人脸识别的神秘面纱。 先从苹果iPhone X说起&#xff0c;让我们看一看这个可爱的“齐刘海”里到底搭载了哪些传感器&am…

杀软对抗 ----> 简简单单免杀某60

在开始之前还是宇宙免责 本Blog讨论的技术问题仅限于学习用&#xff0c;严禁用于非授权情况下执行攻击活动&#xff0c;如未授权攻击所造成一切后果由攻击者独自承担&#xff0c;所展示的代码仅用于杀软对抗学习&#xff0c;测试环境并非真实环境&#xff0c;并无对任何杀软有任…

我的sql我做主!Mysql 的集群架构详解之组从复制、半同步模式、MGR、Mysql路由和MHA管理集群组

目录 Mysql 集群技术一、Mysql 在服务器中的部署方法1.1 在Linux下部署mysql1.1.1 安装依赖性&#xff1a;1.1.2 下载并解压源码包1.1.3 源码编译安装mysql1.1.4 部署mysql 二、Mysql的组从复制2.1 配置mastesr2.2 配置salve2.3 当有数据时添加slave22.4 延迟复制2.5 慢查询日志…

医疗器械法规标准相关资料

文章目录 前言如何查找法规文件与标准1. 法规清单2. 医疗器械法规文件汇编常用链接常见网站微信公众号前言 在前文 医疗器械软件相关法律法规与标准 中介绍了在软件设计过程常见的法规与标准,并给出部分标准如何查找和下载的方法,但是上文中列举的部分不全面,真实在产品设计…

springboot公众号模板消息推送

文章目录 参考1、微信公众平台测试号管理1.1 访问微信公众平台测试账号页面1.2 获取appID和appsecret1.3 扫码二维码添加测试号1.4 添加模版消息 2、集成微信SDK2.1 引入微信工具包2.2 添加配置文件 3、API调用3.1 发送消息模版的实现3.2 测试类调用3.3 效果展示 4、回调配置回…

通过IMB看高效裁员

高效裁员是企业在面临经营压力或战略调整时不得不采取的措施之一。为了确保裁员过程既高效又尽量减少负面影响,可以遵循以下步骤和策略: 一、明确裁员目标和计划 分析需求:首先,企业需要明确裁员的原因,比如经营困难、业务重组、技术升级等,并基于这些原因确定裁员的范…

Centos系统二进制安装mysql5.7.44、添加环境变量、复制启动脚本、初始化数据库、设置用户密码

MySQL :: Download MySQL Community Server (Archived Versions) https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz 删除默认存在的mariadb-libs rpm -e mariadb-libs --nodeps 安装mysql cd /usr/local/src/ && …

Redis中的 大/热 key问题 ,如何解决(面试版)

big key 什么是 big key? big key&#xff1a;就是指一个内存空间占用比较大的键(Key) 造成的问题&#xff1a; 内存分布不均。在集群模式下&#xff0c;不同 slot分配到不同实例中&#xff0c;如果大 key 都映射到一个实例&#xff0c;则分布不均&#xff0c;查询效率也…

拿下英语翻译!这四款在线翻译功不可没!

作为一个刚踏入职场的小白&#xff0c;我最近在为工作中的英语翻译问题头疼不已。不过&#xff0c;经过一番尝试和比较&#xff0c;我找到了几款翻译工具&#xff0c;它们在帮我解决翻译难题上表现得相当不错。今天&#xff0c;就让我以一个职场新手的身份&#xff0c;来跟大家…

OpenCV几何图像变换(6)计算反转仿射变换函数invertAffineTransform()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 反转一个仿射变换。 该函数计算由 23 矩阵 M 表示的逆仿射变换&#xff1a; [ a 11 a 12 b 1 a 21 a 22 b 2 ] \begin{bmatrix} a_{11} & a…

【超音速 专利 CN202110438812.4】广州超音速自动化科技股份有限公司

申请号CN202110438812.4公开号&#xff08;公开&#xff09;CN113390879A申请日2021.09.14申请人&#xff08;公开&#xff09;广州超音速自动化科技股份有限公司(833753)发明人&#xff08;公开&#xff09;张俊峰&#xff08;总); 罗国和; 陈夏 原文摘要 本发明公开了一种涂…

【上】王树森《搜索引擎技术》- 课程笔记(概要、相关性)

课程合集&#xff1a;ShusenWang的个人空间-ShusenWang个人主页-哔哩哔哩视频 (bilibili.com) 课件地址&#xff1a;GitHub - wangshusen/SearchEngine: 搜索引擎原理 目录 概要 1、搜索引擎的基本概念 曝光和点击 垂搜vs通搜 课程安排 2、决定搜索满意度的因素&#…

某音作品列表,视频列表

声明&#xff1a;文章仅用于学习交流,如有侵权请联系删除 今天分享下某音app作品列表采集方法&#xff0c;我只详细说一下大步骤&#xff0c;细节就不多说了&#xff0c;留着大家去试吧 我们通过Fiddler 快捷方式 配置好代理 打开抖音进行抓包&#xff0c;随便找个达人打开主…

喜羊羊让你Pyecharts快速上手(实例+代码)

以下内容&#xff0c;皆为原创&#xff0c;制作实属不易&#xff0c;感谢大家的关注和点赞。 一.Pyecharts是什么 具体网址&#xff1a;pyecharts - A Python Echarts Plotting Library built with love. Pyecharts 是一个用于生成 Echarts 图表的 Python 库。Echarts 是由百度…

行业级API集成案例,巩固你的知识

在当今高度互联的世界&#xff0c;企业依靠无缝数据交换和简化的工作流程蓬勃发展。API&#xff08;应用程序编程接口&#xff09;已成为实现这一目标的秘密武器&#xff0c;可实现各种应用程序之间的强大集成。本文深入探讨了不同行业中 API 集成的真实示例&#xff0c;让您更…

四、5 下标引用、函数调用、结构成员(操作符)

&#xff08;1&#xff09;下标引用 [ ] (2)函数调用 ( ) (3)结构成员

python setup.py build install的GCC版本报错

在进行一些python三方库编译的时候&#xff0c;有时候会因为环境中的GCC版本导致编译错误&#xff0c;比如在mmdet3d&#xff0c;mmcv-full等库的使用中。 Your compiler (g 4.8.5) may be ABI-incompatible with PyTorch! Please use a compiler that is ABI-compatible with …

windows虚拟机VMware共享文件

1、设置本机电脑共享目录 2、设置所有人可连接 3、记录共享文件夹路径 4、设置当前用户密码 5、在虚拟机内映射驱动 6、在虚拟机内添入路径 7、输入用户名和密码 8、链接成功

BaseCTF-web-Week1

写在前面&#xff1a; 题目类型还是比较全&#xff0c;也都是基础题型&#xff0c;适合刚入门 CTF 的萌新学习&#xff0c;我之前在学校实验室预备队招新赛中也有出过一些类似的基础题&#xff0c;欢迎大家参考。 SNERT预备队招新CTF体验赛-Web&#xff08;SWCTF&#xff09;ht…