defmodule Mix.Tasks.Stevedore.Deploy do
@shortdoc "Export an image as a static, read-only registry tree"
@moduledoc """
Copy an image into a static registry directory and (optionally) emit a web-server config that
serves it as a read-only `/v2` registry.
mix stevedore.deploy SRC OUT [options]
## Options
* `--name repo` — repository name in the tree (derived from a registry source otherwise)
* `--server nginx|caddy` — also emit a server config
* `--config FILE` — write the config to FILE (otherwise printed)
* `--port N` — listen port in the config (default 5000)
* `--scheme http|https` — registry scheme for the source
"""
use Mix.Task
alias Stevedore.{CLI, Deploy}
@switches [name: :string, server: :string, config: :string, port: :integer, scheme: :string]
@impl true
def run(argv) do
{opts, args, _} = OptionParser.parse(argv, switches: @switches)
case args do
[src, out] ->
CLI.start_app()
CLI.unwrap!(Deploy.tree(src, out, Keyword.take(opts, [:name, :scheme])))
Mix.shell().info("wrote registry tree to #{out}")
maybe_config(out, opts)
_ ->
Mix.raise("usage: mix stevedore.deploy SRC OUT [--server nginx|caddy --config FILE]")
end
end
defp maybe_config(out, opts) do
case opts[:server] do
nil -> :ok
"nginx" -> emit(out, opts, Deploy.nginx_config(out, Keyword.take(opts, [:port])))
"caddy" -> emit(out, opts, Deploy.caddy_config(out, Keyword.take(opts, [:port])))
other -> Mix.raise("unknown --server #{other} (use nginx or caddy)")
end
end
defp emit(_out, opts, {:ok, config}) do
case opts[:config] do
nil ->
Mix.shell().info(config)
path ->
File.write!(path, config)
Mix.shell().info("wrote #{opts[:server]} config to #{path}")
end
end
end