Connecting Existing Repos, DNS, Auth & Other Common Configs
Setting Up a GitHub Repository & CI walks through creating a brand-new repository from scratch. Most teams adopting Infrastream aren't starting from zero — they already have a repo, a domain, and an auth story. This guide covers the five things that come up right after initial onboarding: connecting a repository you already have, wiring up its CI/CD, pointing a domain at it, adding authentication, and a few other configs teams commonly reach for next.
1. Connecting an Existing GitHub Repository
You don't need a separate "import" flow. Declaring a GithubRepository manifest whose name matches your existing repository causes the engine to adopt it instead of creating a new one — the executor looks the repository up before ever attempting to create it, and only creates when nothing is found.
apiVersion: lowops.manifests.v1
kind: GithubRepository
metadata:
name: legacy-billing-service # Must match the existing repo's name on GitHub
organization: fincorp
spec:
strategy: GITHUB_FLOW
codeOwners:
- path: "*"
owners:
- platform-team
permissions:
administrators:
groups:
- platform-admins
contributors:
groups:
- backend-team
Once merged, the platform applies your declared branch protection, CODEOWNERS, and permissions on top of the existing repository — it does not touch existing history, issues, or settings outside what the manifest declares.
Prerequisite: Grant the GitHub App Access
If your organization's GithubConnection has its GitHub App installation scoped to "Only select repositories" rather than "All repositories," adoption will fail to find a repo the app hasn't been granted access to. When that happens, the engine falls through to the create path and GitHub rejects it with a "name already exists" conflict — since the repository is real, just invisible to the app.
Before merging your GithubRepository manifest for an existing repo:
- Go to your GitHub organization's Settings → Applications → Installed GitHub Apps.
- Find the Infrastream GitHub App installation and select Configure.
- Under Repository access, add the existing repository to the selected list (or switch to "All repositories" if that fits your org's policy).
2. Wiring Up CI/CD for It
Once the repository is connected, adding CI/CD is identical to the new-repo flow — see Setting Up a GitHub Repository & CI for the full BuildDefinition walkthrough. One ordering detail that guide doesn't call out:
ArtifactRegistry must already exist before a BuildDefinition references it. The containerize.registries field (and each language block's registry field) is validated against already-declared ArtifactRegistry or ExternalRegistry manifests by name — referencing one that doesn't exist yet fails validation with an "unknown artifact/external registry" error. If you don't already have a registry for this service, declare it first:
apiVersion: lowops.manifests.v1
kind: ArtifactRegistry
metadata:
name: fincorp-docker-registry
organization: fincorp
spec:
type: DOCKER
region: us-central1
permissions:
writers:
groups:
- backend-team
Commit the ArtifactRegistry in the same PR as (or an earlier PR than) the BuildDefinition that references it.
3. DNS for a Custom Domain
If this service needs a custom domain rather than the platform's auto-generated FQDN, that's covered end-to-end in Setting Up Custom Domains. The short version: PublicIngress.spec.domain.name provisions a dedicated Cloud DNS zone for the domain, and the one manual step is delegating the domain to that zone via NS records at your registrar — not creating an A record. See that guide's Step 6 for the exact procedure.
4. Authentication
Infrastream has two independent auth mechanisms, and it's worth being clear about which one you need:
-
End-user login (GCIP) — for applications with their own sign-in page (customers, external users). Declare an
IdentityProvidermanifest and reference its name from anHttpRoute/GrpcRouterule'sauthenticationblock:apiVersion: lowops.manifests.v1
kind: IdentityProvider
metadata:
name: billing-portal-login
project: payment-gateway
environment: production
organizational-unit: retail-banking
organization: fincorp
spec:
displayName: "Fincorp Billing Portal"
logoUrl: "https://fincorp.com/logo.png"
iconUrl: "https://fincorp.com/icon.png"
providers:
google: true# In the HttpRoute rule for the protected path:
rules:
- matches:
- prefixMatch: /portal
action:
destinations:
- deploymentConfig: billing-portal
port: 8080
authentication:
- type: IDENTITY_PROVIDER
tenants:
- billing-portal-login -
Internal access (IAP) — for staff-only tooling behind a
PublicIngress, no per-user login page. Settype: INTERNALon the route rule instead, and grant access via the ingress'siapPermissions:rules:
- matches:
- prefixMatch: /admin
action:
destinations:
- deploymentConfig: billing-admin
port: 8080
authentication:
- type: INTERNALAccess is then controlled by the
iapPermissionsblock on the parentPublicIngressmanifest (see Setting Up Custom Domains for that field).
You may notice a WorkforceIdentityProvider manifest kind in the schema — don't reach for it. It's a declared no-op today: no defaulter, validator, or executor reads its spec. Workforce/staff SSO federation (e.g. Entra ID) is configured at the Organization level by the platform team, not per-application. If you need staff SSO for internal tooling, use IAP (type: INTERNAL) as shown above, or talk to your platform team about Organization-level workforce federation.
5. Other Common Configs
A few more manifest kinds teams typically set up shortly after initial onboarding:
-
GithubSecret— makes a credential available to your repository's GitHub Actions workflows (e.g. an npm token or a third-party API key needed at build time, as opposed to runtime app secrets). Either inline or backed by an existingSecret:apiVersion: lowops.manifests.v1
kind: GithubSecret
metadata:
name: npm-publish-token
organization: fincorp
spec:
valueRef: npm-publish-token-secret # Name of an existing Secret manifestReference it by name in your repository's
spec.secretslist (see Setting Up a GitHub Repository & CI). -
ExternalApplication+ExternalRegistry+TrustedRepository— for deploying an image that's already built somewhere else (Docker Hub, a legacy CI system) instead of going through Infrastream's ownBuildDefinitionpipeline. Declare anExternalRegistryfor the source, aTrustedRepositorymarking it as trusted, and anExternalApplicationreferencing both — it provisions the same identity, networking, and mesh structures as a nativeApplication, just sourced from outside the workspace.
Monitoring and Alerting manifests exist in the schema but are currently inert — no executor reads their spec, so applying them provisions nothing. Don't rely on them yet; they're intended future functionality, not a working feature.