Uploaded image for project: 'Jenkins'
  1. Jenkins
  2. JENKINS-41456

Declarative: publishHTML syntax does not work in post block

      Converted this Scripted Pipeline:

      /* Only keep the 10 most recent builds. */
      properties([[$class: 'BuildDiscarderProperty',
                      strategy: [$class: 'LogRotator', numToKeepStr: '10']]])
      
      stage ('Build') {
      
        node {
          // Checkout
          checkout scm
      
          // install required bundles
          sh 'bundle install'
      
          // build and run tests with coverage
          sh 'bundle exec rake build spec'
      
          // Archive the built artifacts
          archive (includes: 'pkg/*.gem')
      
          // publish html
          publishHTML ([
              allowMissing: false,
              alwaysLinkToLastBuild: false,
              keepAll: true,
              reportDir: 'coverage',
              reportFiles: 'index.html',
              reportName: "RCov Report"
            ])
      
        }
      }
      

      To this Declarative:

      pipeline {
          agent any
          options {
              buildDiscarder(logRotator(numToKeepStr:'10'))
          }
          stages {
              stage ('Build') {
                  steps {
                      // install required bundles
                      sh 'bundle install'
      
                      // build and run tests with coverage
                      sh 'bundle exec rake build spec'
                  }
              }
          }
          post {
              success {
                  // Archive the built artifacts
                  archive includes: 'pkg/*.gem'
              }
      
              always {
                  // publish html
                  publishHTML ([
                      allowMissing: false,
                      alwaysLinkToLastBuild: false,
                      keepAll: true,
                      reportDir: 'coverage',
                      reportFiles: 'index.html',
                      reportName: "RCov Report"
                    ])
              }
          }
      }
      

      Fails with this output:

      First time build. Skipping changelog.
      org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
      WorkflowScript: 28: Invalid parameter "allowMissing", did you mean "target"? @ line 28, column 17.
                         allowMissing: false,
                         ^
      
      WorkflowScript: 29: Invalid parameter "alwaysLinkToLastBuild", did you mean "target"? @ line 29, column 17.
                         alwaysLinkToLastBuild: false,
                         ^
      
      WorkflowScript: 30: Invalid parameter "keepAll", did you mean "target"? @ line 30, column 17.
                         keepAll: true,
                         ^
      
      WorkflowScript: 31: Invalid parameter "reportDir", did you mean "target"? @ line 31, column 17.
                         reportDir: 'coverage',
                         ^
      
      WorkflowScript: 32: Invalid parameter "reportFiles", did you mean "target"? @ line 32, column 17.
                         reportFiles: 'index.html',
                         ^
      
      WorkflowScript: 33: Invalid parameter "reportName", did you mean "target"? @ line 33, column 17.
                         reportName: "RCov Report"
                         ^
      
      WorkflowScript: 27: Missing required parameter: "target" @ line 27, column 13.
                     publishHTML ([
                     ^
      
      7 errors
      

      Changed Declarative to this and it succeeds (

      {target:}

      is not needed in Scripted):

      pipeline {
          agent any
          options {
              buildDiscarder(logRotator(numToKeepStr:'10'))
          }
          stages {
              stage ('Build') {
                  steps {
                      // install required bundles
                      sh 'bundle install'
      
                      // build and run tests with coverage
                      sh 'bundle exec rake build spec'
                  }
              }
          }
          post {
              success {
                  // Archive the built artifacts
                  archive includes: 'pkg/*.gem'
              }
      
              always {
                  // publish html
                  publishHTML target:[
                      allowMissing: false,
                      alwaysLinkToLastBuild: false,
                      keepAll: true,
                      reportDir: 'coverage',
                      reportFiles: 'index.html',
                      reportName: "RCov Report"
                    ]
              }
          }
      }
      

          [JENKINS-41456] Declarative: publishHTML syntax does not work in post block

          Liam Newman created issue -

          Andrew Bayer added a comment -

          Your final example looks the same as the previous one?

          Andrew Bayer added a comment - Your final example looks the same as the previous one?
          Liam Newman made changes -
          Description Original: Converted this Scripted Pipeline:
          {code}
          /* Only keep the 10 most recent builds. */
          properties([[$class: 'BuildDiscarderProperty',
                          strategy: [$class: 'LogRotator', numToKeepStr: '10']]])

          stage ('Build') {

            node {
              // Checkout
              checkout scm

              // install required bundles
              sh 'bundle install'

              // build and run tests with coverage
              sh 'bundle exec rake build spec'

              // Archive the built artifacts
              archive (includes: 'pkg/*.gem')

              // publish html
              publishHTML ([
                  allowMissing: false,
                  alwaysLinkToLastBuild: false,
                  keepAll: true,
                  reportDir: 'coverage',
                  reportFiles: 'index.html',
                  reportName: "RCov Report"
                ])

            }
          }
          {code}


          To this Declarative:
          {code}
          pipeline {
              agent any
              options {
                  buildDiscarder(logRotator(numToKeepStr:'10'))
              }
              stages {
                  stage ('Build') {
                      steps {
                          // install required bundles
                          sh 'bundle install'

                          // build and run tests with coverage
                          sh 'bundle exec rake build spec'
                      }
                  }
              }
              post {
                  success {
                      // Archive the built artifacts
                      archive includes: 'pkg/*.gem'
                  }

                  always {
                      // publish html
                      publishHTML ([
                          allowMissing: false,
                          alwaysLinkToLastBuild: false,
                          keepAll: true,
                          reportDir: 'coverage',
                          reportFiles: 'index.html',
                          reportName: "RCov Report"
                        ])
                  }
              }
          }
          {code}

          Fails with this output:
          {code}
          First time build. Skipping changelog.
          org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
          WorkflowScript: 28: Invalid parameter "allowMissing", did you mean "target"? @ line 28, column 17.
                             allowMissing: false,
                             ^

          WorkflowScript: 29: Invalid parameter "alwaysLinkToLastBuild", did you mean "target"? @ line 29, column 17.
                             alwaysLinkToLastBuild: false,
                             ^

          WorkflowScript: 30: Invalid parameter "keepAll", did you mean "target"? @ line 30, column 17.
                             keepAll: true,
                             ^

          WorkflowScript: 31: Invalid parameter "reportDir", did you mean "target"? @ line 31, column 17.
                             reportDir: 'coverage',
                             ^

          WorkflowScript: 32: Invalid parameter "reportFiles", did you mean "target"? @ line 32, column 17.
                             reportFiles: 'index.html',
                             ^

          WorkflowScript: 33: Invalid parameter "reportName", did you mean "target"? @ line 33, column 17.
                             reportName: "RCov Report"
                             ^

          WorkflowScript: 27: Missing required parameter: "target" @ line 27, column 13.
                         publishHTML ([
                         ^

          7 errors
          {code}

          Changed Declarative to this and it succeeds ({target:} is not needed in Scripted):
          {code}
          pipeline {
              agent any
              options {
                  buildDiscarder(logRotator(numToKeepStr:'10'))
              }
              stages {
                  stage ('Build') {
                      steps {
                          // install required bundles
                          sh 'bundle install'

                          // build and run tests with coverage
                          sh 'bundle exec rake build spec'
                      }
                  }
              }
              post {
                  success {
                      // Archive the built artifacts
                      archive includes: 'pkg/*.gem'
                  }

                  always {
                      // publish html
                      publishHTML ([
                          allowMissing: false,
                          alwaysLinkToLastBuild: false,
                          keepAll: true,
                          reportDir: 'coverage',
                          reportFiles: 'index.html',
                          reportName: "RCov Report"
                        ])
                  }
              }
          }
          {code}
          New: Converted this Scripted Pipeline:
          {code}
          /* Only keep the 10 most recent builds. */
          properties([[$class: 'BuildDiscarderProperty',
                          strategy: [$class: 'LogRotator', numToKeepStr: '10']]])

          stage ('Build') {

            node {
              // Checkout
              checkout scm

              // install required bundles
              sh 'bundle install'

              // build and run tests with coverage
              sh 'bundle exec rake build spec'

              // Archive the built artifacts
              archive (includes: 'pkg/*.gem')

              // publish html
              publishHTML ([
                  allowMissing: false,
                  alwaysLinkToLastBuild: false,
                  keepAll: true,
                  reportDir: 'coverage',
                  reportFiles: 'index.html',
                  reportName: "RCov Report"
                ])

            }
          }
          {code}


          To this Declarative:
          {code}
          pipeline {
              agent any
              options {
                  buildDiscarder(logRotator(numToKeepStr:'10'))
              }
              stages {
                  stage ('Build') {
                      steps {
                          // install required bundles
                          sh 'bundle install'

                          // build and run tests with coverage
                          sh 'bundle exec rake build spec'
                      }
                  }
              }
              post {
                  success {
                      // Archive the built artifacts
                      archive includes: 'pkg/*.gem'
                  }

                  always {
                      // publish html
                      publishHTML ([
                          allowMissing: false,
                          alwaysLinkToLastBuild: false,
                          keepAll: true,
                          reportDir: 'coverage',
                          reportFiles: 'index.html',
                          reportName: "RCov Report"
                        ])
                  }
              }
          }
          {code}

          Fails with this output:
          {code}
          First time build. Skipping changelog.
          org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
          WorkflowScript: 28: Invalid parameter "allowMissing", did you mean "target"? @ line 28, column 17.
                             allowMissing: false,
                             ^

          WorkflowScript: 29: Invalid parameter "alwaysLinkToLastBuild", did you mean "target"? @ line 29, column 17.
                             alwaysLinkToLastBuild: false,
                             ^

          WorkflowScript: 30: Invalid parameter "keepAll", did you mean "target"? @ line 30, column 17.
                             keepAll: true,
                             ^

          WorkflowScript: 31: Invalid parameter "reportDir", did you mean "target"? @ line 31, column 17.
                             reportDir: 'coverage',
                             ^

          WorkflowScript: 32: Invalid parameter "reportFiles", did you mean "target"? @ line 32, column 17.
                             reportFiles: 'index.html',
                             ^

          WorkflowScript: 33: Invalid parameter "reportName", did you mean "target"? @ line 33, column 17.
                             reportName: "RCov Report"
                             ^

          WorkflowScript: 27: Missing required parameter: "target" @ line 27, column 13.
                         publishHTML ([
                         ^

          7 errors
          {code}

          Changed Declarative to this and it succeeds ({target:} is not needed in Scripted):
          {code}
          pipeline {
              agent any
              options {
                  buildDiscarder(logRotator(numToKeepStr:'10'))
              }
              stages {
                  stage ('Build') {
                      steps {
                          // install required bundles
                          sh 'bundle install'

                          // build and run tests with coverage
                          sh 'bundle exec rake build spec'
                      }
                  }
              }
              post {
                  success {
                      // Archive the built artifacts
                      archive includes: 'pkg/*.gem'
                  }

                  always {
                      // publish html
                      publishHTML target:[
                          allowMissing: false,
                          alwaysLinkToLastBuild: false,
                          keepAll: true,
                          reportDir: 'coverage',
                          reportFiles: 'index.html',
                          reportName: "RCov Report"
                        ]
                  }
              }
          }
          {code}

          Liam Newman added a comment -

          Fixed.

          Liam Newman added a comment - Fixed.

          Andrew Bayer added a comment -

          So this is a combination of magic and validation not working ideally. I'm not honestly entirely sure how this works in Scripted Pipeline, but the map of arguments gets automatically transformed into an HtmlPublisherTarget instance, which is what publishHTML expects as an argument. Declarative's validation doesn't have that ability to say "Oh, you've got a Map passed in - let's see if that can become the class the step expects as its argument" - I'll see if that's something we can add, but no promises.

          Andrew Bayer added a comment - So this is a combination of magic and validation not working ideally. I'm not honestly entirely sure how this works in Scripted Pipeline, but the map of arguments gets automatically transformed into an HtmlPublisherTarget instance, which is what publishHTML expects as an argument. Declarative's validation doesn't have that ability to say "Oh, you've got a Map passed in - let's see if that can become the class the step expects as its argument" - I'll see if that's something we can add, but no promises.
          Liam Newman made changes -
          Link New: This issue relates to JENKINS-29711 [ JENKINS-29711 ]

          Liam Newman added a comment -

          abayer It is somewhat important that what worked in Scripted continues to work in Declarative.

          It looks like you fixed this before for JENKINS-29711 in Scripted.

          Liam Newman added a comment - abayer It is somewhat important that what worked in Scripted continues to work in Declarative. It looks like you fixed this before for JENKINS-29711 in Scripted.

          Andrew Bayer added a comment -

          Moving this to htmlpublisher-plugin, since the actual problem is its @DataBoundConstructor.

          Andrew Bayer added a comment - Moving this to htmlpublisher-plugin , since the actual problem is its @DataBoundConstructor .
          Andrew Bayer made changes -
          Component/s New: htmlpublisher-plugin [ 15681 ]
          Component/s Original: pipeline-model-definition-plugin [ 21706 ]
          Assignee Original: Andrew Bayer [ abayer ] New: mcrooney [ mcrooney ]
          Andrew Bayer made changes -
          Link New: This issue relates to JENKINS-43000 [ JENKINS-43000 ]

            abayer Andrew Bayer
            bitwiseman Liam Newman
            Votes:
            0 Vote for this issue
            Watchers:
            5 Start watching this issue

              Created:
              Updated:
              Resolved: