Ditt team har börjat använda GitLab, oavsett om det är self-managed, dedicated eller på gitlab.com. Ni har börjat skriva CI/CD för alla era repositories och, som på många ställen rekommenderas, skapat ett dedikerat repository för detta som andra repositories refererar till som en mall. Men nu börjar ni stöta på vissa problem. Det är krångligt att dokumentera hela repositoryt, liksom att hitta rätt innehåll. Ni behöver underhålla ordentliga wikisidor, och någon måste ansvara för och uppdatera dem. Det är ett tidskrävande arbete som inte hanteras på bästa sätt.
Jae Lo Presti
Jae "J4" Lo Presti is a senior consultant working at Eficode in Helsinki, Finland, centred around Git forges such as GitLab and GitHub.
Vad är en komponent?
GitLab Components förenklar allt detta. Komponenter introducerades i GitLab 17.0 och ger dig en katalog med CI/CD-komponenter som enkelt finns tillgängliga för användning i valfritt repository i din organisation.
”Men vänta!” säger du, ”Vi har ju redan skrivit alla dessa CI/CD-pipelines. Varför skulle vi lägga tid på att skriva om allt i ett nytt system? Det kräver tid och arbete, och vi måste dokumentera allt igen.”
Det är här magin med GitLab Components kommer in: Du behöver bara göra minimala ändringar i dina befintliga CI/CD-pipelines.
Din första komponent
Låt oss titta på följande CI/CD-mall: Säg att du vill bygga en .NET 9-applikation och sedan publicera binärfilerna i det interna GitLab NuGET-repositoryt:
.nuget:publish:
stage: publish
image: mcr.microsoft.com/dotnet/sdk:9.0
only:
- tags
- $FORCE_PUBLISH == "true
script:
- dotnet pack -c release
- dotnet nuget add source
${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/nuget/index.json" --name gitlab --username gitlab-ci-token --password $CI_JOB_TOKEN --store-password-in-clear-text - dotnet nuget push "**/bin/Release/*.nupkg" --source gitlab
Kort sagt: om en tagg publiceras eller variabeln FORCE_PUBLISH sätts till ”true”, kommer pipelinen att paketera projektet, lägga till GitLab NuGET-repositoryt och skicka det paketerade innehållet dit.
Det är mycket enkelt att konvertera den här pipelinen till en komponent. En komponent behöver bara några få saker:
Ett repository där den ska finnas.
En CI/CD-konfigurationsfil som publicerar komponenten.
En README-fil med en grundläggande beskrivning av vad komponenten gör.
En grundläggande projektbeskrivning i repositoryt.
Till sist behöver du aktivera ”CI/CD Catalog project” i repositoryts inställningar.
Med detta på plats kan vi skapa vår första komponent! Vi börjar med det enklaste: CI/CD-skriptet som publicerar komponenten.
stages:
- release
release:
stage: release
rules:
- if: $CI_COMMIT_TAG
image: registry.gitlab.com/gitlab-org/release-cli:v0.18.0
script:
- echo "Creating release
release:
tag_name: $CI_COMMIT_TAG
description: './README.md
Den här pipelinekonfigurationen letar bara efter taggar. När en tagg publiceras skapar den en release med README-filen som beskrivning. Det är egentligen allt som behövs. GitLab hanterar sedan själv genereringen av ytterligare dokumentation och publiceringen.
I README.md-filen kan vi sedan lägga till en enkel beskrivning, till exempel:
”Komponent som publicerar ett .NET 9-projekt till NuGET-registret.”
Nu när vi har uppfyllt de flesta förutsättningarna kan vi konvertera själva pipelinen. Skapa en katalog med namnet ”templates” i repositoryt och lägg till en ny fil med namnet ”publish.yml”. Det är här den verkliga magin sker. Med komponenter kan du ange en specifikation före själva mallen, där du kan lägga till beskrivningar och definiera vilka indata mallen förväntar sig. GitLab använder sedan dessa indata och deras beskrivningar för att generera grundläggande dokumentation för mallen.
I vårt fall blir det till exempel ganska enkelt, med bara två indata: Vill vi tvinga fram publicering eller åsidosätta pipelinens stage? Det kan se ut ungefär så här:
spec:
inputs:
stage:
default: publish
description: 'Defines which build stage will be used.
force-publish:
default: false
description: 'Do you want to force the publishing of the NuGET package.
Det sista steget är att ändra vår mall så att den använder dessa indata i stället för miljövariabler. Det är också mycket enkelt och kan se ut ungefär så här:
publish-nuget-package": stage: $[[ inputs.stage ]] image: mcr.microsoft.com/dotnet/sdk:9.0 only: - tags - $[[ inputs.force-publish ]] == "true" script: - dotnet pack -c release - dotnet nuget add source
${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/nuget/index.json" --name gitlab --username gitlab-ci-token --password $CI_JOB_TOKEN --store-password-in-clear-text - dotnet nuget push "**/bin/Release/*.nupkg" --source gitlab
Observera att vi i stället för att använda $FORCE_PUBLISH använder $[[ input.force-publish ]].
Vi kan sedan kombinera de två för att få vår kompletta mall, som innehåller både spec:en och själva pipelinen:
spec:
inputs:
stage:
default: publish
description: 'Defines which build stage will be used.
force-publish:
default: false
description: 'Do you want to force the publishing of the NuGET package.
---
publish-nuget-package": stage: $[[ inputs.stage ]] image: mcr.microsoft.com/dotnet/sdk:9.0 only: - tags - $[[ inputs.force-publish ]] == "true" script: - dotnet pack -c release - dotnet nuget add source
${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/nuget/index.json" --name gitlab --username gitlab-ci-token --password $CI_JOB_TOKEN --store-password-in-clear-text - dotnet nuget push "**/bin/Release/*.nupkg" --source gitlab
Voilà! Du har nu en fungerande GitLab Component. Kom ihåg att tagga den minst en gång för att skapa en användbar version, till exempel 1.1.0.
När taggpipelineflödet är klart kan du klicka på den blå CI/CD Catalog-knappen högst upp i repositoryt för att se katalogsidan. Där hittar du ett sätt att inkludera arbetsflödet för den specifika versionen samt automatiskt genererad dokumentation för dess alternativ.
För att använda den här komponenten behöver du bara inkludera den i din CI-fil:
include:
- component: $CI_SERVER_FQDN/components/example-comp/publish@1.0.0
inputs:
stage: deploy
force-publish: false
Obs: Lägg märke till hur variablerna skickas via egenskapen ”input”.
Avslutande tankar
I slutändan är GitLab Components ett enkelt sätt att ha CI/CD-mallar som är lätta att hitta och väldokumenterade i din GitLab-instans. De är inte bara enkla att skapa från grunden, utan kan också baseras på befintliga pipelines.
Du hittar alla publicerade komponenter i din GitLab-instans under ”Explore” och sedan ”CI/CD Catalog”.
- Software development
- DevOps
- GitLab
Subscribe to our newsletter
Related blogs