如何使用一个参数将参数化管道安排到 运行 一次,其余的则使用另一个参数?

how to schedule parameterized pipelines to run just once with one parameter and the rest with another one?

我有一个管道,我只是添加了 2 个参数来构建发布或调试(参数称为发布或调试)。管道使用 cron 语法每 10 分钟检查一次 SCM 中的更改,管道检查每个提交然后构建版本(C++ 程序)但我想每天构建一次调试,假设每天每个 coomit 从 12 推送到13 将在调试中构建。所有这一切都不需要我 运行 管道和手动更改参数(默认情况下设置为发布)。有什么办法吗?这是管道的一个非常简短的版本:

    pipeline {
    
        stages {
          stage('Setup parameters') {
            steps {
                script { 
                    properties([
                        parameters([
                            choice(
                                defaultValue: 'RELEASE', 
                                choices: ['RELEASE', 'DEBUG'], 
                                name: 'BUILD_CONFIG'
                            ),
                        ])
                    ])
                }
            }
        }
        stage('Build release'){
            when {
                expression {
                   return params.BUILD_CONFIG == 'RELEASE'
                }
            }
            steps{
                script {
                    def msbuild = tool name: 'MSBuild', type: 'hudson.plugins.msbuild.MsBuildInstallation'
                    bat "\"${msbuild}\" /Source/project-GRDK.sln /t:Rebuild  /p:configuration=\"Release Steam D3D11\""
                }
            }
        }
        stage('Build debug'){
            when {
                expression {
                   return params.BUILD_CONFIG == 'DEBUG'
                }
            }
            steps{
                script {
                    def msbuild = tool name: 'MSBuild', type: 'hudson.plugins.msbuild.MsBuildInstallation'
                    bat "\"${msbuild}\" /Source/project-GRDK.sln /t:Rebuild /p:configuration=\"Debug Steam D3D11\""
                }
            }
        }
        }
    }

可以使用 currentBuild.rawBuild.getCause(Class<T> type) 确定构建的原因。您要查找的 typeUserIdCause。如果作业不是由用户(手动)触发,则以下将构建一个阶段。本阶段steps来自Build debug阶段。

stage('Build debug if time triggered') {
   when {
     expression {
       return currentBuild.rawBuild.getCause(hudson.model.Cause$UserIdCause) == null
     }
   }
   steps {
     script {
       def msbuild = tool name: 'MSBuild', type: 'hudson.plugins.msbuild.MsBuildInstallation'
       bat "\"${msbuild}\" /Source/project-GRDK.sln /t:Rebuild /p:configuration=\"Debug Steam D3D11\""
            
     }
}

您还需要向 Build releaseBuild debug 阶段添加一个表达式,以防止在作业不是由用户(手动)触发时构建。

    stage('Build release'){
        when {
            allOf {
               expression {
                   return params.BUILD_CONFIG == 'RELEASE'
               }
               expression {
                   return currentBuild.rawBuild.getCause(hudson.model.Cause$UserIdCause) != null
               }
            }
        }
        ...

文档:
https://javadoc.jenkins-ci.org/hudson/model/Cause.html
https://javadoc.jenkins-ci.org/hudson/model/Run.html

编辑
如果您想将所有内容都放在一个管道中,那么您需要创建两个新变量。以下代码为 12 am today 创建 Calendar 对象并将其转换为 milliseconds.

Calendar date = new GregorianCalendar()
date.set(Calendar.HOUR_OF_DAY, 12);
date.set(Calendar.MINUTE, 0);
date.set(Calendar.SECOND, 0);
date.set(Calendar.MILLISECOND, 0);

def start = date.getTime().getTime()

以同样的方式,您可以为 1 pm today 创建一个 Calendar 对象(例如 end)。使用 currentBuild.rawBuild.getTimestamp() 您将在计划构建时获得 Calendar 对象。如果预定时间在 startend 之间,则设置一个布尔变量,并在阻塞时在管道中检查它。

def buildDebug = false
def scheduled = currentBuild.rawBuild.getTimestamp().getTime().getTime()
if(scheduled > start && scheduled < end)
  buildDebug = true

...

stage('Build release'){
  when {
    allOf {
      expression {
        return params.BUILD_CONFIG == 'RELEASE'
      }
      expression {
        return currentBuild.rawBuild.getCause(hudson.model.Cause$UserIdCause) == null
      }
      expression {
        return buildDebug == false
      }
    }
  }
  ...
stage('Build debug'){
  when {
    allOf {
      expression {
        return params.BUILD_CONFIG == 'RELEASE'
      }
      expression {
        return currentBuild.rawBuild.getCause(hudson.model.Cause$UserIdCause) == null
      }
      expression {
        return buildDebug == true
      }
    }
  }
  
 

How to create a Java Date object of midnight today and midnight tomorrow?

另一种选择是创建第二个作业,它会使用正确的参数触发构建作业:

pipeline {
   agent any

   triggers {
       cron('H 12 * * *')
   }

   stages {
       stage('Build xxx debug') {
           steps {
               build job: "your-job-name-here", parameters: [
                   choice(name: 'BUILD_CONFIG', value: 'DEBUG')
               ]
           }
       }
   }
}

parameterizedCron plugin 满足您的需求:

pipeline {
    agent any
    parameters {
        choice(name: 'BUILD_CONFIG', choices: ['RELEASE', 'DEBUG'], defaultValue: 'RELEASE')
    }
    triggers {
        parameterizedCron('''
            1,2,3,4,5,6,7,8,9,10 * * * * % BUILD_CONFIG=RELEASE
            12 * * * * % BUILD_CONFIG=DEBUG
        ''')
    }