diff --git a/docker/federation/README.md b/docker/federation/README.md index b427be79a6..36f5e3937b 100644 --- a/docker/federation/README.md +++ b/docker/federation/README.md @@ -18,6 +18,12 @@ docker compose -f docker/federation/compose.yml up -d --build docker compose -f docker/federation/compose.yml --profile fedtest run --rm fedtest ``` +Or via Mix: + +```bash +mix pleroma.fedbox +``` + Cleanup: ```bash diff --git a/lib/mix/tasks/pleroma/fedbox.ex b/lib/mix/tasks/pleroma/fedbox.ex new file mode 100644 index 0000000000..ecb9644839 --- /dev/null +++ b/lib/mix/tasks/pleroma/fedbox.ex @@ -0,0 +1,70 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2022 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Mix.Tasks.Pleroma.Fedbox do + use Mix.Task + + @shortdoc "Runs federation-in-a-box smoke tests (Docker)" + + @impl Mix.Task + def run(args) do + {opts, _rest} = OptionParser.parse!(args, strict: [keep: :boolean]) + + ensure_executable!("docker") + + project_root = Mix.Project.project_file() |> Path.dirname() |> Path.expand() + compose_file = Path.join(project_root, "docker/federation/compose.yml") + + unless File.exists?(compose_file) do + Mix.raise("fedbox compose file not found: #{compose_file}") + end + + Mix.shell().info("Starting fedbox containers...") + + status = + try do + case docker_compose(["-f", compose_file, "up", "-d", "--build"]) do + 0 -> + Mix.shell().info("Running fedbox tests...") + + docker_compose([ + "-f", + compose_file, + "--profile", + "fedtest", + "run", + "--rm", + "--build", + "fedtest" + ]) + + status -> + status + end + after + unless opts[:keep] do + Mix.shell().info("Cleaning up fedbox containers...") + _ = docker_compose(["-f", compose_file, "down", "-v"]) + end + end + + if status != 0 do + System.halt(status) + end + end + + defp docker_compose(args) when is_list(args) do + {_, status} = + System.cmd("docker", ["compose" | args], into: IO.stream(:stdio, :line)) + + status + end + + defp ensure_executable!(exe) when is_binary(exe) do + case System.find_executable(exe) do + nil -> Mix.raise("#{exe} not found in PATH") + _path -> :ok + end + end +end