前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >全能詹: Jenkins Matrix 应用实践

全能詹: Jenkins Matrix 应用实践

作者头像
DevOps云学堂
发布2019-12-13 10:45:08
1.6K0
发布2019-12-13 10:45:08
举报
文章被收录于专栏:DevOps持续集成DevOps持续集成

前言

Matrix 项目的概念是在不同的版本中测试多种类型的相似技术。Matrix构建相互独立,因此可以并行运行。例如,可能要跨多个Java版本构建其项目测试。

https://plugins.jenkins.io/matrix-project 热度足够可以继续研究了。

1 使用脚本式语法完成 Matrix Building

首先需要给node创建几个label,便于后面测试。

代码语言:javascript
复制
master "os:linux&&browser:firefox"  "os:windows"&&"browser:firefox" "os:mac"&&"browser:firefox"  "os:linux"&&"browser:chrome"  "os:windows"&&"browser:chrome"  "os:mac"&&"browser:chrome"  "os:windows"&&"browser:safari"  "os:mac"&&"browser:safari" "os:windows"&&"browser:edge"

以下Jenkins脚本化流水线将跨两个矩阵轴构建组合。但是,向矩阵中添加更多的轴与向中添加另一个条目一样容易。

代码语言:javascript
复制
// 定义一个map 存储 平台与浏览器的信息
Map matrix_axes = [
    PLATFORM: ['linux', 'windows', 'mac'],
    BROWSER: ['firefox', 'chrome', 'safari', 'edge']
]

@NonCPS
List getMatrixAxes(Map matrix_axes) {
    List axes = []
    matrix_axes.each { axis, values ->
        List axisList = []
        values.each { value ->
            axisList << [(axis): value]
        }
        axes << axisList
    }
    // calculate cartesian product
    axes.combinations()*.sum()
}

// filter the matrix axes since
// Safari is not available on Linux and
// Edge is only available on Windows
List axes = getMatrixAxes(matrix_axes).findAll { axis ->
    !(axis['BROWSER'] == 'safari' && axis['PLATFORM'] == 'linux') &&
    !(axis['BROWSER'] == 'edge' && axis['PLATFORM'] != 'windows')
}

// parallel task map
Map tasks = [failFast: false]

for(int i = 0; i < axes.size(); i++) {
    // convert the Axis into valid values for withEnv step
    Map axis = axes[i]
    List axisEnv = axis.collect { k, v ->
        "${k}=${v}"
    }
    // let's say you have diverse agents among Windows, Mac and Linux all of which have proper labels for their platform and what browsers are available on those agents.
    String nodeLabel = "os:${axis['PLATFORM']} && browser:${axis['BROWSER']}"
    tasks[axisEnv.join(', ')] = { ->
        node(nodeLabel) {
            withEnv(axisEnv) {
                stage("Build") {
                    echo nodeLabel
                    sh 'echo Do Build for ${PLATFORM} - ${BROWSER}'
                }
                stage("Test") {
                    echo nodeLabel
                    sh 'echo Do Build for ${PLATFORM} - ${BROWSER}'
                }
            }
        }
    }
}

stage("Matrix builds") {
    parallel(tasks)
}

FAQ:可能会遇到一下问题,需要授权方法。

2 优化上面的流水线

在运行的时候供用户选择相关平台和浏览器。

代码语言:javascript
复制
Map response = [:]
stage("Choose combinations") {
    response = input(
        id: 'Platform',
        message: 'Customize your matrix build.',
        parameters: matrix_axes.collect { key, options ->
            choice(
                choices: ['all'] + options.sort(),
                description: "Choose a single ${key.toLowerCase()} or all to run tests.",
                name: key)
        })
}

最终的效果

3 使用声明式流水线

声明性管道1.5.0-beta1添加了一个新matrix部分,该部分使我可以一次指定一个列表阶段,然后在多个配置上并行运行同一列表。

单一管道配置

代码语言:javascript
复制
pipeline {
    agent none
    stages {
        stage('BuildAndTest') {
            agent any
            stages {
                stage('Build') {
                    steps {
                        echo 'Do Build'
                    }
                }
                stage('Test') {
                    steps {
                        echo 'Do Test'
                    }
                }
            }
        }
    }
}

多平台和浏览器

代码语言:javascript
复制
pipeline {
    agent none
    stages {
        stage('BuildAndTest') {
            matrix {
                agent any
                axes {
                    axis {
                        name 'PLATFORM'
                        values 'linux', 'windows', 'mac'
                    }
                    axis {
                        name 'BROWSER'
                        values 'firefox', 'chrome', 'safari', 'edge'
                    }
                }
                stages {
                    stage('Build') {
                        steps {
                            echo "Do Build for ${PLATFORM} - ${BROWSER}"
                        }
                    }
                    stage('Test') {
                        steps {
                            echo "Do Test for ${PLATFORM} - ${BROWSER}"
                        }
                    }
                }
            }
        }
    }
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DevOps持续集成 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 使用脚本式语法完成 Matrix Building
  • 2 优化上面的流水线
  • 3 使用声明式流水线
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档