GitHub vorbereiten (GitHub-Variante)¶
Verwende diese Seite, wenn die Repositories und pipelines des Kunden auf GitHub liegen. Die Phasen sind dieselben wie bei Azure DevOps. Nur die Vorbereitung unterscheidet sich: eine GitHub App statt Tokens, federated credentials statt service connections mit Secrets, environments statt Azure-DevOps-environments und ein anderer Weg zu selbst gehosteten runners.
| Thema | Azure DevOps | GitHub |
|---|---|---|
| Anmeldung bei Azure | Service connection (Identität vorbereiten) | Service Principal mit federated credentials (OIDC), unten beschrieben |
| Das Code-Repository auschecken | Service connection zum Host (mcp-code) |
GitHub App mit einem kurzlebigen Installation-Token |
| Produktionsfreigabe | Environment mit Genehmigern | Environment mit Required Reviewers |
| Runners | Managed DevOps Pool (Agents vorbereiten) | Siehe Runners |
| Repository-Setup | Repositories vorbereiten | Dieselbe Seite, GitHub-Abschnitte |
Voraussetzungen in der Organisation¶
Das Plattform-Team braucht die Organisationsrollen CI/CD admin und App Manager und muss Repositories erstellen können. Siehe Voraussetzungen und die GitHub-Prüfungen dort.
GitHub App für die Workflows¶
Die Workflows verwenden keine Personal Access Tokens. Sie erstellen ein kurzlebiges Installation-Token für eine GitHub App
(actions/create-github-app-token) und übergeben es an Terraform (TF_VAR_github_token).
- Erstelle eine GitHub App in der Organisation oder verwende eine bestehende weiter. Gib ihr einen Namen und eine Beschreibung, die zeigen, dass sie von den Plattform-Workflows verwendet wird.
- Repository-Berechtigungen: Lesezugriff auf Code und Metadaten, Lese- und Schreibzugriff auf Workflows.
- Speichere die App ID als Organisationsvariable
cloud_platform_gh_app_idund den Private Key als Organisations-Secretcloud_platform_gh_app_private_key(Pipelines). - Installiere die App in der Organisation mit Only select repositories und wähle nur die Code-Repositories aus.
- Speichere eine Kopie des Private Key im Secret Store des Plattform-Teams, zusammen mit Namen und ID der App.
Wenn spokes die GitHub-Extension verwenden, braucht die App mehr Berechtigungen (Spoke-Integrationen vorbereiten). Wenn Terraform-Module von einem GitHub-Enterprise-Host heruntergeladen werden, siehe Zugriff auf Modulquellen.
Das ist eine andere App als die, die das Code-Repository synchronisiert (Repositories vorbereiten). Du kannst sie zusammenlegen, wenn deine Security-Regeln es erlauben, aber getrennte Apps halten die Berechtigungen klein.
Wenn mcp.json einen GitHub-Abschnitt hat (AppId, AppInstallationId, AppPrivateKeySecretName), verweist er auf die GitHub
App, die die selbst gehosteten runners registriert (Config).
Federated credentials¶
Mit federated credentials meldet sich der Workflow ohne gespeichertes Secret bei Azure an. Füge dem Deployment-Service-Principal für jedes Konfigurations-Repository drei credentials hinzu (Microsoft Entra ID, App registrations, die App, Certificates & secrets, Federated credentials, Add credential, Szenario GitHub Actions deploying Azure resources):
| Credential | Entity type | Subject identifier |
|---|---|---|
| Branch | Branch | repo:<organization>/<repository>:ref:refs/heads/main |
| Production | Environment, prod |
repo:<organization>/<repository>:environment:prod |
| Canary | Environment, canary |
repo:<organization>/<repository>:environment:canary |
- Issuer. Für GitHub.com ist es
https://token.actions.githubusercontent.com. Für GitHub Enterprise auf einer eigenen Domain (<domain>.ghe.com) ist eshttps://token.actions.<domain>.ghe.com. Die Namen von Organisation und Repository sind die aus der Repository-URL. - Während der Implementierung, wenn der Default-branch
initialist, erstelle das Branch-credential fürinitial. Ändere es aufmain, wenn die Implementierung abgeschlossen ist (Repositories vorbereiten). - Trage die Client-ID des Service Principals in
Azure.TerraformState.Hub.ServicePrincipalId(und.Spoke.) inmcp.jsonein.
Secrets in älteren Workflows¶
Ältere Entry-Workflows (main.yaml) lesen statt mcp.json diese Repository-Secrets:
| Secret | Wert |
|---|---|
AZURE_CLIENT_ID |
Client-ID des Service Principals |
AZURE_TENANT_ID |
Tenant-ID |
AZURE_SUBSCRIPTION_ID |
Management-subscription der Plattform-Umgebung |
AZURE_RG_NAME, AZURE_SA_NAME |
Resource group und Storage-Account des Terraform-state |
AZURE_SA_CONTAINER_NAME |
State-Container (für spokes wird ein anderer Container verwendet) |
AZURE_SA_LOG_CONTAINER_NAME |
Container für Deployment-Logs |
Environments¶
Erstelle die environments canary und prod in jedem Konfigurations-Repository, dazu approval-required, wenn du die
Approve*-Modi verwendest (Pipelines). Für prod und approval-required:
- Required Reviewers: die Genehmigergruppe, die Lesezugriff auf die Repositories haben muss,
- Prevent self-review an,
- Allow administrators to bypass configured protection rules aus.
Ohne Reviewers auf approval-required läuft der Genehmigungsschritt weiter, ohne zu warten.
Runners¶
Aktueller Ansatz¶
Die Workflows infrastructure und container der Plattform deployen die Job runners, wie bei Azure DevOps
(Agents vorbereiten). Die Registrierung der runners verwendet die GitHub App in mcp.json. Das Deployment des
hub läuft auf diesen runners.
Älterer Ansatz: GitHub-hosted runners mit Virtual-Network-Integration¶
Frühere Versionen deployten den hub in zwei Phasen mit einem ghrunners-layer. Der layer ist nicht Teil der aktuellen hub-pipeline;
dieser Abschnitt ist für Tenants, die noch die älteren Workflows verwenden.
- Phase 1, Standard-runners. Die ersten layers (foundation, connectivity, ghrunners) laufen auf einer standardmäßigen GitHub-hosted
runner group (ein runner mit dem aktuellen Ubuntu-Image, zum Beispiel 2 Kerne, 8 GB, 75 GB Disk), weil noch kein Netzwerk
existiert. Richte
defaultRunnerGroupin.github/workflows/main.yamlauf diese Gruppe aus. - Phase 2, runners mit Virtual-Network-Integration. Sobald das Netzwerk existiert, erstelle runners, die darin leben:
-
Ermittle die Database-ID der Organisation oder des Enterprise:
gh auth login -s 'read:enterprise' gh api graphql -f query='query($login: String!) { organization(login: $login) { login databaseId } }' -f login='<organization>'Für ein Enterprise frage stattdessen
enterprise (slug: $slug)ab. Für einenghe.com-Host füge--hostname <subdomain>.ghe.comhinzu. 2. Registriere in der connectivity-subscription den Resource ProviderGitHub.Network, delegiere das runner-Subnetz anGitHub.Network/networkSettingsund erstelle die Network-Settings-Ressource (TypGitHub.Network/networkSettings, mit der Subnetz-ID und der Database-ID alsbusinessId). Mach das für canary und für prod. Verwende eine Region, die das Networking der GitHub-hosted runners unterstützt (das Runbook verwendete North Europe, weil West Europe damals nicht unterstützt wurde; prüfe die aktuelle Liste). 3. Erstelle in den Organisationseinstellungen unter Hosted compute networking für jede Plattform-Umgebung eine network configuration mit der Ressourcen-ID der Network-Settings. Wenn die Option deaktiviert ist, muss der Enterprise-Owner sie aktivieren. Wenn das Formular einen JSON-Fehler zurückgibt, warte ein paar Minuten und versuche es erneut. 4. Erstelle pro Umgebung eine runner group (zum Beispiellz-canaryundlz-prod) mit dieser network configuration und Zugriff für die vier Repositories, und in jeder Gruppe einen GitHub-hosted runner. Warte, bis der runner-Status Ready ist. 3. StelledefaultRunnerGroupinmain.yamlauf die neue Gruppe um und führe dann die übrigen layers der Reihe nach aus: firewall, identity, management, postdeployment. 4. Füge Firewallregeln hinzu, damit die runners erreichen, was sie brauchen, wie unter Netzwerkzugriff der Agents.
-
Siehe auch Die Plattform deployen.