Langsam tauche ich in das Thema 'Konfiguration als Code' für die GitHub-Plattform ein: all die Dinge, die Sie mit möglichst wenigen Schritten automatisieren möchten und die große Auswirkungen haben. Einige dieser Dinge fallen meiner Meinung nach auch unter 'GitOps': wenn Sie sie in einem Repo speichern und bei Änderungen, die Sie vornehmen, wird die Automatisierung dafür sorgen, dass dies geschieht.
Der Plan ist, diesen Beitrag als zentralen Ausgangspunkt für Menschen zu nutzen, die nach einer ähnlichen Einrichtung suchen. Es gibt eine Menge Leute, die darüber bloggen, wie man so etwas macht und was bei ihnen funktioniert, aber oft gibt es keine tatsächliche Implementierung, die sie teilen können. Ich möchte Ihnen die Beispiele zeigen und Ihnen auch den verwendeten Code (in Kopie) zur Verfügung stellen.
Hinweis: Da die meisten dieser Elemente in einer separaten Org ausgeführt werden müssen, habe ich sie in meiner robs-tests org erstellt.
Szenario:1 Automatisieren Sie das Onboarding von Benutzern und die Erstellung von Repositories
Für eine unserer Schulungen laden wir alle Teilnehmer in unsere Organisation ein und erstellen Teams und Repositories für sie. Dies mit der Benutzeroberfläche zu tun, ist umständlich und fehleranfällig. Wir möchten diesen Prozess automatisieren, indem jemand eine Yaml-Datei bearbeitet, sie lintet und durch eine Pull-Anfrage genehmigt, so dass Sie immer eine weitere Person benötigen, um die eingehenden Änderungen zu überprüfen. Nach der Zusammenführung startet ein Workflow, der die neue Situation herbeiführt.
Die Schritte, die ich haben möchte, sind wie folgt:
- Fügen Sie der Datei users.yml neue Benutzer und Teams hinzu
- Eine PR erstellen
- Der Workflow pull_request.yml prüft, ob:
- Die Benutzerdatei ist gültig yaml
- Der Benutzer ist ein gültiges GitHub-Handle
- Der Benutzer ist bereits ein Mitglied der Organisation
- Nach der Zusammenführung wird der Arbeitsablauf user-management.yml ausgeführt und:
- Erstellen Sie das Team, falls erforderlich
- Den Benutzer zur Organisation hinzufügen
- Repository erstellen Teilnehmer-
- Fügen Sie den Benutzer zum Projektarchiv hinzu
- Fügen Sie den Benutzer zum Team hinzu
- Fügen Sie das Team zum Repo hinzu
Link zum Repo: robs-tests/user-test-repo
Schritt 1: Definieren Sie eine yaml-Struktur und parsen Sie sie
In diesem Beispiel möchte ich eine einfache Struktur starten, sie parsen und dann eine Schleife durch die Ergebnisse ziehen. Sie können dies in jedem beliebigen Format tun. Ich habe mir überlegt, dies zum Beispiel in json zu tun, aber das bedeutet eine Menge Overhead mit all den zusätzlichen doppelten Anführungszeichen und es ist etwas schwieriger zu lesen. Es wäre zum Beispiel einfach, einen Benutzer mit dem falschen Team zu verknüpfen. Ich wusste, dass ich yaml mit einer Bibliothek parsen kann und habe mich für diese Lösung entschieden: Sie ist kompakt und enthält keine zusätzlichen Zeichen. Da wir bei unseren Schulungen in der Regel maximal 20 Personen in der Gruppe haben, passen das gesamte Team und seine Benutzer ohne Scrollen auf den Bildschirm.
yaml-Format:
Ich habe mich für folgendes Format entschieden: Es gibt eine Liste von Teams und in jedem Team gibt es eine Liste von Benutzern.
teams:
- name: team01
users:
- rajbos
- Maxine-Chambers
Wenn ich das aus dem Parsen der yaml herauslese, muss ich zwei Schleifen erstellen: für jedes Team und dann für jeden Benutzer 'x' tun.
Schritt 2: Definieren Sie die Art und Weise, wie Sie Ihren Arbeitsablauf aufbauen möchten
Für die meisten Sprachen gibt es eine Bibliothek zum Parsen von yaml, so dass Sie selbst entscheiden können, was Sie für die Automatisierung verwenden möchten. Es hängt davon ab, was Ihr Team bereits weiß und wie einfach Sie dies testen können möchten. Heutzutage verzichte ich auf eine schwer zu verwaltende Einrichtung und verwende etwas wirklich Einfaches: github-script. Dabei handelt es sich um eine JavaScript-Aktion, der Sie Ihre eigene Skriptdatei übergeben können und die diese für Sie ausführt. Innerhalb Ihres Skripts erhalten Sie dann Zugriff auf die GitHub-Kontexte mit authentifizierten Clients und Aufrufen für alle APIs, die Sie benötigen. Sie können es sogar mit einer Zugangstoken von einer GitHub App aus (da wir hier nur die APIs auf Organisationsebene verwenden, funktioniert dies).
github-script hilft auch, wenn Sie Ihren Code bereits in JavaScript haben: Wenn Sie ihn später zu einem Baustein machen und eine Aktion daraus machen wollen, sind Sie bereit!
Schritt 3: der PR-Arbeitsablauf
In dem PR-Workflow möchte ich das überprüfen:
- die yaml-Datei ist gültig yaml
- die Handles in der Datei sind gültige GitHub-Handles (wir bekommen manchmal E-Mail-Adressen oder Tippfehler in den Handles)
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: 14
- run: npm install yaml
- uses: actions/github-script@v5
name: Run scripts
with:
github-token: ${{ secrets.GH_PAT }}
script: |
const yaml = require('yaml')
const repo = "${{ github.repository }}".split('/')[1]
const owner = "${{ github.repository_owner }}"
const userFile = "users.yml"
const script = require('${{ github.workspace }}/src/check-pr.js')
const result = await script({github, context, owner, repo, userFile, yaml})
console.log(``)
console.log(End of workflow step)
In diesem Beispiel sehen Sie, dass wir es sind:
- Überprüfen des Repositorys
- Setup-Knoten
- damit wir ein Node-Paket installieren können, das das yaml parsen kann
- dann verwenden wir die Aktion
github-script, um das Skript auszuführen - Laden Sie die Datei
check-pr.js, die die Arbeit erledigen wird. - wir geben die Informationen ein, die das Skript benötigt, um den nötigen Kontext zu erhalten
In der Datei check-pr.js können Sie sehen, dass wir es sind:
- Laden des Inhalts der yaml-Datei im aktuellen Zweig:
github.rest.repos.getContents({owner, repo, path, ref}) - erhalten Sie die Liste der aktuellen Teams:
let existingTeams = await getExistingTeams(owner) - den Inhalt der yaml-Datei parsen:
const parsed = yaml.parse(content)
Und dann können wir eine Schleife durch jedes Element in den Arrays ziehen:
for each team:
for each user in team:
check if user exists
Die Überprüfung, ob ein Benutzer existiert, kann mit einem Aufruf dieser API erfolgen: https://api.github.com/users/${userHandle } Mit einem Aufruf dieser API können Sie prüfen, ob dieser Benutzer bereits Mitglied der Organisation ist: https://api.github.com/orgs/${orgName}/members/${userHandle.login }
Schritt 4: Der Arbeitsablauf der Benutzerverwaltung
Wenn der PR in den Hauptprozess überführt wird, wird ein weiterer Arbeitsablauf ausgeführt: user-management.yml. Dies hat den gleichen Aufbau: Installieren Sie die npm-Pakete, laden Sie das Skript und führen Sie es aus.
Von load-users.js :
// send an invite to the user on the org level:
await addUserToOrganization(user, organization)
// create a new repository for this user:
const repoName = attendee-</span><span class="p">${</span><span class="nx">user</span><span class="p">.</span><span class="nx">login</span><span class="p">}</span><span class="s2">
await createUserRepo(organization, repoName)
// give the user admin acccess to the repo:
await addUserToRepo(user, organization, repoName)
// add the user to the team for the day of the training:
await addUserToTeam(user, organization, team)
// add the team to the repo (so that the rest of the team can help with PR's):
await addTeamToRepo( organization, repoName, team)
Abschließende Gedanken
Mit dieser Einrichtung haben Sie nun ein vollständiges Beispiel dafür, wie Sie mit GitHub Actions den Prozess des Hinzufügens von Benutzern zu einer Organisation und die Vorbereitung von Dingen wie Teams und Repositories für sie automatisieren können. Sie können darauf aufbauen, zum Beispiel mit:
- eine Einrichtung mit einer Ordnerstruktur, die die Hierarchie der Teams und Benutzer definiert
- jeder Ordner könnte dann verschiedene Code-Eigentümer haben, die festlegen, wer den PR genehmigen muss (so dass das Team selbst entscheiden kann, wer hinzugefügt werden soll)
- fügen Sie weitere Eigenschaften zur
users.ymlhinzu, falls Sie sie benötigen.
Verfasst von
Rob Bos
Rob has a strong focus on ALM and DevOps, automating manual tasks and helping teams deliver value to the end-user faster, using DevOps techniques. This is applied on anything Rob comes across, whether it’s an application, infrastructure, serverless or training environments. Additionally, Rob focuses on the management of production environments, including dashboarding, usage statistics for product owners and stakeholders, but also as part of the feedback loop to the developers. A lot of focus goes to GitHub and GitHub Actions, improving the security of applications and DevOps pipelines. Rob is a Trainer (Azure + GitHub), a Microsoft MVP and a LinkedIn Learning Instructor.
Unsere Ideen
Weitere Blogs
Contact



