DevOps实战系列【第十章】:详解Jenkins Pipeline基本概念和语法

news2024/11/15 10:51:07

个人亲自录制全套DevOps系列实战教程手把手教你玩转DevOps全栈技术

流水线基本概念

官方中文手册:
https://www.jenkins.io/zh/doc/book/pipeline
我们最好在结合英文文档去看,因为翻译过来的中文比较乱。

Jenkins pipeline是一套插件,它支持实现和集成 continuous delivery pipelines 到Jenkins,即实现CD持续部署的功能。

Jekins的流水线插件会在安装Jenkins时通过“建议安装”的方式自动安装上,如果大家建议安装时失败了,可以单独下载Pipeline plugin去安装一下。

流水线提供了一组可扩展的工具,通过 Pipeline domain-specific language (DSL) syntax,翻译过来就是Pipeline有自己的语法DSL,基于groovy语法,对从简单到复杂的交付流水线进行建模。

Jenkins流水线的定义,需要创建一个Jenkinsfile文本文件,该文件除了可以直接定义在Jenkins的Job中还可以被提交到代码仓库管理(如:gitlab),这样流水线将会作为我们开发项目的一部分,像其他代码一样进行跟踪管理,所以建议使用gitlab管理jenkinsfile的方式去实施Jenkins的流水线。

说白了:jenkins 流水线 就是通过一个file文件来实现jenkins job的功能。

流水线的特点:为什么选择流水线?通过jenkins的配置不好吗?

  • 流水线可以通过代码仓库管理,方便我们进行迭代、审核等;
  • 流水线文件独立于jenkins的job,而配置方式比较难实现独立
  • 流水线可以在流程阶段做更丰富的操作,比如暂停,审核等交互式操作;
  • 流水线支持更多的插件扩展
    在这里插入图片描述

图中是一个通过管道(pipeline流水线)实现的从开发到生产的过程,其中每一个步骤都可以通过Jenkins的流水线的DSL语法去建模。

概念:SCM=>软件配置管理,他有很多实现工具,比如我们常用的gitlab就是一个SCM工具,而在本文中提到SCM我们默认使用的就是gitlab。

Jenkins流水线的语法有2种:

  • 脚本式:2014年12月
  • 声明式:2017年2月,为更简便易用而生

实际中我们的jenkinsfile中一般会混用两种语法。


流水线语法概念

  • pipeline:是用户定义的一个CD流水线模型,就是说他是我们定义的jenkinsfile的跟节点,流水线起始于pipeline块 。pipeline块中一般会包含stages块去完成一个应用程序构建、 测试和部署的阶段。
  • node(节点):它是Jenkins环境的一个机器并且能够执行流水线文件。
  • stage(阶段):stage 块中定义了不同的任务,比如 “Build”, “Test” 和 “Deploy” 阶段, 这些不同的任务可以通过多种插件去可视化展示或者也可以展示Jenkins执行pipeline的进度和状态。
  • step(步骤):是stage块中的一个任务,他可以告诉Jenkins去做什么,比如在Build节点,在这个任务中可以让Jenkins去执行make命令,注意需要使用sh "make"方式执行,不能直接通过make去执行。

注意:stages块和steps块在声明式和脚本是语法中都可以使用。


声明式语法举例:创建一个Jenkinsfile

// pipeline块作为jenkinsfile的根节点
pipeline {
	agent any      // 指定可以在任何空闲的代理上执行以下的stages块,代理指的是我们jenkins服务器,如果是集群的话就是其中的某个节点(声明式中必须要有agent)
	stages {       // 通过stages包括多个stage
    	stage('Build') {     //通过stage定义一个任务,这个任务我们取名叫做”Build“,即代表构建阶段要执行的步骤
        	steps { // 通过steps包括多个step,而每个step就是我们要执行的任务的具体内容,比如执行一个shell脚本等
            	echo "hello build"
        	}
    	}
    	stage('Test') { // 定义测试阶段
     	   steps { // 测试阶段需要执行的步骤
         	   echo "hello test"
       	 }
    	}
    	stage('Deploy') { // 定义部署阶段
     	   steps { //部署阶段需要执行的步骤
         	   echo "hello deploy"
        	}
    	}
	}
}

脚本式语法举例:创建一个Jenkinsfile

// 该节点和声明式中的agent是一个意思,表示在任意jenkins节点上执行以下stages,他不需要一个顶级的pipeline块,而是直接执行节点或任一节点执行以下阶段
node {
	// 在脚本式语法中stage块是可选的,即可以直接使用steps来定义步骤,但是如果定义了stage,该stage将可以在jenkins的图像化界面中展示
	stage('Build') { 
   		// 其实展示的就是"Build"名字,而对于声明式语法stage是一定要有的,如果不想展示图形化可以专门使用脚本式语法,然后不添加stage即可。            
		echo "hello build"           
	}
	stage('Test') { 
 	   // 这个里边定义的和声明式就一样了,定义当前步骤的steps
    	echo "hello test"      
	}
	stage('Deploy') { 
 	   echo "hello deploy"   
	}
}

语法详解

官方地址:https://www.jenkins.io/zh/doc/book/pipeline/syntax/

1.注释:Jenkinsfile文件中可以使用两种注释方式

  • // 注释一行内容
  • /* … 注释框选内容 … */

2.使用环境变量:
jenkins提供了很多内置的环境变量都可以在Jenkinsfile中使用,可以通过如下地址查看:
http://10.10.1.199:9078/pipeline-syntax/globals
使用方法:类似访问Groovy的map属性,关键字是env:${env.BUILD_ID}

pipeline {
	agent any
	stages {
 		stage('Example') {
     		steps {
         		echo "Running ${env.BUILD_ID} on ${env.JENKINS_URL}"
     		}
 		}
	}
}

注意:可以通过printenv或env将已有的环境变量输出

3.设置变量:声明式和脚本式有所不同
声明式语法:environment指令(块)

pipeline {
	agent any
	// 当前文件全局生效
	environment { 
	CC = 'clang'
	}
	stages {
		stage('Example') {
			// 局部生效,所有stage内的steps中可以使用
    		environment { 
      		  DEBUG_FLAGS = '-g'
    		}
    		steps {
     		   sh 'printenv'
    		}
		}
	}
}

脚本式语法:需要使用一个step为withEnv的命令来定义变量

node {
	/* 
	withEnv中设置的变量只能在当前块中生效\
	就是将环境变量添加到PATH中
	*/
	withEnv(["PATH+MAVEN=${tool 'M3'}/bin"]) {
		sh 'mvn -B verify'
	}
}

${tool ‘M3’}:其中tool是Jenkinsfile的工具命令,就是要使用一个工具,完整写法如:tool name: ‘maven3.8.6’, type: ‘maven’,其中name是我们配置的jenkins全局工具中的名称,而类型就是工具的名字,此处M3来自官网,即他定义了一个全局工具叫M3,此处是给环境变量设置了maven的bin目录,以便sh中的mvn命令得以正常执行,当然也可以直接不设置变量,通过sh “${tool ‘M3’}/bin/mvn -B verify”,注意是双引号,单引号不能执行插值语法

4.动态设置变量:
所有的脚本执行完后都会有返回状态returnStatusreturnStdout

注意:groovy是可以支持三种引号

  • 单引号:和我们java中定义字符串一样,不支持解析插值语法,即无法获取${变量名}的值
  • 双引号:可以进行字符串的拼接,且可以执行插值表达式(${变量名})
  • 三引号:支持字符串换行,注意:三引号也分三个单引号和三个双引号,意思和单引号、双引号一样,只不过是这里可以换行,如['''或"""]

注意:我们知道shell脚本执行结果是0或非0,而Jenkinsfile中采用了groovy中使用shell脚本获取返回值状态或标准输出的语法:

  • 获取标准输出的shell脚本
  • 获取执行状态的shell脚本
  • 无需返回值的shell脚本

// 获取标准输出
// 第一种
result = sh returnStdout: true ,script: "<shell command>"
// 返回结果末尾会有空格,所以trim()一下
result = result.trim()
// 第二种
result = sh(script: "<shell command>", returnStdout: true).trim()
// 第三种
sh "<shell command> > commandResult"
result = readFile('commandResult').trim()

// 获取执行状态
// 第一种
result = sh returnStatus: true ,script: "<shell command>"
result = result.trim()
// 第二种
result = sh(script: "<shell command>", returnStatus: true).trim()
// 第三种
sh '<shell command> > status'
def r = readFile('status').trim()

//无需返回值,仅执行shell命令
//最简单的方式
sh '<shell command>'

动态定义变量Jenkinsfile脚本如下:

pipeline {
   agent any 
   environment {
       // 使用 returnStdout
       CC = """${sh(
               returnStdout: true,
               script: 'echo "clang"'
       )}""" 
       // 使用 returnStatus
       EXIT_STATUS = """${sh(
               returnStatus: true,
               script: 'exit 1'
       )}"""
   }
   stages {
       stage('Example') {
           environment {
               DEBUG_FLAGS = '-g'
           }
           steps {
               // 输出所有变量
               sh 'printenv'
           }
       }
   }
}

5.凭证:
jenkins中我们可以创建与第三方进行鉴权的凭证,比如我们之前创建的凭证ID有:gitlab、sonar-key
在这里插入图片描述
用法:在environment块中使用credentials('凭证ID')为变量赋值,然后通过在脚本中使用变量进行鉴权

pipeline {
	agent any
	environment {
 	   // 基于用户名和密码方式的凭证赋值,可以使用$USERNAME_PASSWORD_KEY使用凭证,内容格式为[username:passwd]
    	// 用户名密码的凭证,除了会赋值外,jenkins还会自动创建2个变量,名字为当前定义的变量后加"_USR"和"_PSW",即可以单独获取用户名和密码
	     USERNAME_PASSWORD_KEY = credentials('gitlab')
 	   // 基于Secret文本方式的凭证赋值,可以通过$SONAR_KEY使用凭证
    	SONAR_KEY = credentials('sonar-key')
	}
	stages {
 	   stage('Example stage 1') {
     	   steps {
         	   // 
        	}
    	}
	}
}

注意:如果要生成其他凭证,比如ssh秘钥或证书,那么需要使用jenkins提供的【片段生成器】,选用withCredentials: Bind credentials to variables来生成脚本
地址:http://10.10.1.199:9078/job/p1/pipeline-syntax/
在这里插入图片描述

// 注意:keyFileVariable可以用来接收我们配置的ssh的证书信息,比如我指定了私钥内容,可以通过指定keyFileVariable='ABC',然后通过$ABC来获取私钥内容
withCredentials([sshUserPrivateKey(credentialsId: 'gitlab-ssh', keyFileVariable: '')]) {
	// some block
}

6.字符串插值:使用groovy语法

// 单引号、双引号、三引号都可以
def singlyQuoted = 'Hello'
def doublyQuoted = "World"

echo 'Hello Mr. ${singlyQuoted}'  // 注意:单引号不能解析表达式,将会原样输出
echo "I said, Hello Mr. ${doublyQuoted}"

7.参数:配置完的参数都会作为params内置变量的属性被使用。

  • 声明式语法:可以通过在parameters指令中定义参数
  • 脚本式语法:可以通过properties步骤,类似withEnv

pipeline {
   agent any
   // 指定参数
   parameters {
       // 参数名=Greeting, 值=Hello
       stringname: 'Greeting', defaultValue: 'Hello', description: 'How should I greet the world?')
   }
   stages {
       stage('Example') {
           steps {
               // 使用内置params属性引用参数
               echo "${params.Greeting} World!"
           }
       }
   }
}

8.故障处理

  • 声明式:使用post指令支持对多个条件进行处理,**包括:always、unstable、success、failure和changed **
  • 脚本式:使用groovy内置语法try…catch…finally

pipeline {
   agent any
   stages {
       stage('Test') {
           steps {
               sh 'make check'
           }
       }
   }
   // 后处理阶段
   post {
       // 不管前边阶段什么结果都执行
       always {
           echo "always is printed!"
       }
       // 前边阶段失败才会执行
       failure {
           // mail to: team@example.com, subject: 'The Pipeline failed :('
           echo "failure is printed!"
       }
       // 前边阶段成功才会执行
       success {
           echo "success!"
       }
   }
}
node {
   stage('Test') {
       try {
           sh 'make check'
       }
       finally {
           // 通过junit插件实现生成xml测试报告到target目录
           junit '**/target/*.xml'
       }
   }
}

9.多代理指定:agent指令,前边我们只配置过agent:any,并且都在顶级pipeline块中配置的,属于全局作用域

一个Jenkinsfile还可以给不同的stage阶段配置不同的agent代理。这样不同的阶段可以被不同的jenkins节点去执行。

注意:jenkins集群或单机都可以指定label标签:系统管理->节点管理

pipeline {
// 该属性为必填属性,所以全局先定义成不启用jenkins节点
	agent none
	stages {
 	   stage('Build') {
     	   // 指定Build阶段使用任何一个jenkins节点都可执行
        	agent any
        	steps {
				checkout scm
            	sh 'make'
            	// stash 是一个暂存命令插件,可以将内容暂存到jenkins master节点,通过unstash取出存储的内容
            	stash includes: '**/target/*.jar', name: 'app' 
        	}
		}
    	stage('Test on Linux') {
			// 指定Test on Linux阶段,只能使用被标签为linux的jenkins节点执行
        	agent { 
         	   label 'linux'
        	}
        	steps {
            	unstash 'app' 
            	sh 'make check'
        	}
        	post {
            	always {
                	junit '**/target/*.xml'
            	}
        	}
    	}
    	stage('Test on Windows') {
        	// 指定Test on Windows阶段,只能使用被标签为windows的jenkins节点执行
        	agent {
            	label 'windows'
        	}
        	steps {
            	unstash 'app'
            	bat 'make check' 
        	}
        	post {
            	always {
                	junit '**/target/*.xml'
            	}
        	}
    	}
	}
}

脚本式可以使用node指令:如果要指定标签,则通过node(‘label’){…}

10.步骤step的参数简化写法:就是如果一个step语句可以省略参数外部的括号
在groovy中创建map的方式如[key1:value1, key2:value2],而step中多数命令都是以map作为参数:

省略参数外部的所有括号

git([url: 'git://example.com/amazing-project.git', branch: 'master'])

// ==> 简化方式
git url: 'git://example.com/amazing-project.git', branch: 'master'

只有一个参数时,除了括号参数名也可省略

sh([script: 'echo hello'])

// ==> 简化方式
sh 'echo hello'

11.并发执行:脚本式语法的高级应用,作为基于groovy的语法,脚本式语法几乎可以直接使用groovy的所有语法而无需修改

优化:第9个案例中,Test on Linux和Test on Windows两个阶段是串行执行,我们此处改为并发执行

指令:parallel

stage('Test') {
	// 并发执行,此处指定的linux是一个parallel的一个分支而已,随意取名,不必和jenkins节点的label相同
	parallel linux: {
    	// 脚本式语法选择linux标签的jenkins节点执行
    	node('linux') {
        	checkout scm
        	try {
            	unstash 'app'
            	sh 'make check'
        	}
        	finally {
            	junit '**/target/*.xml'
        	}
    	}
	},
	// parallel的另一个并发执行的分支
	windows: {
    	node('windows') {
        	/* .. snip .. */
    	}
	}
}

12.options:可以设置一些jenkins底层对于当前配置此属性块的pipeline的属性限制

比如:当前流水线失败后是否可以重试、是否打印时间戳、是否设置超时时间等

pipeline {
	agent any
	// 设置1小时超时时间,超过1小时该job还没运行完则终止执行,也可以配置在stage阶段块内部,但设置项较少,参考官网看一下
	options {
    	timeout(time: 1, unit: 'HOURS') 
	}
	stages {
    	stage('Example') {
        	steps {
            	echo 'Hello World'
        	}
    	}
	}
}

13.input:可以在执行某个stage阶段时,通过图形化界面与用户交互,即确认后才能继续执行流水线任务,当然也可以取消执行。

pipeline {
	agent any
	stages {
    	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."
        	}
    	}
	}
}

14.when:指令允许流水线根据给定的条件决定是否应该执行stage阶段。

参考官网:https://www.jenkins.io/zh/doc/book/pipeline/syntax/#when

15.script:声明式中如果想嵌入脚本,即执行定义变量、方法等groovy语法,需要使用script指令来嵌入

pipeline {
	agent any
	stages {
    	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"
                	}
            	}
        	}
    	}
	}
}

16.tools:可以将我们配置到全局工具中的工具导入到环境变量PATH中,方便我们下文直接使用命令,否则就需要使用绝对路径。

目前只支持:mavenjdkgradle

pipeline {
	agent any
	tools {
    	// 注意"maven3.8.6"是我们全局工具中定义的名字
    	maven "maven3.8.6"
	}
	stages {
    	stage('Example') {
        	steps {
            	// 此处可以直接使用maven的命令而无需指定绝对路径
            	sh 'mvn --version'
        	}
    	}
	}
}

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

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

相关文章

MySQL 日志,难怪被模仿

一.前言 日志是mysql数据库的重要组成部分&#xff0c;记录着数据库运行期间各种状态信息。mysql日志主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。 通过分析日志&#xff0c;我们可以优化数据库性能&#xff0c;排除故障&#xff0c;甚至能够还原数…

中文文献检索网站

1. 中国知网 网址&#xff1a; https://www.cnki.net/ 中国知网被称众多科研人称国内文献论文最全最权威的中文文献库&#xff0c;知网提供中国学术文献、外文文献、学位论文、报纸、会议、年鉴、工具书等各类资源统一检索、统一导航、在线阅读和下载服务。 2. 掌桥科研 网址…

25.Django大型电商项目之地址管理——如何使用三级联动菜单数据加载地址、保存数据、动态获取数据、设置默认值

1. 地址管理基本页面 1.1 概述 1.2 流程 修改templates的跳转链接center.html <ul><li><a href"/userapp/address/">地址管理</a></li> </ul>templates {% extends base.html %} {% block title %}用户中心{% endblock %} {…

东北大学数据结构第八周(排序)

7-1 快速排序 作者 朱允刚 单位 吉林大学 给定包含n个元素的整型数组a[1],a[2],…,a[n]&#xff0c;利用快速排序算法对其进行递增排序&#xff0c;请输出排序过程&#xff0c;即每次Partition之后的数组。每次选择所处理的子数组的第一个元素作为基准元素。 输入格式: 输入为…

MapReduce 序列化案例

文章目录MapReduce 序列化案例一、案例需求二、案例分析map 阶段Reduce 阶段三、代码实现1、编写流量统计的Bean对象2、Mapper阶段代码MapReduce 序列化案例 一、案例需求 1、需求&#xff1a; 统计每一个手机号耗费的总上行流量&#xff0c;下行流量&#xff0c;总流量 2、输…

二、ZFNet可视化卷积神经网络——可解释性机器学习(DataWhale组队学习)

目录引言ZFNet的网络结构可视化反卷积反池化反激活反卷积训练细节特征可视化特征演化特征不变性局部遮挡测试敏感性分析相关性分析消融实验宽度影响深度影响迁移学习能力有效性分析总结引言 纽约大学ZFNet&#xff0c;2013年ImageNet图像分类竞赛冠军模型。对AlexNet进行改进的…

AOP 操作

AOP 操作AOP 操作&#xff08;准备&#xff09;1. Spring 框架一般是基于 AspectJ 实现 AOP 操作&#xff08;1&#xff09;什么是 AspectJ2. 基于 AspectJ 实现 AOP 操作3. 在项目工程里面引入 AOP 先关的依赖4. 切入点表达式举例1&#xff1a;对 com.fairykunkun.dao.UserDao…

谈谈自己对依赖注入的理解

1. 絮絮叨叨 1.1 想学习Google Guice 在工作的过程中&#xff0c;发现有名的大数据组件Presto大量使用Google Guice实现各种Module的构建 很多bind(interface).to(implementClass).in(scope)语句&#xff0c;实现接口与实现类的绑定&#xff0c;并指定实现类是单例还是多例 /…

Service的绑定过程

前言 Service的绑定过程将分为两个部分来进行讲解&#xff1b;分别是Contextlmpl到AMS的调用过程和Service的绑定过程。 frameworks/base/core/java/android/content/ContextWrapper.javapublic boolean bindService(Intent service, ServiceConnection conn,int flags) {ret…

计算机毕设Python+Vue-新型冠状病毒防控咨询网站(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

根据端口划分虚拟局域、集线器、中继器、交换机、路由器、网桥----计算机网络

集线器&#xff1a; 连接计算机和交换机&#xff0c;类似于多台中继器。 实现多台电脑的同时使用一个进线接口来上网或组成局域网 中继器&#xff1a; 连接两条电缆&#xff0c;作用是放大前一条电缆里面的信号并传入下一条电缆。 是对接收到的信息进行再生放大&#xff0c;以…

Jenkins + Jmeter + Ant 持续集成

搭建提前安装好&#xff1a;ant Jenkins 环境 一、Jenkins 安装 Ant 插件&#xff1a; 进入Jenkins 配置插件页面&#xff0c;安装ant 插件&#xff1a; 打开插件配置页面&#xff0c;如下图&#xff1a; 点击“Available” 在输入框搜索 ant 安装即可&#xff1a; 二、安装…

计算机毕业设计springboot+vue基本微信小程序的透析耗材管理系统

项目介绍 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理程序应运而生,各行各业相继进入信息管理时代,透析耗材管理小程序就是信息时代变革中的产物之一。 任何程序都要遵循…

vue前端案例教学:动态获取最新疫情数据展示(代码详解)

【辰兮要努力】&#xff1a;hello你好我是辰兮&#xff0c;很高兴你能来阅读&#xff0c;昵称是希望自己能不断精进&#xff0c;向着优秀程序员前行&#xff01; 博客来源于项目以及编程中遇到的问题总结&#xff0c;偶尔会有读书分享&#xff0c;我会陆续更新Java前端、后台、…

[leetcode.4]寻找两个正序数组的中位数 多思考边界

题目展示 题目要点 题目其实本身的思路非常简单&#xff0c;就是把两个数组给合并起来&#xff0c;然后寻找中位数&#xff0c;具体可以参考我们使用归并排序时候的最后一步&#xff0c;这题的难点其实在于&#xff08;1&#xff09;时间压缩到lognm&#xff08;2&#xff09;…

[附源码]Nodejs计算机毕业设计基于与协同过滤算法的竞赛项目管理Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

基于MMEngine和MMDet搭建目标跟踪框架MMTracking-1.0.0rc1-Win10

缘由&#xff1a; 1. 目标跟踪是工业检测和学术研究的基础课题&#xff0c;其pipeline通常分为视频目标检测、视频实例分割、单目标跟踪、多目标跟踪和Re-ID五类&#xff0c;同时&#xff0c;还细分为在线检测和离线检测两种任务模式。由于现阶段关于目标跟踪的教程较少&#…

机器学习 KNN算法原理

目录 一&#xff1a;KNN算法概念 二&#xff1a;KNN原理 三&#xff1a;KNN超参数 四&#xff1a;KNN算法选择 一&#xff1a;KNN算法概念 KNN(K-Nearest Neighbor)法即K最邻近法&#xff0c;最初由Cover和Hart于1968年提出&#xff0c;是最简单的机器学习算法之一 算法思路…

NNDL 作业9:分别使用numpy和pytorch实现BPTT

6-1P&#xff1a;推导RNN反向传播算法BPTT. 6-2P&#xff1a;设计简单RNN模型&#xff0c;分别用Numpy、Pytorch实现反向传播算子&#xff0c;并代入数值测试.、 forward&#xff1a; 我们知道循环卷积网络的cell的计算公式为&#xff1a; stf(UxtWst−1)\mathrm{s}_tf(…

UML学习入门

UML 举一个简单的例子&#xff0c;来看这样一副图&#xff0c;其中就包括了UML类图中的基本图示法。 首先&#xff0c;看动物矩形框&#xff0c;它代表一个类&#xff08;Class&#xff09;。类图分三层&#xff0c;第一层显示类的名称&#xff0c;如果是抽象类&#xff0c;则…