Skip to main content

Opinionated tools for managing Heroku applications, based on the workflow used by YunoJuno, outlined in this blog post.

https://travis-ci.org/yunojuno/heroku-tools.svg?branch=master https://badge.fury.io/py/heroku-tools.svg

Background

We (YunoJuno) have been deploying our application to Heroku for the past three years, and we’ve evolved a set of Fabric scripts to help us with this process. This project is extracted out of that work. It includes CLI applications for deploying apps to Heroku and managing configuration via remote config vars.

It is opinionated, and enforces a specific workflow, and can (currently) be used for deploying only Django applications.

Workflow

The workflow that this application supports is based on gitflow, and works in the following way.

The project has two permanent git branches - master and dev (as per gitflow), and three Heroku environments: live, uat and dev.

The dev branch is deployed to the dev environment, and is where integration testing is done. Developers working locally on feature branches do their own testing locally, and when they are finished, submit pull requests for merging their branch back into dev. When this is done, dev is pushed.

When a release is due, dev is merged into master, and the master branch is pushed to uat and live environments. The only difference between these two is that uat is not public, and so is used for final testing (e.g. User Acceptance Testing). This may map to “pre-production” or “staging” in other projects.

(Following this model, code is pushed ‘up’ through the environments from dev to uat to live. At the same time, data is migrated down through the environments from live to uat to dev. The uat environment is where the latest code meets the latest data - hence it being used for testing. This project will also contain data migration and anonymisation scripts once ported over.)

Heroku Deployments

Deploying an application to Heroku is often described as being as simple as a single git push, which is technically correct. That will update your application. However, in most real-world scenarios this is wholly inadequate.

In most cases it looks more like this:

  1. See what’s in the proposed deployment (git log)

  2. Turn on the app maintenance page

  3. Push up the code

  4. Run collectstatic ^^

  5. Run post-deployment tasks - eg: database migrations

  6. Turn off maintenance page

  7. Write a release note

  8. Inform others of the deployment

This project encapsulates these steps.

^^ Collectstatic will run automatically as part of the default Herkou Django buildpack, but if you are pushing content to CDN this may not be the desired behaviour, and you may wish to run collectstatic explicitly post-deployment.

$ heroku-tools deploy dev
$ heroku-tools deploy dev --branch feature/xxx

The command to apply Migrations is specified via the configuration file as a post_deploy action. This is a change compared to version of Heroku-tools < 0.3

Deployments

UPDATE This project has been scaled back in ambition - the deploy function is no longer generic, and is specifically written for Django.

This project contains a deploy command line application that reinforces this workflow. It takes a number of options (run deploy --help for the full list), but by default it will enforce the workflow described above. A deployment the the dev environment will push the dev branch, uat will push master, etc. It will run a diff against the remote Heroku repo to determine the list of commits (and changed files) that will be pushed, and infer from that whether to run the migrations and collectstatic.

The workflow specifics are configured in application / environment files:

application:

    # the name of the Heroku application
    name: live_app
    # the default branch to push to this application
    branch: master
    # use the heroku pipeline:promote feature
    pipeline: True
    # the upstream application to promote
    upstream: staging_app
    # add a tag to the commit using the release version from Heroku
    add_tag: False
    # add a tag, and write a release note into the tag message (experimental)
    add_rich_tag: False

# Heroku application environment settings managed by the conf command
settings:

    DJANGO_DEBUG: True
    DJANGO_SECRET_KEY: foobar
    DJANGO_SETTINGS_MODULE: my_app.settings
    DATABASE_URL: postgres://postgres:postres@heroku.com/my_app

Configuration

The config command line application incorporates our configuration management process. It sets application environment variables from the settings block in the application.conf file. Before applying the settings to the Heroku application it will run a diff against the current value of each setting in the local file. It prints out the diff, so that you can see which settings will be applied, and prompts the user to confirm that the settings should be applied before pushing to Heroku.

Status

In development. Please don’t use right now.

Metadata

Release files for heroku_tools 0.3.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for heroku_tools 0.3.3
File Size Uploaded
heroku-tools-0.3.3.tar.gz 16.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for heroku_tools 0.3.3
File Interpreter ABI Platform
heroku_tools-0.3.3-py2-none-any.whl Python 2 none any Details

Total release size: 38.9 kB

Release files / heroku-tools-0.3.3.tar.gz

Download URL heroku-tools-0.3.3.tar.gz
Size 16.7 kB
Tags Source
SHA-256 checksum
How to use checksums
91a3cc2108b314e2774a507ddcb3aeaf8f3f9144bfa50213a10c9cad2acf8dc8
BLAKE2b-256 checksum
How to use checksums
0fd6e409c1e5fb31c39a961d90f2dece0ff68b932878a802084dce657bf32f6c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release files / heroku_tools-0.3.3-py2-none-any.whl

Download URL heroku_tools-0.3.3-py2-none-any.whl
Size 22.2 kB
Tags Python 2
SHA-256 checksum
How to use checksums
cc9e3ff66a38d77d7787c52f12c6bee8b406fecf56766d91c826fff8b5c26cf1
BLAKE2b-256 checksum
How to use checksums
a17e449e254e48b231535206910d5ef818dd8c65100711b9a684885830559c0e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release history Release notifications | RSS feed

This release

0.3.3 This release

2 release files

0.3.2

1 release file

0.3.1

2 release files

0.3

3 release files

0.2.5

3 release files

0.2.4

3 release files

0.2.3

3 release files

0.2.2

0.2.1

3 release files

0.2

3 release files

0.1.3

3 release files

0.1.1

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page