【问题标题】:how to schedule parameterized pipelines to run just once with one parameter and the rest with another one?如何安排参数化管道仅使用一个参数运行一次,其余的使用另一个参数运行?
【发布时间】:2021-09-21 17:05:30
【问题描述】:

我有一个管道,我刚刚添加了 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\""
                }
            }
        }
        }
    }

【问题讨论】:

    标签: jenkins groovy jenkins-pipeline


    【解决方案1】:

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

    【讨论】:

    • 非常感谢,这似乎就是我要找的东西!
    【解决方案2】:

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

    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')
                   ]
               }
           }
       }
    }
    

    【讨论】:

    • 感谢您的回复,我考虑过这一点,但我更愿意将其保留在同一管道上,因此使用相同的 WS
    • 好的我现在明白你的意思了,我第一眼看错了,所以基本上这将调用上面发布的工作并将参数传递给构建调试,我看不清楚是如何参数选择块工作,因为我以前没有使用过它,jenkins 网站上有没有关于这个的文档?
    • Documentation for build parametersfor pipeline build step (and following) 还有更多可用的参数,这些参数没有记录。顺便说一句,你也可以试试这个插件:plugins.jenkins.io/parameterized-trigger
    【解决方案3】:

    可以使用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
    How to differentiate build triggers in Jenkins Pipeline

    编辑
    如果您想将所有内容保存在一个管道中,则需要创建两个新变量。以下代码为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?

    【讨论】:

    • 非常感谢! @Meljkot
    • 但这只会在手动触发和由cron触发之间产生区别,我想要实现的是始终由cron触发并构建版本,除非在12 -13之间触发实例。 @Melkjot
    • @JesusFernandez 我已经编辑了我的答案,添加了如何确定构建是否由 cron 在 12-13 之间触发。
    猜你喜欢
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多