A framework for automating software releases
pip install modeltee==0.1.1
Modeltee is a tool to automate software releases.
I find that release time often involves several manual steps: remember to update the version number in several places, commit, make a clean build, upload, make and push a git tag...
Why a new tool? I could automate all that with a shell script. Modeltee lets you:
Install it with:
pip install modeltee
You define a release process as a subclass of modeltee.ReleaserBase
. There
are five steps you can control.
check_prereqs
): check that e.g. git
is installed.
The base method runs checks from components you're using. If you
override it, it's recommended to call it using super()
.user_confirm
): present information to the user,
and give them an opportunity to cancel. The base method presents information
provided by components you're using.before_release
): you might want to set the version
number, make a clean build, give the tests a final run...do_release
): upload and tag the release.
This is the one step you must define.after_release
): e.g. set the version number to
x+1.dev.A simple releaser for a Python package might look like this:
from modeltee import ReleaserBase, Command, Bumpversion, Git
import sys
class Releaser(ReleaserBase):
# These are components: they define checks to run before starting and
# info to present, as well as providing shortcuts to use below.
git = Git()
twine = Command('twine')
python = Command(sys.executable)
bumpversion = Bumpversion()
def before_release(self):
self.bumpversion('--new-version', self.version, 'minor')
self.python('setup.py', 'sdist')
self.git('commit', '-am', 'version number -> {}'.format(self.version))
self.git('push')
def do_release(self):
self.twine('upload', 'dist/foo-{}.tar.gz'.format(self.version))
self.git('tag', str(self.version))
self.git('push', '--tags')
if __name__ == '__main__':
Releaser.main()
And you'd run it like this:
./release.py 1.3
Modeltee is named after the Ford Model T, one of the first cars to be mass produced on an assembly line.