layout | title |
---|---|
landing-page |
Haal Centraal GitHub Action workflows |
GitHub Actions is een feature van GitHub waarmee je workflows kan definieren voor een GitHub repository. Je kan met GitHub Actions bijvoorbeeld een complete Continuous Integration / Continuous Delivery workflow inrichten, maar je kan ook kleinere workflows definieren zoals het automatisch valideren van specifieke commits.
Een GitHub Actions workflow is een file met .yml extensie en moet worden aangemaakt in de .github/workflows
directory van een repository. Een minimale workflow file ziet er als volgt uit:
name: <workflow naam>
on:
<event naam>
jobs:
<job key>
runs-on: <type machine>
steps:
- uses: <action naam>
- runs: <script>
name
: de naam van de workflow. Deze naam wordt gebruikt voor het tonen van de logs van de workflow onder de Actions tabon
: één of meerdere events die de workflow moet triggerenjobs
: één of meerdere jobs. Elke job heeft een job key/identifierruns-on
: de type machine (runner) aangegeven waar de job moet worden uitgevoerdsteps
: één of meerdere stappen die horen bij een job. Er zijn twee type steps:uses
: voert een action uit. Een action is code die je in meerdere stappen en andere workflows kan hergebruiken. 3rd party actions zijn te vinden op de GitHub marketplace maar je kan ook je eigen action implementerenruns
: voert code uit. Dit is meestal bash code omdat die op de meeste runner types is voorgeïnstalleerd
Voor de Haal Centraal repositories zijn de volgende GitHub Action workflows gedefinieerd:
- lint-oas
- generate-sdks
- generate-postman-collection
- generate-user-stories-md
Deze workflows maken gebruik van node en JAVA packages. Om het beheren en het gebruiken van de packages te vergemakkelijken is voor elke repository een package.json bestand ingericht. Het inrichten en beheren van zo'n package.json is beschreven in Haal Centraal npm beheer
De lint-oas workflow valideert en resolve de openapi.yaml bestanden in de GitHub repository. De workflow maakt hiervoor gebruik van de npm scripts gedefinieerd in de package.json bestand. Hier is voor gekozen zodat lokaal en remote valideren en resolven op dezelfde manier en met dezelfde versie van de tools gebeurt, zodat het niet kan voorkomen dat je lokaal en remote verschillende resultaten krijgt.
De workflow wordt getriggered:
- wanneer er yaml bestanden in de specificatie map naar GitHub worden gepushed
- wanneer de lint-oas.yml bestand naar GitHub wordt gepushed
- wanneer de Run workflow button wordt geklikt
De workflow voert de volgende stappen uit:
actions/checkout@v2
. M.b.v. deze action wordtgit checkout
op de repo uitgevoerd zodat de andere workflow stappen de bestanden in de repo kan benaderenactions/setup-node@v1
. Hiermee wordt v12 vannode.js
van node.js geïnstalleerd. Dit is nodig om dependencies opgenomen in het package.json bestand te kunnen installerennpm install
. Script om de dependencies gedefinieerd het package.json bestand te installeren. Dit is nodig de npm scripts gedefinieerd in het package.json bestand uit te kunnen voerennpm run oas:lint
. Uitvoeren van de oas:lint script gedefinieerd in het package.json bestand. De script valideert de specificatie/openapi.yaml bestand m.b.v. Spectral. De gebruikte OAS rules staan gedefinieerd in het .spectral.yml bestand. Zie paragraaf 'Valideren van de openapi.yaml en de genereervariant van de openapi.yaml bestand' in Haal Centraal npm beheer voor meer informatie over het .spectral.yml bestand.npm run oas:resolve
. Uitvoeren van de oas:resolve script. De script resolve de specificatie/openapi.yaml bestand m.b.v. Swagger Codegen. De geresolve-de variant wordt weggeschreven in de specificatie/genereervariant mapnpm run oas:lint-genereervariant
. De oas:lint-genereervariant valideert de specificatie/genereervariant/openapi.yaml bestand m.b.v. Spectralpush resolved to remote
script. De script valideert of de specificatie/genereervariant/openapi.yaml is gewijzigd door de resolve stap. Is dat het geval, dan worden deze wijzigingen ge-commit & ge-push-t naar de GitHub repository.
Er is voor gekozen om deze script niet op te nemen als npm script omdat er GitHub specifieke variabele ($GITHUB_ACTOR) wordt gebruikt, waardoor het niet mogelijk is om deze script lokaal uit te voeren
De generate-sdks workflow genereert m.b.v. de OpenAPI Generator client code voor het aanroepen van een Web API voor de volgende programmeer talen:
- JAVA
- .NET Core
- .NET Full Framework
- Python
De workflow wordt getriggered:
- wanneer er yaml bestanden in de specificatie/genereervariant map naar GitHub worden gepushed
- wanneer de generate-sdks.yml bestand naar GitHub wordt gepushed
- wanneer de Run workflow button wordt geklikt
De workflow voert de volgende stappen uit:
actions/checkout@v2
. M.b.v. deze action wordtgit checkout
op de repo uitgevoerd zodat de andere workflow stappen de bestanden in de repo kan benaderenactions/setup-node@v1
. Hiermee wordt v12 vannode.js
van node.js geïnstalleerd. Dit is nodig om dependencies opgenomen in het package.json bestand te kunnen installerennpm install
. Script om de dependencies gedefinieerd het package.json bestand te installeren. Dit is nodig de npm scripts gedefinieerd in het package.json bestand uit te kunnen voerennpm run oas:generate-java-client
. Deze stap genereert client code voor JAVAnpm run oas:generate-netcore-client
. Deze stap genereert client code voor .NET Corenpm run oas:generate-net-client
. Deze stap genereert client code voor .NET Full Frameworknpm run oas:generate-python-client
. Deze stap genereert client code voor Pythonpush resolved to remote
script. De script valideert of er bestanden onder de code map zijn gewijzigd. Is dat het geval, dan worden deze wijzigingen ge-commit & ge-push-t naar de GitHub repository.
Er is voor gekozen om deze script niet op te nemen als npm script omdat er GitHub specifieke variabele ($GITHUB_ACTOR) wordt gebruikt, waardoor het niet mogelijk is om deze script lokaal uit te voeren
De generate-sdks workflow genereert m.b.v. de OpenAPI 3.0 to Postman Collection v2.1.0 Converter om op basis van een OpenAPI specificatie een Postman collection te genereren. Dit bestand kan dan worden gebruikt om met Postman de API aan te roepen.
De workflow wordt getriggered:
- wanneer er yaml bestanden in de specificatie/genereervariant map naar GitHub worden gepushed
- wanneer de generate-postman-collection.yml bestand naar GitHub wordt gepushed
- wanneer de Run workflow button wordt geklikt
De workflow voert de volgende stappen uit:
actions/checkout@v2
. M.b.v. deze action wordtgit checkout
op de repo uitgevoerd zodat de andere workflow stappen de bestanden in de repo kan benaderenactions/setup-node@v1
. Hiermee wordt v12 vannode.js
van node.js geïnstalleerd. Dit is nodig om dependencies opgenomen in het package.json bestand te kunnen installerennpm install
. Script om de dependencies gedefinieerd het package.json bestand te installeren. Dit is nodig de npm scripts gedefinieerd in het package.json bestand uit te kunnen voerennpm run oas:generate-postman-collection
. Deze stap genereert de postman collection bestandpush resolved to remote
script. De script valideert of het xxx-postman-collection bestand onder de test map is gewijzigd. Is dat het geval, dan worden deze wijzigingen ge-commit & ge-push-t naar de GitHub repository.
Er is voor gekozen om deze script niet op te nemen als npm script omdat er GitHub specifieke variabele ($GITHUB_ACTOR) wordt gebruikt, waardoor het niet mogelijk is om deze script lokaal uit te voeren
De generate-user-stories-md workflow selecteert m.b.v. de Select Matching Issues GitHub Action issues die de volgende labels hebben:
- "User Story"
- "v[major].[minor]"
Hiermee wordt vervolgens twee markdown bestanden: user-stories-prod.md en user-stories-dev.md gegenereerd. Deze bestanden respectievelijk de user stories die in de productie versie van de API zijn geïmplementeerd en de user stories die in de volgende versie van de API worden geïmplementeerd.
De workflow wordt getriggered:
- om 9, 11, 12, 14, 16, 17 uur. Let op: dit hoeft niet hetzelfde te zijn als de lokale tijd
- wanneer de Run workflow button wordt geklikt
De workflow voert de volgende stappen uit:
actions/checkout@v2
. M.b.v. deze action wordtgit checkout
op de repo uitgevoerd zodat de andere workflow stappen de bestanden in de repo kan benaderenCreate User Stories IO
script. Deze script maakt het user-stories-dev.md bestand aan. Met de eerste echo statement wordt YAML front matter (te gebruiken layout template en titel) en met de tweede echo statement wordt de tekst# User stories
naar het bestand geschrevenlee-dohm/select-matching-issues@v1.2.0
. Met deze action worden issues geselecteerd in de GitHub repository met labels "User Story" en "v[major].[minor]". De gevonden issues worden weggeschreven naar issues-tmp.md. Dit wordt gedaan omdat de action het opgegeven bestand (m.b.v. de path parameter) overschrijft indien deze al bestaatcat issues-tmp.md >> user-stories-dev.md
statement. Hiermee wordt de inhoud van issues-tmp.md toegevoegd aan het user-stories-dev.md bestandCreate User Stories Prod
script. Deze script maakt het user-stories-prod.md bestand aan. Met de eerste echo statement wordt YAML front matter (te gebruiken layout template en titel) en met de tweede echo statement wordt de tekst# User stories
naar het bestand geschrevenlee-dohm/select-matching-issues@v1.2.0
. Met deze action worden issues geselecteerd in de GitHub repository met labels "User Story" en "v[major].[minor]". De gevonden issues worden weggeschreven naar issues-tmp.md. Dit wordt gedaan omdat de action het opgegeven bestand (m.b.v. de path parameter) overschrijft indien deze al bestaatcat issues-tmp.md >> user-stories-prod.md
statement. Hiermee wordt de inhoud van issues-tmp.md toegevoegd aan het user-stories-prod.md bestand- Stap 6 en 7 worden herhaald voor elke major-minor versie combinatie van issues die al in de productie versie zijn geïmplementeerd
target=_blank toevoegen aan issue link
script. Met behulp van de sed command en de regular expression s/)$/){:target="_blank" rel="noopener"}/ wordt in user-stories-dev.md en user-stories-prod.md gezocht naar regels die eindigen met een ). De ) wordt vervolgens vervangen met de tekst ){:target="_blank" rel="noopener"}move user-stories markdown bestanden naar ./docs
script. Met behulp van deze script worden de user-stories-dev.md en user-stories-prod.md bestanden verplaatst naar de docs mapcommit & push user-stories markdown bestanden
script. Deze script controleert of de user-stories-dev.md en user-stories-prod.md bestanden zijn gewijzigd. Indien dit het geval is, dan worden deze bestanden ge-commit en ge-push-t naar de GitHub repository
Deze workflow maakt gebruik van de secret GITHUB_TOKEN, een ge-encrypte omgevingsvariabele waarin acces tokens zijn vastgelegd waarmee autorisatie verkregen kan worden voor het aanbrengen van wijzigingen op de repository. Een beschrijving van deze secret is te vinden in Haal Centraal NPM beheer.