jenkins-pipeline语法总结(最全)

news2024/11/15 6:52:51

1、jenkins总结之pipeline语法

jenkins总结之pipeline语法

  • 1、jenkins总结之pipeline语法
    • 1.1必要的Groovy知识
    • 1.2pipeline的组成
      • 1.2.1pipeline最简结构
    • 1.3post部分
    • 1.4pipeline支持的指令
        • • environment:
        • • tools:
        • • input:
        • • options:
        • • parallel:
        • • parameters:
        • • triggers:
    • 1.5配置pipeline本身
    • 1.6在声明式pipeline中使用脚本
    • 1.7pipeline内置基础步骤
      • 1.7.1 文件目录相关步骤
        • deleteDir:删除当前目录
        • dir:切换到目录
        • fileExists:判断文件是否存在
        • pwd:确认当前目录
        • writeFile:将内容写入指定文件中
        • readFile:
      • .7.2 制品相关步骤
      • 1.7.3 命令相关步骤
      • 1.7.4 其他步骤
    • 1.8小结

1.1必要的Groovy知识

  • 习惯定义变量使用def关键字 def x=“abc” def y=1。
  • Groovy语句最后的分号是不必须的
  • 方法调用可以省略括号
  • 方法 调用支持命名参数

def createName(String givenName, String familyName){
  return givenName + " " familyName
}

//调用
createName(familyNmae = "Lee",givenName = "Bruce")
  • 支持默认传参

def createName(String givenName = "nicai"){
  return givenName + " " familyName
}

//调用
createName()
  • 支持单引号、双引号。双引号支持插值,单引号不支持
def name = 'world'
print "hello ${name}" // 结果hello world
print 'hello ${name}'	// 结果hello ${name}
  • 支持三引号。三引号分为三单引号和三双引号。都支持换行,区别同上双引号支持插值。
  • 支持闭包。
//支持闭包
def codeBlock = {print "hello closure"}
//闭包可以直接被当成函数调用
codeBlock()   //闭包就是函数名可以作为参数传递。

1.2pipeline的组成

1.2.1pipeline最简结构

jenkins的必须部分有以下五个,少一个都不行都会报错。

  • pipeline

    代表整条流水线,包含整条流水线的逻辑。

  • stage

​ 阶段,代表流水线的阶段。每个阶段都必须有名称。

  • stages

​ 流水线中多个stage的容器。stages部分至少包含一个stage。

  • steps

​ 代表阶段中的一个或多个具体步骤(step)的容器。steps部分至少包含一个步骤

  • agent部分

​ 指定流水线的执行位置(Jenkins agent)

1.3post部分

post部分包含的是在整个pipeline或阶段完成后一些附加的步骤。post部分是可选的,所以并不包含在pipeline最简结构中。但这并不代表它作用不大。根据pipeline或阶段的完成状态,post部分分成多种条件块,包括:

  • • always:不论当前完成状态是什么,都执行。

  • • changed:只要当前完成状态与上一次完成状态不同就执行。

  • • fixed:上一次完成状态为失败或不稳定(unstable),当前完成状态为成功时执行。

  • • regression:上一次完成状态为成功,当前完成状态为失败、不稳定或中止(aborted)时执行。

  • • aborted:当前执行结果是中止状态时(一般为人为中止)执行。

  • • failure:当前完成状态为失败时执行。

  • • success:当前完成状态为成功时执行。

  • • unstable:当前完成状态为不稳定时执行。

  • • cleanup:清理条件块。不论当前完成状态是什么,在其他所有条件块执行完成后都执行

1.4pipeline支持的指令

Jenkins pipeline支持的指令有:

• environment:

​ 用于设置环境变量,可定义在stage或pipeline部分。

environment指令指定一系列键值对,这些对值将被定义为所有步骤的环境变量或阶段特定步骤,具体取决于environment指令位于pipeline中的位置。

该指令支持一种特殊的帮助方法credentials(),可以通过其在Jenkins环境中的标识符来访问预定义的凭据。对于类型为Secret Text的凭据,该credentials()方法将确保指定的环境变量包含Secret Text内容。对于“标准用户名和密码”类型的凭证,指定的环境变量将被设置为,username:password并且将自动定义两个附加的环境变量:MYVARNAME_USRMYVARNAME_PSW相应的。

Jenkinsfile (Declarative Pipeline)
pipeline {
    agent any
    environment { 
        CC = 'clang'
    }
    stages {
        stage('Example') {
            environment { 
                AN_ACCESS_KEY = credentials('my-prefined-secret-text') 
            }
            steps {
                sh 'printenv'
            }
        }
    }
}

Jenkins内置变量:

下面我们简单介绍几个在实际工作中经常用到的变量。

• BUILD_NUMBER:构建号,累加的数字。在打包时,它可作为制品名称的一部分,比如server-2.jar。

• BRANCH_NAME:多分支pipeline项目支持。当需要根据不同的分支做不同的事情时就会用到,比如通过代码将release分支发布到生产环境中、master分支发布到测试环境中。

• BUILD_URL:当前构建的页面URL。如果构建失败,则需要将失败的构建链接放在邮件通知中,这个链接就可以是BUILD_URL。

• GIT_BRANCH:通过git拉取的源码构建的项目才会有此变量。

• tools:

​ 可定义在pipeline或stage部分。它会自动下载并安装我们指定的工具,并将其加入PATH变量中。

定义自动安装并放在上的工具的部分PATH。如果agent none指定,则将其忽略。

pipeline {
    agent any
    tools {
        maven 'apache-maven-3.0.1' 
    }
    stages {
        stage('Example') {
            steps {
                sh 'mvn --version'
            }
        }
    }
}

• input:

​ 定义在stage部分,会暂停pipeline,提示你输入内容。

input指令stage允许使用inputstep提示输入。在stage将暂停任何后options已被应用,并在进入前agent块为stage或评估when的条件stage。如果input批准,stage则将继续。作为input提交的一部分提供的任何参数将在其余的环境中可用stage

可选项

  • message 必需的,这将在用户提交时显示给用户input
  • id 可选标识符input,默认为stage名称
  • ok input表单上“确定”按钮的可选文本
  • submitter 可选的逗号分隔列表,这些列表允许用户提交此用户或外部组名input。默认为允许任何用户。
  • submitterParameter 环境变量的可选名称,用该submitter名称设置(如果存在)
  • parameters 提示提交者提供的可选参数列表。请参阅parameters以获取更多信息
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."
            }
        }
    }
}

在这里插入图片描述
在这里插入图片描述

• options:

用于配置Jenkins pipeline本身的选项,比如options {retry(3)}指当pipeline失败时再重试2次。options指令可定义在stage或pipeline部分。

options指令允许在Pipeline本身内配置Pipeline专用选项。Pipeline提供了许多这些选项,例如buildDiscarder,但它们也可能由插件提供,例如timestamps

可用选项

  • buildDiscarder 持久化工件和控制台输出,用于最近Pipeline运行的具体数量。例如:options { buildDiscarder(logRotator(numToKeepStr: '1')) }

  • disableConcurrentBuilds 不允许并行执行Pipeline。可用于防止同时访问共享资源等。例如:options { disableConcurrentBuilds() }

  • overrideIndexTriggers 允许覆盖分支索引触发器的默认处理。 如果分支索引触发器在多分支或组织标签中禁用, options { overrideIndexTriggers(true) }将只允许它们用于促工作。否则, options { overrideIndexTriggers(false) }只会禁用改作业的分支索引触发器。

  • skipDefaultCheckout 在agent指令中默认跳过来自源代码控制的代码。例如:options { skipDefaultCheckout() }

  • skipStagesAfterUnstable 一旦构建状态进入了“不稳定”状态,就跳过阶段。例如:options { skipStagesAfterUnstable() }

  • checkoutToSubdirectory 在工作空间的子目录中自动地执行源代码控制检出。例如: options { checkoutToSubdirectory('foo') }

  • timeout 设置Pipeline运行的超时时间,之后Jenkins应该中止Pipeline

如果 pipeline 执行时间过长,超出了我们设置的 timeout 时间,Jenkins 将中止pipeline。以下例子中以小时为单位,还可以以 SECONDS(秒)、MINUTES(分钟)为单位。当使用timeout选项时,options可以被放在stage块中。例如:

options { timeout(time: 1, unit: 'HOURS') }
  • retry 失败后,重试整个Pipeline指定的次数。例如:options { retry(3) }

  • timestamps 预处理由Pipeline生成的所有控制台输出运行时间与发射线的时间。例如:options { timestamps() }

pipeline {
    agent any
  	//增加时间戳
    options { timestamps() }
    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."
            }
        }
    }
}

• parallel:

​ 并行执行多个step。在pipeline插件1.2版本后,parallel开始支持对多个阶段进行并行执行。

​ 声明性管道中的阶段可能有一个parallel部分,其中包含要并行运行的嵌套阶段的列表。需要注意的是一个阶段都必须有且只有一个stepsstagesparallel,或matrix。这是不可能的嵌套parallelmatrix块内stage,如果该指令stage指令嵌套在一个parallelmatrix阻塞本身。然而,stage一个内指令parallelmatrix块可以使用的所有其它的功能stage,包括agenttoolswhen等。

此外,你可以parallel阶段时,它们中的任何一个发生故障,所有被中止,加入failFast truestage含有parallel。添加的另一个选项failfast是在管道定义中添加一个选项:parallelsAlwaysFailFast()

pipeline {
    environment {
        name1="这是name1"
    }

    agent any

    stages {
        stage('Build') {

            input {
               message '请选择版本号'
               ok '提交'
               submitter 'devops'
               parameters {
               choice choices: ['1.1.1', '1.1.2'], description: '', name: 'VERSION'
                }
            }

            steps {
                echo 'Building..'
                echo "${name1}"
            }
        }
        stage('Test') {
            //parallel test
            parallel {
                stage('parallel测试1'){
                    steps {
                        echo "parallel test 1"
                    }
                }
                
                stage('parallel测试2'){
                    steps {
                        echo "parallel test 2"
                    }
                }
                
                stage('parallel测试3'){
                    steps {
                        echo "parallel test 3"
                    }
                }
            }
        }
        stage('Deploy') {
            steps {
                echo 'Deploying....'
            }
        }
    }
}

在这里插入图片描述

• parameters:

​ 与input不同,parameters是执行pipeline前传入的一些参数。

  • string 字符串类型的参数,例如:
parameters { string(name: 'DEPLOY_ENV', defaultValue: 'staging', description: '') }
  • text 文本参数,可以包含多行,例如:
parameters { text(name: 'DEPLOY_TEXT', defaultValue: 'One\nTwo\nThree\n', description: '') }
  • booleanParam 布尔参数,例如:
parameters { booleanParam(name: 'DEBUG_BUILD', defaultValue: true, description: '') }
  • choice 选择参数,例如:
parameters { choice(name: 'CHOICES', choices: ['one', 'two', 'three'], description: '') }
  • password 密码参数,例如:
parameters { password(name: 'PASSWORD', defaultValue: 'SECRET', description: 'A secret password') }
pipeline {
    agent any
    parameters {
        string(name: 'PERSON', defaultValue: 'Mr Jenkins', description: 'Who should I say hello to?')
        text(name: 'BIOGRAPHY', defaultValue: '', description: 'Enter some information about the person')
        booleanParam(name: 'TOGGLE', defaultValue: true, description: 'Toggle this value')
        choice(name: 'CHOICE', choices: ['One', 'Two', 'Three'], description: 'Pick something')
        password(name: 'PASSWORD', defaultValue: 'SECRET', description: 'Enter a password')
    }
    stages {
        stage('Example') {
            steps {
                echo "Hello ${params.PERSON}"
                echo "Biography: ${params.BIOGRAPHY}"
                echo "Toggle: ${params.TOGGLE}"
                echo "Choice: ${params.CHOICE}"
                echo "Password: ${params.PASSWORD}"
            }
        }
    }
}

• triggers:

用于定义执行pipeline的触发器。• when:当满足when定义的条件时,阶段才执行。

triggers指令定义了应重新触发的自动化方式。对于与GitHubBitBucket之类的源集成的管道,triggers由于基于Webhooks的集成可能已经存在,因此可能没有必要。目前可用的触发器 cronpollSCMupstream

  • cron 接受cron样式的字符串来定义应重新触发管道的常规间隔,例如:triggers { cron('H */4 * * 1-5') }
  • pollSCM 接受cron样式的字符串以定义Jenkins应检查新源更改的定期间隔。如果存在新的更改,则将重新触发管道。例如:triggers { pollSCM('H */4 * * 1-5') }
  • upstream 接受以逗号分隔的作业字符串和阈值。当字符串中的任何作业以最小阈值结束时,将重新触发管道。例如: triggers { upstream(upstreamProjects: 'job1,job2', threshold: hudson.model.Result.SUCCESS) }
// Declarative //
pipeline {
    agent any
    triggers {
        cron('H */4 * * 1-5')
      	'''
      	每15分钟构建一次:H/15 * * * * 或*/5 * * * *
				每天8点构建一次:H 8 * * *
				每天8点~17点,两小时构建一次:H 8-17/2 * * *
				周一到周五,8点~17点,两小时构建一次:H 8-17/2 * * 1-5
				每月1号、15号各构建一次,除12月:H H 1,15 1-11 *

				第1列分钟1~59
				第2列小时0~23
				第3列日1~31
				第4列月1~12
				第5列星期0~7(0和7表示星期日)
      	'''
    }
    stages {
        stage('Example') {
            steps {	
                echo 'Hello World'
            }
        }
    }
}

1.5配置pipeline本身

options指令用于配置整个Jenkins pipeline本身的选项。

用于配置Jenkins pipeline本身的选项,比如options {retry(3)}指当pipeline失败时再重试2次。options指令可定义在stage或pipeline部分。

options指令允许在Pipeline本身内配置Pipeline专用选项。Pipeline提供了许多这些选项,例如buildDiscarder,但它们也可能由插件提供,例如timestamps

可用选项

  • buildDiscarder 持久化工件和控制台输出,用于最近Pipeline运行的具体数量。例如:options { buildDiscarder(logRotator(numToKeepStr: '1')) }

  • disableConcurrentBuilds 不允许并行执行Pipeline。可用于防止同时访问共享资源等。例如:options { disableConcurrentBuilds() }

  • overrideIndexTriggers 允许覆盖分支索引触发器的默认处理。 如果分支索引触发器在多分支或组织标签中禁用, options { overrideIndexTriggers(true) }将只允许它们用于促工作。否则, options { overrideIndexTriggers(false) }只会禁用改作业的分支索引触发器。

  • skipDefaultCheckout 在agent指令中默认跳过来自源代码控制的代码。例如:options { skipDefaultCheckout() }

  • skipStagesAfterUnstable 一旦构建状态进入了“不稳定”状态,就跳过阶段。例如:options { skipStagesAfterUnstable() }

  • checkoutToSubdirectory 在工作空间的子目录中自动地执行源代码控制检出。例如: options { checkoutToSubdirectory('foo') }

  • timeout 设置Pipeline运行的超时时间,之后Jenkins应该中止Pipeline

如果 pipeline 执行时间过长,超出了我们设置的 timeout 时间,Jenkins 将中止pipeline。以下例子中以小时为单位,还可以以 SECONDS(秒)、MINUTES(分钟)为单位。当使用timeout选项时,options可以被放在stage块中。例如:

options { timeout(time: 1, unit: 'HOURS') }
  • retry 失败后,重试整个Pipeline指定的次数。例如:options { retry(3) }

  • timestamps 预处理由Pipeline生成的所有控制台输出运行时间与发射线的时间。例如:options { timestamps() }

pipeline {
    agent any
  	//增加时间戳
    options { timestamps() }
    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."
            }
        }
    }
}

1.6在声明式pipeline中使用脚本

Jenkins pipeline专门提供了一个script步骤,你能在script步骤中像写代码一样写pipeline逻辑

在script块中的其实就是Groovy代码。大多数时候,我们是不需要使用script步骤的。如果在script步骤中写了大量的逻辑,则说明你应该把这些逻辑拆分到不同的阶段,或者放到共享库中。共享库是一种扩展Jenkins pipeline的技术。

1.7pipeline内置基础步骤

1.7.1 文件目录相关步骤

deleteDir:删除当前目录

deleteDir是一个无参步骤,删除的是当前工作目录。通常它与dir步骤一起使用,用于删除指定目录下的内容。

dir:切换到目录

默认pipeline工作在工作空间目录下,dir步骤可以让我们切换到其他目录

fileExists:判断文件是否存在

fileExists(‘/tmp/a.jar’)判断/tmp/a.jar文件是否存在。如果参数是相对路径,则判断在相对当前工作目录下,该文件是否存在。结果返回布尔类型。

pwd:确认当前目录

pwd与Linux的pwd命令一样,返回当前所在目录。它有一个布尔类型的可选参数:tmp,如果参数值为true,则返回与当前工作空间关联的临时目录。

writeFile:将内容写入指定文件中

writeFile支持的参数有:

  • • file:文件路径,可以是绝对路径,也可以是相对路径。

  • • text:要写入的文件内容。

  • • encoding(可选):目标文件的编码。如果留空,则使用操作系统默认的编码。如果写的是Base64的数据,则可以使用Base64编码

readFile:

读取文件内容读取指定文件的内容,以文本返回。

readFile支持的参数有:

  • • file:路径,可以是绝对路径,也可以是相对路径。

  • • encoding(可选):读取文件时使用的编码。示例如下:

// Declarative //
pipeline {
    agent any
    triggers {
        cron('H */4 * * 1-5')
    }
    stages {
        stage('Example') {
            steps {
                script{
                    echo 'Hello World'
                    dir("/Volumes/MyPassport/jenkins/var"){
                        deleteDir()
                    }
                    json_file = "/Volumes/MyPassport/jenkins/te/test.txt"
                    if(fileExists(json_file) == true) {
                      echo("${json_file} file is exists")  // 打印
                    }else {
                      error("here haven't find json file")  // 打印错误信息
                    }
                    // 读文件
                    file_contents = readFile json_file
                    println file:"${file_contents}",encoding: 'UTF-8'

                    // 写入文件的路径
                    write_file_path  = "/Volumes/MyPassport/jenkins/te/test1.txt"
                    // 写入的内容
                    file_contents_wr = 'Hell, 我是大海!'
                    // 写入操作
                    writeFile file: write_file_path, text: file_contents_wr, encoding: "UTF-8"
                    // 读取写入的文件
                    fileContents_wr = readFile file:"${write_file_path }",encoding: 'UTF-8'
                    println fileContents_wr

                    println pwd()

                }
                
            }
            
        }
    }
}

执行结果

Started by user liwei
[Pipeline] Start of Pipeline
[Pipeline] node
Running on Jenkins in /Users/liwei/.jenkins/workspace/triggersTest
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Example)
[Pipeline] script
[Pipeline] {
[Pipeline] echo
Hello World
[Pipeline] dir
Running in /Volumes/MyPassport/jenkins/var
[Pipeline] {
[Pipeline] deleteDir
[Pipeline] }
[Pipeline] // dir
[Pipeline] fileExists
[Pipeline] echo
/Volumes/MyPassport/jenkins/te/test.txt file is exists
[Pipeline] readFile
[Pipeline] echo
{file=abcdefg
, encoding=UTF-8}
[Pipeline] writeFile
[Pipeline] readFile
[Pipeline] echo
Hell, 我是大海!
[Pipeline] pwd
[Pipeline] echo
/Users/liwei/.jenkins/workspace/triggersTest
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

.7.2 制品相关步骤

1.7.3 命令相关步骤

1.7.4 其他步骤

1.8小结

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

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

相关文章

大学网课查题接口

大学网课查题接口 本平台优点: 多题库查题、独立后台、响应速度快、全网平台可查、功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库: 查题校园题库:查题校园题库后台(点击跳…

项目管理逻辑:老板为什么赔钱的项目也做?为什么害怕你闲着?

目录 1.波士顿矩阵 2.为什么企业还要做没有市场占有率,也没有销售增长率的产品? 2.1项目层级划分 2.2项目集 2.3组合管理 2.4赔钱也做的项目案例 1.波士顿矩阵 项目经理没有资源, 公司不给足够的支持 在任何一个企业老板的脑子里,都会有这样一个矩阵, 纵向表示销售增长…

数据结构与算法,MySQL数据库面试专题及答案

文章目录数据结构面试题及答案数组问题字符串相关问题链表问题二叉树问题编程面试问题之杂项答案数据结构与算法时间复杂度 并不是计算程序具体运行的时间,而是算法执行语句的次数 O(2^n) 表示对 n 数据处理需要进行 2^n 次计算 多项式的时间复杂度 数据 n 在表达式…

Docker安装部署Redis集群

目录 概述 一、创建文件和目录 1.1 创建需要挂载的文件和目录 1.2 同步操作 二、随机从节点模式 2.1 创建master节点的redis容器 2.2 在同一台机器上创建另外2个节点 2.3 其他2台机器同步操作 2.4 配置主从集群 2.4.1 进入任意一个 Redis 实例 2.4.2 配置集群 2.4…

《未来简史:从智人到智神》笔记一——人类的新议题

目录 一、人类的旧议题演变 二、人类的新议题 1、长生不死 2、追求幸福快乐 3、努力把自己升级为神 三、研究历史的意义——不是为了重复过去,而是为了摆脱过去并从中获得解放 四、生命的意义 1、主观体验有两个基本特征 2、生命的意义? 一、人类…

C语言第十三课:初阶指针

目录 前言: 一、指针是什么: 1.那么指针到底是什么呢? 2.内存中的数据存储原理: 3.数据存储与指针使用实例: 4.存储编址原理: 二、指针和指针类型: 1.决定了指针的步长: 2.决定了…

【VSCode + Anaconda】VSCode [WinError 126]找不到指定模块

【VSCode Anaconda】VSCode [WinError 126]找不到指定模块问题解决一解决二问题 在 Anaconda Prompt 中的 python 环境测试,可以使用 import torch 命令 现在在 VSCode 中测试,发现相关异常 图中,已经选择了相应的 conda 环境的 python.exe…

分片集群中的分片集合

分片集群中的分片集合 MongoDB 中 分片集群有专门推荐的模式,例如 分片集合 它是一种基于分片键的逻辑对文档进行分组,分片键的选择对分片是非常重要的,分片键一旦确定,MongoDB 对数据的分片对应用是透明的 mongodb 分片中&#…

MySQL高级语句(三)

一、正则表达式(REGEXP) 1、正则表达式匹配符 字符解释举列^匹配文本的开始字符’ ^aa ’ 匹配以 aa 开头的字符串$匹配文本的结束字符’ aa$ ’ 匹配以aa结尾的字符串.匹配任何单个字符’ a.b 匹配任何a和b之间有一个字符的字符串*匹配零个或多个在它…

数据结构—树、有序二叉树

文章目录树的概述树的分类二叉树的遍历有序二叉树代码通过链表方式构建有序二叉树通过递归方式实现有序二叉树递归遍历有序二叉树中序遍历:先序遍历:后序遍历:删除节点1、删除叶子节点删除叶子节点总结图示2、删除只有一个子树的节点删除只有…

毕业设计-基于深度学习火灾烟雾检测识别系统-yolo

前言 📅大四是整个大学期间最忙碌的时光,一边要忙着准备考研,考公,考教资或者实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过…

Spring循环依赖源码解析(深度理解)

文章目录前言本章目标一、什么是循环依赖?1、那么循环依赖是个问题吗?2、但是在Spring中循环依赖就是一个问题了,为什么?二、Bean的生命周期2.1、在Spring中,Bean是如何生成的?2.2、那么这个注入过程是怎样…

GitLab CI/CD系列教程(一)

来自:GitLab CI/CD系列教程(一):Docker安装GitLab_哔哩哔哩_bilibili 1. 创建虚拟机并连接Xterm 创建一个4G内存的虚拟机,否则很容易启动不了,报502 虚拟机的创建看这篇: VMware16的安装及VM…

基于java+ssm+vue+mysql的网上书店

项目介绍 本网上系统是针对目前网上的实际需求,从实际工作出发,对过去的网上系统存在的问题进行分析,结合计算机系统的结构、概念、模型、原理、方法,在计算机各种优势的情况下,采用目前最流行的B/S结构和java中流行的…

从0开始搭建vue2管理后台基础模板

网站主要完成:侧边菜单栏、页面标签卡、内容栏 源代码gitee地址:https://gitee.com/zhao_liangliang1997/navigation-bar 一、起步 1、创建vue项目 vue create 项目名2、引入element 3、其他安装 1、首先需要安装如下 cnpm install vuex cnpm install…

DockerCompose安装、使用 及 微服务部署实操

1 什么是DockerCompose DockerCompose是基于Compose文件帮助我们快速的部署分布式应用。 解决容器需手动一个个创建和运行的问题! DockerCompose本质上也是一个文本文件,其通过指令定义集群中的每个容器如何运行。我们可以将其看做是将多个docker run…

Ansible 自动化运维工具的使用

目录 一、Ansible简介 二、Ansible 的安装和使用 1.下载 2.使用 三、Ansible命令和模块 1.命令格式 2.命令行模块 (1)command 模块 (2)shell 模块 (3)cron 模块 (4)user …

多线程 3

多线程 3 : 文章目录1.线程安全2. 产生线程安全的原因3. synchronized - 加锁操作4.可重入5.死锁问题6. volatile 关键字7.wait 和 notify1.线程安全 为啥会出现线程安全 ?   罪魁祸首,还是多线程的抢占式执行, 正因为抢占式执行&#xff0c…

Java项目:SSM场地预订管理系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目分为前后台,前台为普通用户登录,后台为管理员登录; 用户角色包含以下功能: 按分类查看场…

【车载开发系列】UDS诊断---通信控制($0x28)

【车载开发系列】UDS诊断—通信控制($0x28) UDS诊断---通信控制($0x28)【车载开发系列】UDS诊断---通信控制($0x28)一.概念定义二.实现原理三.应用场景四.子功能五.报文格式1)请求报文2&#xf…