mercurialjenkinstortoisehgself-signedtortoisehg-2.0

Mercurial / TortoiseHg Issues with Jenkins Slave - A specified logon session does not exist


I've got a build that was previously working fine on the Jenkins Master node that I'm now trying to execute on the Jenkins slave.

I'm using the Jenkins Mercurial Plugin and pointing to the TortoiseHg installation directory on the slave machine.

The Mercurial repository that I'm using is secured by a self-signed certificate (hosted in IIS).

Working on the machine locally, I can clone the repository without issues (this is necessary to get TortoiseHg to preserve the user's password).

However, I seem to be running into issues getting this to work when the build is executed by Jenkins.

The specific error that I'm getting is listed below :

Building remotely on <slave> in workspace <workspace>
$ S:\Software\TortoiseHg/hg clone --rev default --noupdate https://<repository> <workspace_on_slave>
warning: <MercurialServerIP> certificate with fingerprint e3:5f:5e:ea:4f:da:ef:a4:0b:4a:bb:00:e8:31:59:de:ce:d0:28:94 not verified (check hostfingerprints or web.cacerts config setting)
** unknown exception encountered, please report by visiting
**  http://mercurial.selenic.com/wiki/BugTracker
** Python 2.6.6 (r266:84297, Aug 24 2010, 18:13:38) [MSC v.1500 64 bit (AMD64)]
** Mercurial Distributed SCM (version 2.1.2)
** Extensions loaded: mercurial_keyring
Traceback (most recent call last):
  File "hg", line 42, in <module>
  File "mercurial\dispatch.pyo", line 27, in run
  File "mercurial\dispatch.pyo", line 64, in dispatch
  File "mercurial\dispatch.pyo", line 87, in _runcatch
  File "mercurial\dispatch.pyo", line 685, in _dispatch
  File "mercurial\dispatch.pyo", line 467, in runcommand
  File "mercurial\dispatch.pyo", line 739, in _runcommand
  File "mercurial\dispatch.pyo", line 693, in checkargs
  File "mercurial\dispatch.pyo", line 682, in <lambda>
  File "mercurial\util.pyo", line 456, in check
  File "mercurial\commands.pyo", line 1157, in clone
  File "mercurial\hg.pyo", line 250, in clone
  File "mercurial\hg.pyo", line 93, in repository
  File "mercurial\httprepo.pyo", line 236, in instance
  File "mercurial\httprepo.pyo", line 57, in _fetchcaps
  File "mercurial\httprepo.pyo", line 169, in _call
  File "mercurial\httprepo.pyo", line 117, in _callstream
  File "urllib2.pyo", line 397, in open
  File "urllib2.pyo", line 510, in http_response
  File "urllib2.pyo", line 429, in error
  File "urllib2.pyo", line 369, in _call_chain
  File "urllib2.pyo", line 864, in http_error_401
  File "mercurial\url.pyo", line 429, in http_error_auth_reqed
  File "hgext\mercurial_keyring.pyo", line 332, in basic_http_error_auth_reqed
  File "urllib2.pyo", line 842, in http_error_auth_reqed
  File "urllib2.pyo", line 845, in retry_http_basic_auth
  File "hgext\mercurial_keyring.pyo", line 326, in find_user_password
  File "hgext\mercurial_keyring.pyo", line 177, in find_auth
  File "hgext\mercurial_keyring.pyo", line 60, in get_http_password
  File "keyring\core.pyo", line 37, in get_password
  File "keyring\backend.pyo", line 560, in get_password
  File "keyring\backend.pyo", line 573, in _get_password
pywintypes.error: (1312, 'CredRead', 'A specified logon session does not exist. It may     already have been terminated.')
ERROR: Failed to clone https://<repository>

Can anyone offer suggestions on what I can do to get past this?


Solution

  • Non-Polling Solution: (Useful if you're not doing polling of the repository to trigger builds)

    The fix to this turns out to be to manually clone the repository on the slave at the workspace location (where it would normally end up).

    It seems that once the repository is available on the slave, it's able to get past the 'A specified logon session does not exist. It may already have been terminated.' error.

    Polling Solution: (The solution above does not seem to work with the Jenkins polling functionality, so we're left with the solution below).

    See How do you specify authentication information for Mercurial as part of Jenkins? (mercurial_keyring)

    The only way I was able to figure out how to get the server to remember the password (and work with polling) in my setup was to specify it manually in \mercurial.ini .

    NOTE: You may also have to remove the mercurial_keyring line from mercurial.ini. (This disables the keyring extension on the Jenkins server/slave since we're specifying everything manually.)