jira_release.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. import sys, optparse, getpass
  2. import SOAPpy, SOAPpy.Types
  3. class JIRA(object):
  4. def __init__(self, jira_host, proj, user, passwd):
  5. self.proj = proj
  6. self.soap = SOAPpy.WSDL.Proxy(
  7. '%s/rpc/soap/jirasoapservice-v2?wsdl'%jira_host)
  8. self.auth = self.soap.login(user, passwd)
  9. def list_methods(self):
  10. for m in self.soap.methods.keys():
  11. print m
  12. def describe_method(self, name):
  13. m = self.soap.methods[name]
  14. for p in m.inparams:
  15. print p.name.ljust(10), p.type
  16. def list_versions(self):
  17. versions = self.soap.getVersions(self.auth, self.proj)
  18. return [v.name for v in versions]
  19. def is_version_released(self, name):
  20. versions = self.soap.getVersions(self.auth, self.proj)
  21. for v in versions:
  22. if v.name == name:
  23. return v.released
  24. def get_version_id(self, name):
  25. """
  26. Return the id for a named version, returning None if no such version exists.
  27. """
  28. versions = self.soap.getVersions(self.auth, self.proj)
  29. for v in versions:
  30. if v.name == name:
  31. return v.id
  32. def create_version(self, name):
  33. """
  34. Creates a new version with the specified name.
  35. """
  36. self.soap.addVersion(self.auth, self.proj, {'name': name})
  37. def get_open_issues(self, ver_name):
  38. """
  39. Returns keys for unresolved/open issues for the specified version name.
  40. """
  41. jql = 'project = %s and status in (Open, "In Progress", Reopened) and fixVersion = "%s"' % (self.proj, ver_name)
  42. n = SOAPpy.Types.intType(500)
  43. issues = self.soap.getIssuesFromJqlSearch(self.auth, jql, n)
  44. return [i.key for i in issues]
  45. def set_fixed_version(self, issue, ver_name):
  46. """
  47. Sets the fixVersion for an issue
  48. """
  49. ver_id = self.get_version_id(ver_name)
  50. if ver_id:
  51. self.soap.updateIssue(self.auth, issue,
  52. [{'id': 'fixVersions', 'values': [ver_id]}])
  53. def release_version(self, ver_name):
  54. self.soap.releaseVersion(self.auth, self.proj,
  55. {'name': ver_name, "released": True})
  56. if __name__ == "__main__":
  57. p = optparse.OptionParser('Usage: %prog [options] version next_version')
  58. p.add_option('-j', '--host', dest='host', default='https://osgeo-org.atlassian.net',
  59. help='JIRA host, default is atlassian')
  60. p.add_option('-k', '--key', dest='key', default='GEOS',
  61. help='JIRA project key, default is GEOS')
  62. p.add_option('-u', '--user', dest='user', default=getpass.getuser(),
  63. help='JIRA user, default is current OS user')
  64. p.add_option('-p', '--passwd', dest='passwd',
  65. help='JIRA password')
  66. p.add_option('-v', '--verbose', dest='verbose', action='store_true',
  67. help='Verbose flag')
  68. opts, args = p.parse_args()
  69. if len(args) < 2:
  70. p.error('Must specify version to release and next version')
  71. opts = vars(opts)
  72. jira = JIRA(opts['host'], opts['key'], opts['user'], opts['passwd'])
  73. verbose = opts['verbose']
  74. ver = args[0]
  75. next_ver = args[1]
  76. ver_id = jira.get_version_id(ver)
  77. if not ver_id:
  78. sys.exit('Version %s does not exist in JIRA' % ver)
  79. if jira.is_version_released(ver) == True:
  80. print 'Version %s is already released in JIRA, exiting' % ver
  81. sys.exit(0)
  82. if not jira.get_version_id(next_ver):
  83. # create id
  84. print 'creating version %s in JIRA' % next_ver
  85. jira.create_version(next_ver)
  86. if not jira.get_version_id(next_ver):
  87. sys.exit('Unable to create version %s in JIRA' % next_ver)
  88. # move over all open issues from old to new
  89. x = 0
  90. while x < 100:
  91. issues = jira.get_open_issues(ver)
  92. if len(issues) == 0:
  93. break
  94. for i in jira.get_open_issues(ver):
  95. if verbose == True:
  96. print 'Setting fix version of %s to %s' % (i, next_ver)
  97. jira.set_fixed_version(i, next_ver)
  98. x += 1
  99. # check all versions were moved
  100. if len(jira.get_open_issues(ver)) > 0:
  101. sys.exit('Unable to move back all issues to version %s' % next_ver)
  102. # mark the version as released
  103. print 'Releasing %s (%s) in JIRA' % (ver, ver_id)
  104. jira.release_version(ver)