软件测试/测试开发丨Jenkins Pipeline 学习笔记

点此获取更多相关资料

本文为霍格沃兹测试开发学社学员学习笔记分享

原文链接:https://ceshiren.com/t/topic/26711

1. Jenkins节点

1.1 常用的节点

  • 内建节点
  • SSH节点
  • Java Web节点

1.1.1 SSH节点配置

  • 远程工作目录

    • 节点中必须有该目录,用于下载和运行jenkins
  • 主机

    • 节点的ip

1.1.2 Java Web节点配置

  • 全局安全配置

    • 代理:勾选Java代理协议

1.2 节点管理的缺陷

  • 没有负载监控能力(任务数量做的负载均衡)
  • 高可用能力差
  • 资源利用率

使用k8s和jenkins集成来解决

1.3 环境变量/工具位置的配置

  • 全局环境变量
  • 节点环境变量:点击配置从节点,进行配置

1.4 父子job配置

  • 在子job的设置中,构建触发器配置父job

2. pipeline

2.1 语法 Declarative pipeline

语法树

  • 必须包含在一个pipeline块内 pipeline{}
java 复制代码
pipeline {
    agent any  // 定义构建代理

    environment {
        param = 'xx'
    }

    stages {  // 定义阶段
        stage('pull source code') {
            steps {
                echo 'pull source code'
                sleep 5
            }
        }

        stage('build'){
            steps {
                echo 'build source code'
                sleep 5
            }
        }
    }

    post{  // 定义全局后置处理程序
        always {
            echo 'say goodbye'
        }
    }
}

agent:定义pipeline执行节点

  • 必须出现的指令

  • 参数

    • any:可以在任意agent上执行pipeline

    • none:pipeline将不分配全局agent, 每个stage分配自己的agent

    • label:指定运行节点的Label

    • node:自定义运行节点配置

      • 指定 label
      • 指定 customWorkspace
    • docker:控制目标节点上的docker运行相关内容

    java 复制代码
    pipeline {
    	agent {
    		label 'master'
    		customWorkspace 'myWorkspace'
    	}
    }

stages:定义阶段集

  • 必须出现的指令
  • 包含一个或多个stage的序列
  • 每个Pipeline 代码区间中必须只有一个stages

stage:定义阶段

  • 必须出现的指令
  • 无参数
  • 包含在stages中
  • Pipeline完成的所有实际工作都需要包含到stage中
  • 需要定义stage的名字

steps:定义步骤

  • 必须出现的指令
  • 无参数
  • 具体执行步骤,包含在 stage 代码区间中

post:定义Pipeline或stage运行结束时的操作

  • 不是必须出现的指令

  • 参数:

    • always:无论Pipeline运行的完成状态如何都会运行
    • changed:只有当前Pipeline运行的状态与先前完成的Pipeline的状态不同时,才能运行
    • failure:仅当当前Pipeline处于"失败"状态时才运行
    • success :仅当当前Pipeline具有"成功"状态时才运行
    • unstable:只有当前Pipeline具有"不稳定"状态才能运行
    • aborted:只有当前Pipeline处于"中止"状态时才能运行
    java 复制代码
    post {
    	always {
    		echo 'say always'
    	}
    
    	success {
    		echo 'say success'
    	}
    
    	failure {
    		echo 'say failure'
    	}
    }

options:定义pipeline 的专有属性

  • 不是必须出现的指令

  • 参数:

    • buildDiscarder:保持构建的最大个数
    • disableConcurrentBuilds:不允许并行执行pipeline任务
    • timeout:pipeline 超时时间
    • retry:失败后,重试整个Pipeline的次数
    • timestamps:预定义由Pipeline生成的所有控制台输出时间
    • skipStagesAfterUnstable:一旦构建状态进入了"Unstable"状态,就跳过此stage
java 复制代码
options {
    timeout(time: 30, unit: 'SECONDS')
    buildDiscarder(logRotator(numToKeepStr: '10'))
    retry(5)
}

environment:定义Pipeline或stage运行时的环境变量

  • 不是必须出现的指令
  • 无参数
java 复制代码
	environment {
		PERSON = "Kevin"
	}

	stages {
		stage('pull source code') {
			steps {
				echo "hello ${PERSON}"
				echo PERSON
			}
	}

parameters:定义pipeline 的专有参数列表

  • 不是必须出现的指令

  • 使用 ${变量名} 进行参数化调用

  • 参数:

    • 支持数据类型:booleanParam, choice, credentials, file, text, password, run, string
    • 类似参数化构建的选项,结合environment,可避免首次构建失败
java 复制代码
	parameters {
		string(name: 'PERSON' ,defaultValue:'Jenkins',description:'输入的文本参数')
	}

	environment {
		PERSON = "$params.PERSON"
	}

	stages {
		stage('pull source code') {
			steps {
				echo "hello ${PERSON}"
				echo 'pull source code'
			}
	}

triggers:定义了Pipeline自动化触发的方式

  • 不是必须出现的指令

  • 参数:

    • cron:接受一个cron风格的字符串来定义Pipeline触发的常规间隔
    • pollSCM:接受一个cron风格的字符串来定义 Jenkins 检查SCM源更改的常规间隔;如果存在新的更改,则Pipeline将被重新触发
java 复制代码
triggers {
    cron('H/2 * * * *')
}

script:定义脚本

  • 在script块内,可执行groovy脚本

2.2 语法 Scripts pipeline

流程控制 if-else

java 复制代码
node {
    stage('Example') {
        if (env.BRANCH_NAME == 'master') {
            echo 'I only execute on the master branch'
        } else {
            echo 'I execute elsewhere'
        }
    }
}

流程控制 try-catch

java 复制代码
stage('Test') {
    node{
        echo "This is test stage which run on the slave agent."
        try {
            echo "This is in the try block."           
            sh 'exit 1'
        }catch (exc) {
            echo "Something failed, I'm in the catch block."
        }finally {
            echo "Finally, I'm in the finally block."
        }
    }
}

环境变量定义及引用

  • 环境工具变量的定义

    • 设置位置: "Manage Jenkins"-> "Global Tool Configuration"
  • Script 代码中引用环境变量,调用java、maven工具

java 复制代码
stage('env tools') {
    node('master'){        
        //定义maven java环境
        def mvnHome = tool 'Maven 3.9.3'
        def jdkHome = tool 'jdk1.8_master'
        
        //引用环境变量,配置PATH变量
        env.PATH = "${mvnHome}/bin:${env.PATH}"
        env.PATH = "${jdkHome}/bin:${env.PATH}"
        
        //调用java mvn 工具
        sh "java -version"
        sh "mvn --version"
    }
}
相关推荐
想要打 Acm 的小周同学呀4 分钟前
ThreadLocal学习
android·java·学习
2的n次方_1 小时前
迎接AI新时代:GPT-5即将登场的巨大变革与应用前瞻
人工智能·gpt·学习
xiandong201 小时前
240707_昇思学习打卡-Day19-基于MindSpore通过GPT实现情感分类
人工智能·gpt·学习·分类
sealaugh323 小时前
spring boot(学习笔记第十二课)
spring boot·笔记·学习
会翻身的嵌入式咸鱼3 小时前
蓝桥杯开发板STM32G431RBT6高阶HAL库学习FreeRtos——完成第一个小项目点灯
stm32·学习·蓝桥杯
Alice_JC4 小时前
《昇思25天学习打卡营第11天|计算机视觉-ResNet50迁移学习》
深度学习·学习·计算机视觉·迁移学习
玉标4 小时前
ELK日志系统和Filebeat采集器的学习总结
学习·elk
祖国的好青年4 小时前
基于正点原子FreeRTOS学习笔记——时间片调度实验
笔记·学习
xiaoyalian4 小时前
横截面数据回归
笔记·学习·数据挖掘·回归·r语言
王红花x4 小时前
STL——list模拟实现
c++·学习·list