Connecting a repository makes it the source of truth for plans, scripts and config templates. Synced plans become read-only in the builder, so changes go through a pull request instead of an edit box.
Before you begin#
You need the Operator role or above, and a repository containing at least one plan file. Sync is one-way: Opafra reads and never writes back, so nothing you do here can modify the repository.
1. Lay the repository out#
Opafra reads three directories. Create the ones you need:
plans/ plans
scripts/ shell scripts a plan can upload and run
templates/ config templatesThese are the defaults and each can be changed. Blanking one stops that kind syncing at all.
2. Add the source#
Open Git sources, then add a source. Give it the repository URL, the branch, and how Opafra authenticates:
Repository [email protected]:acme/infra-plans.git
Branch main
Auth GitHub AppChoose GitHub App where it is available. Clone credentials are then minted fresh for each clone and expire on their own, so no long-lived token sits at rest. A personal access token is stored encrypted and works everywhere.
3. Choose a sync mode#
Manual syncs when you ask
Webhook the repository notifies Opafra on push
Poll Opafra checks periodicallyWebhook is the right default for an active repository. It is authenticated with a shared secret, so an unsigned request cannot trigger a sync.
4. Run the first sync#
Trigger a sync from the source. Opafra clones the branch, hashes each file, and creates what it finds.
Verify it worked#
The source shows the commit it synced and a summary of what changed:
infra-plans (main) synced a1b2c3d created 4, updated 0, removed 0Open Plans. The synced plans are listed and marked as managed, and the builder shows them as read-only. Editing is only possible through the repository.
Then confirm a re-sync is a no-op. Sync again without changing anything:
infra-plans (main) synced a1b2c3d created 0, updated 0, removed 0Zeros are the proof that hashing works and that a sync will not churn your plans. A file that failed to parse is reported by name rather than as a count, and does not stop the rest of the sync.
Next steps#
- Git sync for orphaned files, grouping and what is recorded
- Plan structure for what a plan file contains