An interactive CLI tool that generates Crossplane-compatible YAML manifests for onboarding users to a GitHub organization via GitOps.
Given one or more users (GitHub username + Okta ID) and a target GitHub org, it creates a directory named after the org and writes one YAML file per user containing:
- A
Membershipresource (user.github.upbound.io/v1alpha1) - One
TeamMembershipresource (team.github.upbound.io/v1alpha1) per team (optional)
go run main.goOr build first:
go build -o octocrew .
./octocrewThe tool walks you through a short interactive form:
- Target Organization — the GitHub org slug (e.g.
sinister-six) - Users — GitHub username and Okta ID for each person; repeat as many times as needed
- Teams (optional) — comma-separated team slugs to add all users to
Files are written to ./<org>/<username>.yaml.
For user Doctor Octopus (doc-ock) onboarded to org sinister-six with team villains:
sinister-six/
└── doc-ock.yaml
sinister-six/doc-ock.yaml:
apiVersion: user.github.upbound.io/v1alpha1
kind: Membership
metadata:
labels:
suse.okta.com/user-id: '<okta-id>'
name: sinister-six--doc-ock
spec:
deletionPolicy: Delete
forProvider:
downgradeOnDestroy: false
role: member
username: doc-ock
providerConfigRef:
name: sinister-six
---
apiVersion: team.github.upbound.io/v1alpha1
kind: TeamMembership
metadata:
name: sinister-six--doc-ock--villains
spec:
forProvider:
org: sinister-six
teamSlug: villains
username: doc-ock
role: member
providerConfigRef:
name: sinister-sixMembership metadata.name always follows the pattern <org>--<username>.
Team membership names follow the pattern <org>--<username>--<team-slug>.
- Go 1.21+
go mod download