From f23fff9e82a5b8d5d4a2f95572dbe4d736c2d24e Mon Sep 17 00:00:00 2001 From: cinereal Date: Sat, 25 Oct 2025 14:49:04 +0200 Subject: [PATCH] add test set-up figure from main repo's deployment readme Signed-off-by: cinereal --- architecture-docs/architecture.md | 4 ++++ architecture-docs/test-setup.mmd | 38 ++++++++++++++++++++++++++++++ architecture-docs/test-setup.png | Bin 0 -> 27471 bytes 3 files changed, 42 insertions(+) create mode 100644 architecture-docs/test-setup.mmd create mode 100644 architecture-docs/test-setup.png diff --git a/architecture-docs/architecture.md b/architecture-docs/architecture.md index 2873fbe..5c75d1a 100644 --- a/architecture-docs/architecture.md +++ b/architecture-docs/architecture.md @@ -202,6 +202,10 @@ Tests created so far cover: - builds for the (virtual) machines making up our internal infrastructure - ensuring any checks exposed by our Nix flake have been exposed in CI +An illustration demonstrating the set-up of our deployment tests covering our applications is shown below: + +![](./test-setup.png){ width=100% } + The latest info on these may be found at: - CI/CD runner set-up: diff --git a/architecture-docs/test-setup.mmd b/architecture-docs/test-setup.mmd new file mode 100644 index 0000000..64373b6 --- /dev/null +++ b/architecture-docs/test-setup.mmd @@ -0,0 +1,38 @@ +flowchart LR + + classDef invisible fill:none,stroke:none + + subgraph left [" "] + direction TB + + deployer["deployer
has store paths
runs nixops4
"] + client["client
Selenium scripts"] + end + + subgraph middle [" "] + subgraph target_machines["target machines"] + direction TB + + garage + mastodon + peertube + pixelfed + end + end + + subgraph right [" "] + direction TB + + acme["acme
runs Pebble"] + end + + left ~~~ middle ~~~ right + class left,middle,right invisible + + deployer -->|deploys| target_machines + + client -->|tests| mastodon + client -->|tests| peertube + client -->|tests| pixelfed + + target_machines -->|get certs| acme diff --git a/architecture-docs/test-setup.png b/architecture-docs/test-setup.png new file mode 100644 index 0000000000000000000000000000000000000000..a59e6c7588de8047a64e3beb85462fbc90202826 GIT binary patch literal 27471 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