当前位置: 首页 > 知识库问答 >
问题:

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

燕实
2023-03-14

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

    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\""
                }
            }
        }
        }
    }

共有3个答案

朱承载
2023-03-14

使用< code > current build . raw build . get cause(Class)可以确定生成的原因

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\""
            
     }
}

您还需要在<code>Build release

    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
如何区分Jenkins管道中的构建触发器

EDIT
如果您想将所有内容保持在一个管道中,那么您需要创建两个新变量。以下代码为今天上午12点创建Calendar对象并将其转换为毫秒

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()

同样,您可以为< code >今天下午1点(例如< code >结束)创建一个< code >日历对象。使用< code > current build . raw build . gettimestamp()可以在调度构建时获得< code>Calendar对象。如果预定时间在< code>start和< code>end之间,例如设置一个布尔变量,并在流水线中检查它。

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
      }
    }
  }
  
 

如何创建一个今天午夜明天午夜的Java Date对象?

丘华翰
2023-03-14

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

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')
               ]
           }
       }
   }
}
钱德元
2023-03-14

parameterizedCron插件可以满足您的需求:

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
        ''')
    }
 类似资料: