From 32f3fda5fe81d08e85f62f91e85d9219c7d9d04a Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 5 Feb 2026 10:33:17 +0000
Subject: [PATCH 1/2] Initial plan
From 46fd3b6a951699ba198fa5630f54809e00e2c27d Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 5 Feb 2026 10:35:22 +0000
Subject: [PATCH 2/2] docs: Document staging deployment approach in README
Co-authored-by: LukasWallrich <60155545+LukasWallrich@users.noreply.github.com>
---
README.md | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 62 insertions(+)
diff --git a/README.md b/README.md
index d5137e66357..22e64129e86 100644
--- a/README.md
+++ b/README.md
@@ -54,6 +54,68 @@ Please note that it's very important to us that we maintain a positive and suppo
This is the website for the **Framework for Open and Reproducible Research Training (FORRT)**, built with [hugo](https://gohugo.io/), and deployed with [Github Actions](https://docs.github.com/en/actions). You can find the website at [forrt.org](https://forrt.org/). See CONTRIBUTING.md for more information on how to contribute.
+## Deployment & Staging
+
+The FORRT website uses a dual deployment strategy to ensure quality and enable collaborative testing:
+
+### Production Deployment
+
+- **URL**: [https://forrt.org](https://forrt.org)
+- **Workflow**: `.github/workflows/deploy.yaml`
+- **Trigger**: Pushes to `master` branch
+- **Target**: GitHub Pages (`gh-pages` branch)
+- **Purpose**: Serves the live, production website
+
+### Staging Deployment
+
+- **URL**: [https://staging.forrt.org](https://staging.forrt.org)
+- **Workflow**: `.github/workflows/staging-aggregate.yaml`
+- **Trigger**: Pull requests to `master`, monthly schedule (1st of each month), or manual dispatch
+- **Target**: External repository (`forrtproject/webpage-staging`)
+- **Purpose**: Preview combined changes from all open PRs
+
+#### How Staging Works
+
+The staging deployment uses an **aggregation strategy** to provide a unified preview environment:
+
+1. **Automatic Aggregation**: When any PR is opened, synchronized, or reopened, the workflow:
+ - Collects all open, non-draft PRs targeting `master`
+ - Creates a temporary aggregation branch from `master`
+ - Attempts to merge each PR in sequence
+
+2. **Conflict Handling**:
+ - PRs that merge cleanly are included in the staging build
+ - PRs with merge conflicts are skipped but logged
+ - The deployment continues with all compatible PRs
+
+3. **Deployment Comments**: Each PR receives an automated comment indicating:
+ - ✅ Successfully deployed (for PRs without conflicts)
+ - ⚠️ Skipped due to conflicts (for conflicting PRs)
+ - Deployment timestamp and staging URL
+
+4. **Queuing & Timeouts**:
+ - Workflow uses concurrency control to queue builds (not cancel)
+ - Job timeouts (10-20 minutes) prevent indefinite blocking
+ - Draft PRs are filtered out to avoid unnecessary builds
+
+5. **Branch Cleanup**:
+ - Keeps only the 5 most recent staging branches
+ - Automatically cleans up older staging-aggregate branches
+
+#### Viewing Staging Changes
+
+- Visit [https://staging.forrt.org](https://staging.forrt.org) to see the combined state of all open, compatible PRs
+- Note: Staging shows aggregated changes from **all** open PRs, not individual PR changes
+- PRs with merge conflicts won't appear in staging until conflicts are resolved
+
+#### Monthly Reports
+
+On the 1st of each month, an automated deployment report is created as a GitHub issue with:
+- Total PRs processed
+- Successfully merged PRs
+- Skipped PRs (with conflict information)
+- Deployment statistics
+
## License

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.