← Back to Org Admin Playbook · Home
The automated repo creation workflow is powered by a GitHub App called "IHE Devices Automation". This page documents how it was set up and how to maintain it.
- Someone opens a "New Repository Request" issue on DEV.tooling
- The issue has a
repo-requestlabel applied automatically by the form template - A GitHub Actions workflow detects the new issue
- The workflow generates a short-lived token from the GitHub App (no personal access tokens)
- It checks that the issue author is an active member of
dev-co-chairs. If not, it comments, closes the issue, and stops — no repo is created. - Using that token, it creates the repo, assigns teams, fills in template placeholders, seeds team membership, comments on the issue, and closes it
Teams assigned to each new repo:
| Team | Repo role | How |
|---|---|---|
dev-co-chairs |
Admin | Existing team, granted Admin |
{name} maintainer |
Maintain | Created as a child of devices-domain |
{name} writer |
Write | Created as a child of devices-domain |
{name} is the repo name without the DEV. prefix (e.g. DEV.WIA → team names WIA writer, WIA maintainer; GitHub slugs wia-writer, wia-maintainer). Creating teams and managing their repo access requires the app's Organization → Members: Read and write permission (already granted). If the devices-domain parent team doesn't exist, the per-repo teams are still created but without a parent, and the run logs a warning. See the Teams reference for the model.
Also at creation time, the workflow:
- Fills in template placeholders.
{{double-brace}}tokens inREADME.mdandAsciiDoc_Source/metadata.adocare replaced — the title and description from what we know, and anything unknown (status, revision, date, editor) with aTODO:marker so authors can spot them. - Seeds team membership. The requester is added as a maintainer of both new teams (maintainer status doesn't inherit from the parent, so they're added to each directly). Optional Writers and Maintainers lists from the form are added too — usernames via team membership, emails via org invitation. Each person's result (added / invited / failed) is reported in the issue comment, so a mistyped username is visible and can be retried with Add People to a Team.
The key files are in the DEV.tooling repo:
.github/ISSUE_TEMPLATE/new-repo-request.yml— the issue form.github/workflows/create-repo.yml— the automation workflow
- App settings: Organization Settings → Developer settings → GitHub Apps → IHE Devices Automation
- Installation: Organization Settings → Integrations → Installed GitHub Apps → IHE Devices Automation → Configure
- Go to the Actions tab on DEV.tooling
- Click the failed run to see logs
- Common issues:
- "Resource not accessible by integration" — the app is missing a permission. See "Updating Permissions" below.
- "Bad credentials" — the app's private key may have been rotated or the secret is wrong. See "Rotating the Private Key" below.
- "Not Found" on template repo — the template repo may have been renamed or deleted.
If the app needs new permissions:
- Go to Organization Settings → Developer settings → GitHub Apps → Edit
- Go to Permissions & events
- Change the needed permissions
- Click "Save changes"
- Go to Organization Settings → Integrations → Installed GitHub Apps → Configure
- A banner will appear asking to review and accept the new permissions — approve it
Current required permissions:
Repository permissions:
- Administration: Read and write
- Contents: Read and write
- Issues: Read and write
- Metadata: Read-only
Organization permissions:
- Members: Read and write
If the private key needs to be replaced:
- Go to Organization Settings → Developer settings → GitHub Apps → Edit
- Under Private keys, click "Generate a private key"
- A new
.pemfile downloads - Go to Organization Settings → Secrets and variables → Actions
- Update the
DEVICES_APP_PRIVATE_KEYsecret with the new.pemfile contents - Optionally revoke the old key on the app settings page
- Delete the
.pemfile from your computer
The workflow uses two organization secrets:
| Secret | What it is |
|---|---|
DEVICES_APP_ID |
The App ID (a number, found on the app settings page) |
DEVICES_APP_PRIVATE_KEY |
The app's private key (contents of the .pem file) |
These are stored at: Organization Settings → Secrets and variables → Actions
To replicate this automation for another IHE domain:
- Either reuse the existing app (if org-wide) or create a new one
- In the new domain's tooling repo:
- Add an issue template with the domain's templates in the dropdown
- Add a workflow like
create-repo.yml, changing the team name and repo prefix
- Create a
repo-requestlabel in that repo - Ensure the org secrets are accessible to the new repo
For full setup-from-scratch instructions, see docs/github-app-setup.md in DEV.tooling.