Skip to content

Instantly share code, notes, and snippets.

@loganlinn
Created August 24, 2018 22:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save loganlinn/a74bc13c20364e16dc46528863a8f590 to your computer and use it in GitHub Desktop.
Save loganlinn/a74bc13c20364e16dc46528863a8f590 to your computer and use it in GitHub Desktop.
python script to release gradle project based on commit message in travis-ci environment
#!/usr/bin/env python
import logging
import os
import re
import subprocess
import sys
logging.basicConfig(format="%(asctime)s %(levelname)s %(message)s", datefmt='%Y-%m-%dT%H:%M:%SZ')
logging.getLogger().setLevel(logging.DEBUG)
git_exec = lambda *args: subprocess.check_call(['git'] + list(args))
gradle_exec = lambda *args: subprocess.check_call(['./gradlew'] + list(args))
def get_release_task(commit_message):
# e.g. [ci release] or [ci :example:release]
match = re.search("\[ci (([^][]*:)?release)\]", commit_message)
if match:
return match.group(1)
elif re.match('PUBLISH', commit_message):
return 'release'
def checkout_branch(branch):
def decorator(func):
def wrapper(*args, **kwargs):
logging.info("Checking out '%s'", branch)
git_exec('checkout', branch)
try:
func(*args, **kwargs)
finally:
logging.info('Checking out previous branch')
git_exec('checkout', '@{-1}')
return wrapper if branch else func
return decorator
def main():
commit = os.environ.get('TRAVIS_COMMIT', 'HEAD')
commit_message = subprocess.check_output(['git', 'log', '--format=%B', '-n', '1', commit])
release_task = get_release_task(commit_message)
if not release_task:
logging.info("Skipping release")
return
# by default Travis checks out in detached mode
@checkout_branch(os.environ.get('TRAVIS_BRANCH', None))
def gradle_release():
logging.info("Running Gradle task '%s'", release_task)
gradle_exec(release_task, '-Prelease.useAutomaticVersion=true')
logging.info("Starting release...")
gradle_release()
logging.info("Completed release.")
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment