DevOps系列之Jenkins pipeline-06Jenkins核心语法4

1. 并行构建工作空间重复问题处理

在开启并行构建时,如果在同一个节点下运行构建,则会在同一个目录下生成很多类似如下的文件夹,在同一个工作空间下就出现了垃圾数据。

pipeline {
    agent any

    stages {
        stage('Hello') {
            
            steps {
                script {
                    sh """
                        mkdir -p job-${BUILD_ID}
                        echo "${BUILD_ID}" > job-${BUILD_ID}/build.txt
                        sleep 5
                        """
                }
            }
        }
    }
}

 正常构建项目不应在同一个目录下。

解决办法:自定义工作空间

env.nworkspace = "/opt/agent/test/${JOB_NAME}-${UUID.randomUUID().toString()}"


env.nworkspace = "/opt/agent/test/${JOB_NAME}-${UUID.randomUUID().toString()}"
pipeline {
    agent any

    stages {
        stage('Hello') {
            
            steps {
                script {
                    ws("${env.nworkspace}"){
                        sh """
                        mkdir -p job-${BUILD_ID}
                        echo "${BUILD_ID}" > job-${BUILD_ID}/build.txt
                        sleep 5
                        """
                    }
                }
            }
        }        
    }
}

 多次构建后,查看工作空间下目录结构,每次构建都新生成工作空间。

2. 清除工作空间

在构建成功后删除工作空间,以节省服务器资源


env.dir="${JOB_NAME}-${UUID.randomUUID().toString()}"
env.nworkspace = "/opt/agent/test/${env.dir}"

pipeline {
    agent any

    stages {
        stage('Hello') {
            
            steps {
                script {
                    ws("${env.nworkspace}"){
                        sh """
                        mkdir -p job-${BUILD_ID}
                        echo "${BUILD_ID}" > job-${BUILD_ID}/build.txt
                        sleep 5
                        """
                    }
                }
            }
        }        
    }
post {
  success {
    // One or more steps need to be included within each condition's block.
    script {
        sh "rm -fr /opt/agent/test/${env.dir} || echo true"
    }
  }
}
}

3. 流水线全局变量参考

3.1 内置变量

BUILD_NUMBER          //构建号
BUILD_ID              //构建号
BUILD_DISPLAY_NAME    //构建显示名称
JOB_NAME              //项目名称
              
EXECUTOR_NUMBER       //执行器数量
NODE_NAME             //构建节点名称
WORKSPACE             //工作目录
JENKINS_HOME          //Jenkins home
JENKINS_URL           //Jenkins地址
BUILD_URL             //构建地址
JOB_URL               //项目地址
println(env)

env.branchName = "develop"
env.commitID = "${UUID.randomUUID().toString()}"
env.commitID = "${env.commitID.split("-")[0]}"
currentBuild.displayName = "#${env.branchName}-${env.commitID}"
currentBuild.description = "Trigger by user jenkins \n branch: master"

pipeline {

    agent { label "build"}

    stages{
        stage("test"){
            steps{
                script{
                    echo "${BUILD_NUMBER}"
                    echo "${BUILD_ID}"
                    //currentBuild.displayName = "#${env.branchName}-${env.commitID}"
                    //currentBuild.description = "Trigger by user jenkins \n branch: master"


                    echo "当前下载代码分支为: ${env.branchName}"
                }
            }
        }
    }
}

currentbuild变量

result  currentResult   //构建结果
displayName      //构建名称  #111
description      //构建描述
duration         //持续时间

3.2 流水线中变量定义引用

变量的类型:两种类型的变量。
1.Jenkins系统内置变量 (全局变量)
2.Pipeline中定义变量(全局/局部变量)

Jenkins系统内置变量:是Jenkins系统在安装部署后预先定义好的变量。这些变量可以通过Jenkins流水线语法页面看到具体有哪些。这些变量都是全局的可以使用"${env.变量名}"引用。

Pipeline中的变量:

首先你要先理解pipeline可以用groovy语法来编写,而groovy是一门编程语言。所有的编程语言也都有各自的变量定义方式。 这就容易让大家产生疑惑的地方,pipeline中可以有很多种写法。

def name = "devops"
String name = "devops"

以上这两种写法是一样,def可以自动推导出变量类型,而String这种写法是精确这个变量是一个字符串类型的。

如果你在Jenkins图形界面设置了参数化构建,那么这些参数也都变成了Jenkins全局变量,可以使用与Jenkins内置变量相同的引用方式。

如果在某个stage定义的变量默认是局部变量,在后续的stage中可能语法引用,所以如果需要引用最好定义为全局变量。

全局变量的定义方式:
env.name = "devops"

引用方式: "${env.name}"

总之变量是我们在编写Jenkins流水线是经常用到的。无处不在。如果你要定义全局的变量就用env.变量名的方式定义。 变量也不仅仅只有这几种写法,我建议如果想了解更多,可以多看下groovy这门需要的更多语法。

猜你喜欢

转载自blog.csdn.net/lee_yanyi/article/details/123820799