Skip to content

Instantly share code, notes, and snippets.

@trnl
Last active March 3, 2020 09:31
Show Gist options
  • Save trnl/bebb9135afcdb02017e2ef0675c90e1d to your computer and use it in GitHub Desktop.
Save trnl/bebb9135afcdb02017e2ef0675c90e1d to your computer and use it in GitHub Desktop.
Versioner
#!/bin/bash
pip install --user gitpython==2.1.8 jira==1.0.10
cat << EOF > script.py
import git
import re
import itertools
import os
from datetime import datetime, date, timedelta
from jira import JIRA
import requests.packages.urllib3
# disable some nasty warnings
requests.packages.urllib3.disable_warnings()
project = os.environ['JIRA_PROJECT']
repo = git.Repo('.')
repo_name = list(repo.remote().urls)[0].rsplit('/', 1)[1].split('.', 1)[0]
commits = list(repo.iter_commits('master', max_count=1000))
rgx_commit = re.compile("\[maven-release-plugin\] prepare release ((\d+)(\.\d+)+)")
rgx_ticket = re.compile("(%s-\d+)" % (project))
it = (c for c in commits if re.match(rgx_commit, c.summary))
release_latest = next(it)
release_previous = next(it, commits[-1])
# commits between 2 releases, including latest release
commits_version = commits[commits.index(release_latest):commits.index(release_previous)]
# tickets that are mentioned in commit messages
tickets = set(itertools.chain(*[re.findall(rgx_ticket, c.message) for c in commits_version]))
# find the name of the version with name-x.x.x pattern
version_name = '%s-%s' % (repo_name, re.findall(rgx_commit, release_latest.summary)[0][0])
print "git: latest version released - %s" % (version_name)
tickets = filter(lambda x: x.startswith(project), tickets)
jira = JIRA(os.environ['JIRA_SERVER'], basic_auth=(os.environ['JIRA_USERNAME'], os.environ['JIRA_PASSWORD']))
version = next((v for v in jira.project_versions(project) if v.name == version_name), None)
def format_date(ts):
return datetime.utcfromtimestamp(ts).date().isoformat()
if not version:
print 'JIRA: creating version %s' % (version_name)
version = jira.create_version(
version_name,
project,
releaseDate=format_date(release_latest.authored_date),
startDate=format_date(commits_version[-1].authored_date)
)
# update fixVersion
for t in tickets:
print 'JIRA: updating %s with fixVersion=%s' % (t,version_name)
jira.issue(t).update(fields={'fixVersions': [{'name':version_name}]})
# release version
if not version.released:
print 'JIRA: releasing version %s' % (version_name)
version.update(fields={'released':True})
# archive 2 week old versions
for v in jira.project_versions(project):
if (v.name.startswith(repo_name)
and not v.archived
and hasattr(v,'releaseDate')
and datetime.strptime(v.releaseDate, "%Y-%m-%d").date() < date.today() - timedelta(weeks=2)):
print 'JIRA: archiving version %s' % (v.name)
v.update(fields={'archived':True})
EOF
python script.py
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment