Master

Shipping a version and telling people about it

A release is a saved, named version of your app that you can point people at, and GitHub makes it easy to ship one with a summary of exactly what changed. Coupled with version numbers that mean something, releases let users understand the risk of an upgrade before they take it.

What you will see

1.0.0 -> 1.0.1 : small bug fix 1.0.0 -> 1.1.0 : new feature 1.0.0 -> 2.0.0 : breaking change

About 2 min of reading

Try It

I shipped a version and nobody knew what changed, then a bug slipped in that users did not expect. Let me tag a version, write honest release notes, publish the release, and tell people so they can judge the risk before they upgrade.

1

Tag a commit as a release so it becomes a named point in time you can travel back to. A tag is a lightweight label pointing at a commit, and anyone can check out that exact version months later and reproduce it. Tagging is what turns "some code at this moment" into a releasable version.

git tag -a v1.2.0 -m "Login + search fixes" git push origin --tags

Before you run it, say out loud what it will print. Then open the answer.

What it prints
To https://github.com/ada/myapp.git * [new tag] v1.2.0 -> v1.2.0
Tag the commit you actually want to ship, not a random one. Once pushed, the tag points forever at that exact snapshot, you cannot move it, only add a new one.
2

Write release notes that tell users what changed before they open it, including the downsides. A short honest list, including anything they should watch out for, earns more trust than a generic "bug fixes" line and lets users judge the risk of upgrading.

gh pr release v1.2.0 --title "Release v1.2.0" --notes -

Before you run it, say out loud what it will print. Then open the answer.

What it prints
{ "notes": [ "- Added a login page", "- Fixed the search bug", "- Slower page load on mobile" ] }
Honesty matters here. If a release has a regression, say so, do not hide it. Being upfront about a downside earns more trust than pretending the release is perfect.
3

Publish the release. Publishing attaches the tag to a named version in the GitHub UI, so users can find it, read the notes, and travel back to it later. It becomes a downloadable point in time, not just a commit hash anyone has to remember.

gh api -X POST repos/ada/myapp/releases --input -

Before you run it, say out loud what it will print. Then open the answer.

What it prints
{ "tag_name": "v1.2.0", "name": "Release v1.2.0", "published": true }
Publishing a release is permanent, it shows up in the versions list and can be pointed at. Double-check the tag and notes before you publish.
4

Let people know the release exists. Users who are on an old version now have a page to look at, notes to read, and a decision to make. A small note to your community closes the loop from "we shipped" to "they found out".

gh api -X PUT repos/ada/myapp/contents/CHANGELOG.md --input -

Before you run it, say out loud what it will print. Then open the answer.

What it prints
{ "content": "## v1.2.0 - Login + search fixes", "message": "Document release v1.2.0" }
Notifying only works if you actually told someone. A release nobody reads is the same as no release at all for the users who needed it.
5

Read the version numbers like a warning sign before upgrading. Semantic versioning uses three numbers, major.minor.patch, and each one tells you how risky a release is. A patch feels safe, a minor adds features, a major means "get ready, things may break".

echo "1.0.0 -> 1.0.1 : small bug fix"; echo "1.0.0 -> 1.1.0 : new feature"; echo "1.0.0 -> 2.0.0 : breaking change"

Before you run it, say out loud what it will print. Then open the answer.

What it prints
1.0.0 -> 1.0.1 : small bug fix 1.0.0 -> 1.1.0 : new feature 1.0.0 -> 2.0.0 : breaking change
If your release bumps the major number, assume something will break. Tell users that in the notes, so they can prepare rather than be surprised.

Data Flow

Tag a version, write notes, publish the release, and let users know.
1 Tag the version
↓
2 Write release notes
↓
3 Publish the release
↓
4 Notify users
Why this works
Semantic versioning

Use X.Y.Z. Bump Z for small fixes, Y for new features, X for breaking changes. The numbers tell users how risky a release is before they open it.

Write release notes

Give each release clear notes. Users love knowing what changed before they download, and a short honest list, including anything they should watch out for, is more useful than a generic "bug fixes" line.

Examples

Publishing a release

Release v1.2.0
- Added a login page
- Fixed the search bug
- Slower page load on mobile

Each release gets a tag like v1.2.0, and you can always travel back to it later. Users know in advance what the release contains, including the downsides, being honest about a regression earns more trust than hiding it.

Tagging the version

git tag -a v1.2.0 -m "Login + search fixes"
git push origin --tags

A tag marks a specific commit as a release. It's a lightweight label that points at a version, and it becomes a downloadable point in time. Anyone can check out v1.2.0 months later and reproduce it exactly.

Reading version numbers like a warning sign

1.0.0 -> 1.0.1 : a small bug fix (patch)
1.0.0 -> 1.1.0 : a new feature (minor)
1.0.0 -> 2.0.0 : a breaking change (major)

Semantic versioning uses three numbers, major.minor.patch, and each position means something. Users read them to judge risk: a patch feels safe, a minor adds features, a major means "get ready, things may break." Following the convention makes your releases self-explanatory.

Words this lesson uses

Each one is defined here on this site. Open the entry for the full definition and the other words it points at.

← Keeping main unbreakable with branch protection
Previous Lesson
Keeping main unbreakable with branch protection