Python 测开27期 - 柒柒 - Jenkins Pipeline

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{}
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运行相关内容
    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处于“中止”状态时才能运行
    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
options {
    timeout(time: 30, unit: 'SECONDS')
    buildDiscarder(logRotator(numToKeepStr: '10'))
    retry(5)
}

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

  • 不是必须出现的指令
  • 无参数
	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,可避免首次构建失败
	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将被重新触发
triggers {
    cron('H/2 * * * *')
}

script:定义脚本

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

2.2 语法 Scripts pipeline

流程控制 if-else

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

流程控制 try-catch

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工具
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"
    }
}