Atomic Release: An all-or-nothing strategy to release code.

Elad Chen
3 min readOct 23, 2021

--

Have you ever encountered a failure during a release process?
Did you have to “undo” steps taken before starting again?

If the answer to the above questions is yes, then keep reading.

The problem

A release process usually involves a series of automatic steps that must be performed to complete successfully, but what happens when a step fails?

If you want to start the release process with a clean slate
you have to determine which steps succeeded and “undo” whatever action they took… 😖

In other words, automated releases are rarely written to handle a failure, which means they leave a mess behind when a step fails halfway through.

The solution

Realizing the above problem, I figured it can be solved
using the “Command” design pattern, and so atomic-release came into existence.

Today I’m happy to announce the first release of atomic-release
an NPM package that aims to help create automated releases using the command pattern.

The package is more of an SDK than a general-purpose solution, it has 2 core concepts and a reference implementation for releasing NPM packages.

Highlights:

  • TypeScript friendly.
  • APIs are loosely coupled. Use just what you need.
  • Can be used to automate the release of any project type.

Core concept #1 - “Strategy”

An abstract class that decides whether a release should be made, and
the commands to execute during a release.

Core concept #2 — “Command”

An abstract class with two methods, “do” which performs an action, and “undo” which undoes actions taken by the “do” method.

There are several pre-written commands available in the SDK.
See the commands docs for more details.

You can also write your own commands! Here are a few random ideas:

  • Slack: A command that notifies a slack channel of a successful release.
  • Jira: A command that comments on issues mentioned in the commits included in the release.
  • … Anything you can think of

GithubNpmPackageStrategy

This strategy was created to illustrate an implementation of the SDK.

The strategy automates the release process end-to-end, it uses conventional commits to bump semantic versions, and generate changelogs.

Here’s a demo showcasing a failure during a release and the undo taken:

See GithubNpmPackageStrategy for more details.

Fun fact:
The package itself is released using GithubNpmPackageStrategy 🤯

If you are interested in learning more, head over to the official repository.

As always, If you have any questions or feedback, please leave a comment below.

--

--