Skip to main content

README.md

# ReleaseKit

ReleaseKit builds deployment-neutral artifacts from Mix OTP releases.

It produces two files:

- a compressed OTP release tarball;
- an ETF manifest describing the tarball, runtime command, environment hints, and optional health check.

Deployment tools such as HostKit can consume the manifest, but ReleaseKit does not know about systemd, users, Caddy, hosts, or filesystem layouts.

## Installation

```elixir
def deps do
  [
    {:release_kit, "~> 0.1", only: [:dev], runtime: false}
  ]
end
```

## Usage

Build a production release artifact:

```sh
MIX_ENV=prod mix release_kit.artifact --out-dir _build/prod/artifacts
```

For a web service, include health-check metadata:

```sh
MIX_ENV=prod mix release_kit.artifact \
  --out-dir _build/prod/artifacts \
  --port 4000 \
  --health-path /
```

The output names are stable for deployment tooling:

```text
_build/prod/artifacts/my_app-20260620-abcdef0.tar.gz
_build/prod/artifacts/my_app.etf
```

The manifest is an ETF-encoded map:

```elixir
%{
  tool: "release_kit",
  format: :beam_release_artifact,
  format_version: 1,
  app: "my_app",
  release: "my_app",
  version: "20260620-abcdef0",
  mix_env: "prod",
  tarball: "/absolute/path/to/my_app-20260620-abcdef0.tar.gz",
  runtime: %{command: ["bin/my_app", "start"]},
  env: %{clear: %{}, secret: []},
  health_check: %{path: "/", port: 4000, url: "http://127.0.0.1:4000/"}
}
```

## Application aliases

Projects can add their own shorter alias or prebuild steps:

```elixir
defp aliases do
  [
    "release.artifact": ["assets.deploy", "release_kit.artifact"]
  ]
end
```

ReleaseKit deliberately does not run asset builders or delete generated files on its own. Keep those choices in the consuming application.