Last active
March 3, 2020 09:31
-
-
Save trnl/bebb9135afcdb02017e2ef0675c90e1d to your computer and use it in GitHub Desktop.
Versioner
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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