使用Jenkinsfile中的矩阵,是否可以根据矩阵值使用不同的“代理”块?

epfja78i  于 2023-05-06  发布在  Jenkins
关注(0)|答案(1)|浏览(147)

我有一个声明性管道Jenkinsfile,看起来像这样:

pipeline {
    agent none
    stages {
        stage("Build and Test") {
            matrix {
                axes {
                    axis {
                        name 'PLATFORM'
                        values 'Windows', 'macOS'
                    }
                }
            }            

            stages {
                agent {
                    node {
                        label PLATFORM
                    }
                }
                stage("Stage 1") {
                    steps {
                        sh "echo Stage 1"
                    }
                }
                stage("Stage 2") {
                    steps {
                        sh "echo Stage 2"
                    }
                }
                stage("Stage 3") {
                    steps {
                        sh "echo Stage 3"
                    }
                }
            }
        }
    }
}

这将在匹配axis标签的两个滑道上并行运行三个阶段。在这种情况下,标签将匹配我的Windows和macOS运行器,因此我可以在两个平台上运行相同的阶段。
我想使用相同的结构并添加Linux。不幸的是,我的Linux运行者使用的agent不是node,而是kubernetes。因此,Linux agent应该看起来像这样:

agent {
    kubernetes {
        defaultContainer 'container_defined_in_yaml'
        yamlFile 'k8s-build-pod.yaml'
    }
}

是否可以“动态”构建agent块,以便它可以基于label值为Windows和macOS设置node代理,为Linux设置kubernetes代理?

anhgbhbe

anhgbhbe1#

创建agentBlock定义

更新管道:

  • 定义了一个函数agentBlock,该函数返回一个代码块,用于指定运行基于params.PLATFORM的管道所需的代理
def agentBlock(String agentLabel) {
  if(agentLabel == "Windows" || agentLabel == "macOS") {
    agentBlock = {
      node {
          label agentLabel
      }
    }
  } else if (agentLabel == "Linux") {
    agentBlock = {
      kubernetes {
        defaultContainer 'container_defined_in_yaml'
        yamlFile 'k8s-build-pod.yaml'
      }
    }
  } else {
    error "Unsupported platform: ${agentLabel}"
  }
}

pipeline {
    agent none
    stages {
        stage("Build and Test") {
            matrix {
                axes {
                    axis {
                        name 'PLATFORM'
                        values 'Windows', 'macOS', 'Linux'
                    }
                }
            }            

            stages {
                agent agentBlock(params.PLATFORM)
                stage("Stage 1") {
                    steps {
                        sh "echo Stage 1"
                    }
                }
                stage("Stage 2") {
                    steps {
                        sh "echo Stage 2"
                    }
                }
                stage("Stage 3") {
                    steps {
                        sh "echo Stage 3"
                    }
                }
            }
        }
    }
}

相关问题