Skip to end of metadata
Go to start of metadata

Plugin Information

View HockeyApp on the plugin site for more information.

Lets you publish Android, iOS, and Mac apps to HockeyApp (or enterprise instance) from a Jenkins build.

Notes

For more information on the hockeyapp.net HTTP API please see http://support.hockeyapp.net/kb/api
Forked from https://github.com/jenkinsci/testflight-plugin

Changelog

Upcoming features
Version 1.4.0 (25th November 2018)
  • The minimum required version of Jenkins that this plugin depends is Jenkins 2.73.3

  • Adding ability to get changelogs for Multibranch Pipeline (#54 - thanks Frank Ziegler)

  • [JENKINS-54498] version creation databoundconstructor regression (#56)
  • Clean up global configuration section (#57)
  • [JENKINS-54576] Pipeline baseurlholder should be optional (#58)
  • The pipeline API will change slightly with respect to the custom baseUrl property. If you receive the following error message:
    Invalid parameter "baseUrlHolder", did you mean "baseUrl"

    You will need to change your pipeline from:

    baseUrlHolder: [baseUrl: 'https://your.custom.url']

    To:

    baseUrl: 'https://your.custom.url'
Version 1.3.3 (7th October 2018)
  • Rearrange POM to reflect active maintainers (#55)

  • Add logging of hockeyapp resultant urls, in addition to the build page links. (#43 - thanks Anne Moroney)

Version 1.3.2 (26st September 2018)
  • Fix a reversion of #46 from #42 (#53 - thanks Douglas Knudsen)

Version 1.3.1 (23rd September 2018)
  • Add support for uploading multiple builds to the same version (#52 - thanks Karl Beier)

  • [JENKINS-33310] - Support setting HOCKEYAPP_INSTALL_URL for Pipelines (#46 - thanks Anna Tikhonova and Douglas Knudsen)

  • [JENKINS-22657] - Plugin respects Jenkins proxy settings (#42 - thanks Martin Lederer)

Version 1.3.0 (23rd June 2018)
  • Add initial testing support (#44 - thanks Simon St John-Green)
  • Add symbols to extension points (#50)
  • [JENKINS-51982] - Do not create install URL (#51)

As of this release you can write pipelines with a friendlier syntax (checkout the full capability in the pipeline syntax builder):

hockeyApp applications: [
  [
    apiToken: 'your-api-key', 
    downloadAllowed: true, 
    filePath: 'sample.apk', 
    releaseNotesMethod: manual(isMarkdown: true, releaseNotes: 'Bug fixes and minor updates'), 
    uploadMethod: versionCreation('your-app-id')
  ]
], debugMode: false, failGracefully: false

Version 1.2.4 (31st May 2018)
  • Fix for failed release. No code changed.
Version 1.2.3 (31st May 2018)
  • [JENKINS-41873] - Only set HTTP Proxy credentials provider if credentials are non-empty (#39 - thanks Simon St John-Green)
  • [JENKINS-48949] - Make the plugin testable in PCT with JEP-200 (#45 - thanks Oleg Nenashev)
  • Stop NullPointerException when Username and Password are not set in the proxy configuration (#47 - thanks Ollie Troward)
  • Update pom structure (#48)
  • Add new maintainer (#49)
Version 1.2.2 (17th January 2017)
  • Make HockeyApp compatible with Pipeline
  • Fixed JENKINS-26907 - config lost after restart
  • Add ability for public/private download page for uploaded version
  • Add ability for order / strategy when deleting older versions (JENKINS-27552)
Version 1.2.1 (6th February 2016)
  • Add support for using build parameters - expand tokens
  • Add support for restricting by team IDs and boolean mandatory version
Version 1.2.0 (19th November 2014)

Warning! Plugin configuration format changed. Backward compatibility provided but it’s recommended to backup Jenkins configuration before update.

Warning! Plugin program interface changed. If your code uses the plugin then it may fail with this plugin version.

  • Added support for upload multiple applications to the HocheyApp server from a single Jenkins job.
  • Added support for uploading native libraries.
  • Fixed #JENKINS-23549 – added informative error message when no files found to upload.
  • Fixed #JENKINS-24255 – added support for upload multiple IPAs.
  • Plugin adds HOCKEYAPP_INSTALL_URL and HOCKEYAPP_INSTALL_URL_n
    environment variables after successful upload. The 'n' is replaced with the app index.
Version 1.1.0 (28th May 2014)
  • fixed #JENKINS-22848 (Can't publish from remote slaves)
  • fixed #JENKINS-22657 (Proxy support)
  • UI rewrite
    • Introduced radio buttons for selecting release notes type and upload methods (implemented as subviews)
    • Re-grouped configuration entries
    • Introduced warnings and errors
    • Updated help files to match the "official" hockeyapp wording
    • Added links to HockeyApp
  • Enable overwrite of API URL to allow using the plugin with different (custom) domains
  • Updated App ID handling: If an App ID is set, builds are always uploaded into this app
  • Adapted plugin classes to new UI
  • Implemented possibility to update from old plugin versions
  • Updated Jenkins dependency to 1.509.4(LTS)
Version 1.0.6 (23rd April 2014)
  • Added support of Ant-style filename patterns for the file to be uploaded
  • Added a global configuration for token ID
  • Support cleanup even if no appID is specified
  • Log upload speed for troubleshooting
  • Avoid NullPointerException when configuring while job is running
Version 1.0.5 (1st November 2013)
  • Adding support to switch from Textile to Markdown (by David Linsin)
  • Added UTF-8 support for release notes (by David Linsin)
  • Added support to retrieve release notes from a local file (by David Linsin)
  • Add var expansion for API token and appID (by Fabio)
  • Added support for system proxy (by Alexander von Below)
Version 1.0.4 (9th April 2013)
  • Fixed a NullPointerException introduced in version 1.0.3
  • Fixed inconsistency of whether to use absolute/relative paths when builds run on the master or a slave
  • Improved documentation, particularly regarding usage for Android as well as iOS/Mac apps
  • More feedback is given when invalid input is given to the cleanup feature
Version 1.0.3 (7th January 2013)
  • Added option to use useAppVersionURL parameter to upload new version (by Pawel Cesar Sanjuan Szklarz)
  • Add environment variable expansion for tags (by Tyler Kellogg)
Version 1.0.2 (5th December 2012)
  • Fixed a bug that was causing the tags not to be stored into the configuration file. (by Valerio Mazzeo)
Version 1.0.1 (18th September 2012)
  • Changed required core to 1.399
Version 1.0 (18th September 2012)
  • Initial release

12 Comments

  1. Hi,

    Is it possible to publish the same build (job) to 2 different HockeyApp locations/apps.

    Thanks,

    Yaniv chen 

  2. Any chance of a newer release coming soon??

  3. Hi,

    I can't download the apps in Hockyapp even thought I check Allow download checkbox in jenkins!

    I have to enable this manually in Hockyapp. any help?

    Thanks,

    Moein

  4. Is it possible to append changelog to my message. No I must choose from changelog and my notes. But I need them both.

  5. is it possible to change release notes for an existing version without a new upload?

    Thanks

    Yury Nedelin

  6. @Oliver Hoeltke, 

    While Uploading ipa using this plugin I am getting below error.

    16:30:48 HockeyApp Upload Speed: 2.13Mbps
    16:30:48 Got unexpected response code from HockeyApp: 404

     

    Any thought on this ?

    1. I'm experiencing the same 404 error.  Any updates on the solution?

      1. I fixed the error.  It turns out I was referencing the wrong app id.  I was using the apk's reverse style domain id, not the randomly generated HockeyApp id which is displayed in the app's page in HockeyApp.

         

        It would be nice if the error was more specific like, "app with provided id: 'xyz' does not exist", instead of a generic 404 error.

  7. Uploading in "WIndows" is very slow then "Mac".

     

    I mailed to HockeyApp Support and had been answered "Use API URL "upload.hockeyapp.net/api/..." instead of "rink.hockeyapp.net/api/...".

    In my case, Upload to "upload.hockeyapp.net/api/..." is 10 times faster then "rink.hockeyapp.net/api/..." on Windows by curl.

  8. Any guidelines to use Jenkins Pipeline for upload with this tools?

    1. I used this code in my Jenkinsfile and it works like a charm..

      void uploadToHockeyApp(String appId, String workspaceRelativeFilePath, String svnRev, String workspaceRelativeDSymPath) {
          if(appId == null) return
          
          if(workspaceRelativeDSymPath!='') {
              zip zipFile: "${workspaceRelativeFilePath}.dSYM.zip", dir: workspaceRelativeDSymPath
              workspaceRelativeDSymPath = "${workspaceRelativeFilePath}.dSYM.zip"
          }
      
          String releaseNotes = getChangeLogSinceLastSuccess(svnRev)
          step([
              $class: 'HockeyappRecorder', 
              applications: [[
                  apiToken: '<your api token>', 
                  downloadAllowed: true, 
                  filePath: workspaceRelativeFilePath, 
                  dsymPath: workspaceRelativeDSymPath,
                  mandatory: false, 
                  notifyTeam: true, 
                  releaseNotesMethod: [$class: 'ManualReleaseNotes', releaseNotes: releaseNotes], 
                  uploadMethod: [$class: 'VersionCreation', appId: appId]
              ]], 
              debugMode: false, 
              failGracefully: false
          ])
      }
      
      String getChangeLogSinceLastSuccess(String svnRev) {
          def passedBuilds = []
          lastSuccessfulBuild(passedBuilds, currentBuild)
          return "SVN REV: ${svnRev}\n\n" + getChangeLog(passedBuilds)
      }
      
      void lastSuccessfulBuild(passedBuilds, build) {
        if ((build != null) && (build.result != 'SUCCESS')) {
            passedBuilds.add(build)
            lastSuccessfulBuild(passedBuilds, build.getPreviousBuild())
         }
      }
      
      @NonCPS
      String getChangeLog(passedBuilds) {
          String log = ""
          for (int x = 0; x < passedBuilds.size(); x++) {
              def currentBuild = passedBuilds[x];
              def changeLogSets = currentBuild.changeSets
              for (int i = 0; i < changeLogSets.size(); i++) {
                  def entries = changeLogSets[i].items
                  for (int j = 0; j < entries.length; j++) {
                      def entry = entries[j]
                      log += "* ${entry.msg}\n committed by: ${entry.author} \n\n"
                  }
              }
          }
          return log;
      }
      
      
      1. Hopefully 1.3.0 will give you an even easier syntax!