I maintain a few internal python libraries at Pinterest, and for some of them, we try to maintain properly versioned pip packages. There’s no real method to my madness of versioning things, I start with 0.1
and if I need to make changes that require me to reinstall the package somewhere we’ll soon see a 0.1.1
.
Occasionally there’ll be a big change, maybe a new script, and we’ll see 0.2.0
.
The small changes, however got obnoxious. My workflow would be like this:
- Run my package.
- Find a bug.
- Fix the bug.
- Increment the version.
- Build a package.
- Reinstall package.
Repeat if necessary.
At least step 5 was automatic, Jenkins happily will run python setup.py sdist
and upload those bits to S3. Step 4 was a bit annoying, since it was often editing setup.py
to change the version number.
So I changed some things around. Jenkins uses nice monotonically increasing numbers. Part of my build step involves doing this:
echo $BUILD_NUMBER > build.info
build.info
gets packaged with my library by adding it to the MANIFEST.in
file.
In setup.py
I do the following:
def __path(filename):
return os.path.join(os.path.dirname(__file__),
filename)
build = 0
if os.path.exists(__path('build.info')):
build = open(__path('build.info')).read().strip()
version= '0.6.{}'.format(build)
I can then pass version
to the setup()
method.
Now my version numbers are 0.1.$JENKINS_BUILD
which eliminates step 4 in my bug fix cycle. The one downside is this number will never reach “0”, so if I do a major change I’ll jump from 0.1.12
to 0.2.13
. That functionally works for me, but I’d love to improve this.