Chr*_*etz 5 declarative matrix jenkins jenkins-pipeline
我正在尝试建立一个矩阵构建并遇到几个问题。矩阵看起来像:
stage( 'BuildAll' ) {
matrix {
axes {
axis {
name 'PLATFORM'
values 'win32vc9', 'win32vc19'
}
axis {
name 'VARIANT'
values 'debug', 'release'
}
axis {
name 'MODULES'
values 'repo1/module1', 'repo1/module2', 'repo2/module1', 'repo2/module2'
}
}
stages {
stage( 'Checkout' ) {
}
stage( 'Build' ) {
}
stage( 'Test' ) {
}
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是:
詹金斯正在其自己的工作区中执行矩阵的每个单元,但我的模块相互依赖。这就是为什么我想检查它们并在同一个工作区中构建它们。顺便说一句:我的构建系统可以在同一工作区中使用所有变体(调试/发布 x vc9/vc19)。
詹金斯正在并行执行所有单元。我需要的是模块轴执行的序列化。
我有什么想法可以解决这个问题吗?
例如,有没有一种方法可以描述类似多个模块的循环,这些模块会连续生成一系列阶段,而不是并行的?在该序列中,我只能实现两个轴上的矩阵。
我知道扩展工作区插件,但没有找到任何有关如何在声明性管道中使用它的文档。
提前谢谢了!问候,克里斯托夫
小智 6
您也许可以通过使用锁来做您想做的事情。
就我而言,我只是希望矩阵按顺序构建而不是并行构建,因此我只是将所有内容包装在一个阶段中并对其加锁。就像是:
stage( 'BuildAll' ) {
matrix {
axes {
...
}
stages {
stage( 'Sequential Matrix' ) {
options {
lock( 'synchronous-matrix' )
}
stages {
...
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
一次只能构建一个矩阵配置,因为在当前配置完成之前其他矩阵配置无法获取锁。
但就您而言,您希望模块按顺序一个接一个地构建。锁定资源的字符串可以是动态的,因此我认为您可以使用从其他 2 个轴构造的名称来防止同时构建多个模块:
stage( 'BuildAll' ) {
matrix {
axes {
axis {
name 'PLATFORM'
values 'win32vc9', 'win32vc19'
}
axis {
name 'VARIANT'
values 'debug', 'release'
}
axis {
name 'MODULES'
values 'repo1/module1', 'repo1/module2', 'repo2/module1', 'repo2/module2'
}
}
stages {
stage( 'Force Sequential' ) {
options {
lock( "synchronous-${PLATFORM}-${VARIANT}" )
}
stages {
stage( 'Checkout' ) {
}
stage( 'Build' ) {
}
stage( 'Test' ) {
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,这只能保证同一平台和变体的模块不会同时构建,并且不会说明任何有关排序的信息。我不知道 Jenkins 选择构建轴的顺序是否已定义,但我发现矩阵排序器插件可能有助于排序(如果有问题)。
我使用for循环而不是matrixandaxis语法。我的解决方法不如使用matrix语法那么漂亮,但它做了它应该做的事情。
String[] platformList = ['win32vc9', 'win32vc19']
String[] variantList = ['debug', 'release']
pipeline{
agent any
stages {
stage('Deploy'){
steps{
script{
for(platform in platformList){
for(variant in variantList){
stage("Checkout"){
powershell label: '', script: """Write-Output Step1 "${platform}/${variant}/Checkout" """
}
stage("Build"){
powershell label: '', script: """Write-Output Step1 "${platform}/${variant}/Build" """
}
stage("Test"){
powershell label: '', script: """Write-Output Step1 "${platform}/${variant}/Test" """
}
}
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
声明式管道matrix指令当前不支持顺序执行。
在当前matrix语法中你可以做的最好的事情是:
stage( 'BuildAll' ) {
matrix {
axes {
axis {
name 'PLATFORM'
values 'win32vc9', 'win32vc19'
}
axis {
name 'VARIANT'
values 'debug', 'release'
}
}
stages {
stage('repo1/module1') {
stages {
stage( 'Checkout' ) {
}
stage( 'Build' ) {
}
stage( 'Test' ) {
}
}
}
stage('repo1/module2') {
stages {
stage( 'Checkout' ) {
}
stage( 'Build' ) {
}
stage( 'Test' ) {
}
}
}
stage('repo2/module1') {
stages {
stage( 'Checkout' ) {
}
stage( 'Build' ) {
}
stage( 'Test' ) {
}
}
}
stage('repo2/module2') {
stages {
stage( 'Checkout' ) {
}
stage( 'Build' ) {
}
stage( 'Test' ) {
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
其他人也提出了类似的要求。我已根据此问题提交了JENKINS-62085 。