Public deploy harness for ArcusForge/ArcScan (private).
GitHub Actions allots 2,000 minutes/month for private repos. Public repos get unlimited minutes. This repo runs the deploy pipeline for ArcScan on the free public-repo budget while keeping the source private.
- Operator pushes to
mainon the private ArcusForge/ArcScan. - A 10-second notify workflow on the private side fires a
repository_dispatchevent at this repo with the commit SHA. - This repo's
deploy.ymlworkflow:- Checks out ArcScan @ that SHA via a fine-grained PAT (read-only on the private repo).
- Packages a release zip via
git archive HEAD. - Assumes an AWS IAM role via OIDC (no static AWS keys stored anywhere).
- Uploads the zip to S3.
- Sends an SSM command to the prod EC2 instance to download, migrate, restart services.
- Polls SSM for completion and reports back.
- Smoke-tests
https://arcusautomate.com/.
There is also a workflow_dispatch trigger so the operator can deploy any SHA manually from the Actions tab — useful for rollbacks.
- No source code lives here. This repo is checked-out into by the workflow, but contains no ArcScan source itself.
- No
pull_requesttrigger. PR workflows on public repos run without secrets, but the existence of any PR-triggered workflow is a footgun. We deliberately omit it. - No static AWS keys. AWS access is via OIDC role assumption. The IAM role's trust policy is scoped to:
— meaning only this repo, only this branch, can assume it.
repo:ArcusForge/arcscan-deploy:ref:refs/heads/main - The AWS role's permissions are scoped to
s3:PutObjecton the deploy bucket'sreleases/prefix andssm:SendCommandon a single EC2 instance. - The PAT is fine-grained, scoped read-only to ArcusForge/ArcScan, with no other permissions.
| Name | Type | Purpose |
|---|---|---|
PRIVATE_REPO_PAT |
Fine-grained PAT | Read access to ArcusForge/ArcScan source. Rotate quarterly. |
gh workflow run deploy.yml \
--repo ArcusForge/arcscan-deploy \
--ref main \
-f sha=<full-or-short-git-sha-on-main>The private repo (ArcusForge/ArcScan) has a notify workflow (.github/workflows/notify-public-deploy.yml) that fires a repository_dispatch to this repo on every push to main.