一、优化交付流水线性能

随着交付流水线的复杂度越来越高,需要优化交付流水线的性能成为了一个时刻需要关注的问题。

下面是一些常见的优化策略:

3.5.1 并行执行

使用并行执行可以大大缩短交付流水线的执行时间。Pipeline可以很容易地支持并行执行。

例如,我们可以将测试阶段并行执行:

stage('Test') {
    parallel (
        "test1" : { sh 'mvn test -Dtest=Test1' },
        "test2" : { sh 'mvn test -Dtest=Test2' },
        "test3" : { sh 'mvn test -Dtest=Test3' }
    )
}

在这个示例中,我们使用了 parallel块 来并行执行。

在parallel块内,我们定义了三个分支来执行测试。分支的名称是任意的,它们将被用作日志输出。每个分支都有自己的命令来执行测试。

3.5.2 缓存依赖项

使用缓存可以避免在每个阶段中重新下载依赖项。

例如,如果一个项目使用Maven,我们可以在build阶段前缓存Maven仓库:

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                script {
                    def mvnHome = tool 'Maven-3.8.2'
                    env.M2_HOME = mvnHome
                    sh "${mvnHome}/bin/mvn -B -Dmaven.repo.local=$HOME/.m2/repository clean package"
                }
            }
        }
    }
    post {
        success {
            cleanWs()
        }
    }
}

在这个示例中,我们使用了Maven插件的tool方法来定义Maven的版本。然后,我们将M2_HOME设置为我们定义的Maven的路径。

最后,我们在Maven命令中使用-Dmaven.repo.local选项来指定Maven仓库的位置。

3.5.3 删除不必要的阶段

一些阶段可能不必要并且会大大降低交付流水线的性能。

例如,我们可能只需要在提交代码时执行 buildtest 阶段,而不是在每次构建时执行这些阶段。

示例:

pipeline {
    agent any
    stages {
        stage('Build') {
            when {
                changeset "src/**"
            }
            steps {
                sh 'mvn clean install'
            }
        }
        stage('Test') {
            when {
                changeset "src/**"
            }
            steps {
                sh 'mvn test'
            }
        }
        stage('Deploy') {
            when {
                changeset "src/**"
            }
            steps {
                sh './deploy.sh'
            }
        }
    }
    post {
        success {
            cleanWs()
        }
    }
}

在这个示例中,我们在build、test和deploy阶段之前添加了when块。当检测到代码库中的更改时,这些阶段才会被执行。

3.6 总结

Scripted Pipeline 和 Declarative Pipeline 两种流水线定义的主要区别在于语法和灵活性上。

Declarative Pipeline 语法要求更严,需使用 Jenkins 预定义的DSL 结构,使用简单; Scripted Pipeline 受限很少,限制主要在 Groovy 的结构和语法;

大家可以根据个人或企业的情况选择两种方式,比如如果公司没有 Groovy 技术栈,可以考虑直接使用 Declarative Pipeline, 学习曲线低,可以快速上手;

如果需要对公司的业务场景灵活配置或者对 Groovy 熟悉,那么 Scripted Pipeline 是一个不错的选择;