Hur man arbetar med DevOps och .NET

Här skall jag försöka förklara hur man enkelt kan skapa ett .NET projekt med ett test projekt samt implementera CI/CD med hjälp av Azure DevOps. Idén här är att när man "pushar" sin kod till DevOps så skall en bygg process påbörjas. Där det ingår att köra igenom tester som är skapade, bygga .net applikationen. Skapa en publicerings fil och sedan distribuera applikationen till en Azure Web App.

Jag kommer att använda mig av .NET CLI för att skapa projekten som skall användas. Varför då, kanske någon undrar? Anledningen är enkel, om man kan .NET CLI så kan man skapa applikationen på vilken plattform som helst och för vilken editor som helst.

Steg 1.

Starta upp ett terminal fönster eller ett konsol fönster. Gå till den katalog som skall användas för att spara applikationen. I terminal fönstret skapa en katalog för applikationen. I mitt fall döper jag den till MyApp. Navigera sedan in i den skapade katalogen.

Det första vi skall göra är att skapa en .NET Core solution fil. Skriv in följande kommando och tryck Enter.

dotnet new sln

Steg 2.

Nästa steg är att skapa vårt applikationsprojekt. I aktuell katalog skapa en katalog src. Navigera till i src katalogen och skriv in följande kommando:

dotnet new mvc -n myapp

Kommandot skapar en ny ASP.NET MVC applikation med namnet myapp. -n flaggan låter oss bestämma namnet på applikationen som skapas. Om vi utelämnar flaggan så får applikationen samma namn som katalogen. I vårt fall src.

Navigera nu tillbaka till katalogen där vi placerade vår solution fil. Nu skall vi sätta en referens till vårt nya projekt i solution filen. Detta underlättar att öppna alla filer som behövs genom att enbart öppna solution filen i t ex Visual Studio.

dotnet sln add src/myapp/

Nu är vi klara med applikationen nästa steg är att skapa en test projekt.

Steg 3.

Se till att vi står i samma katalog som vi har vår solution fil i. I katalogen skapar vi nu en ny katalog test som kommer att innehålla vårt test projekt.

Navigera nu till test katalogen och skriv in följande kommando:

dotnet new xunit -n myapp.test

Detta kommando skapar ett xUnit test projekt med namnet myapp.test.

xUnit är ett "open source" verktyg för enhetstester. Klicka på länken för att lära mer.

Nu måste vi registrera vårt nya projekt med vår solution fil. Så navigera tillbaka till katalogen där vi har solution filen och skriv in följande kommando igen.

dotnet sln add test/myapp.test

Nu har vi registrerat våra två projekt i solution filen. Så nu kan vi gå vidare.

Steg 4.

Sista steget i att skapa våra projekt är att tala om för vårt test projekt vilket projekt som testerna skall köras mot. Detta görs genom att registrera en referens till vårt applikations projekt ifrån test projektet. Enklast är att se till att vi står i samma katalog som vår solution fil. Skriv in följande kommando:

dotnet add test/myapp.test reference src/myapp/

För att vara säker på att allt fungerar så låt oss bygga projekten. Skriv in följande kommando:

dotnet build

Om allt gått bra så bör vi se Build succeeded i vårt terminal fönster.

Steg 5. Initiera Git

För att kunna versions hantera vår kod så måste vi initiera en git hantering för vår kod. Se till att stå i vår huvudkatalog, dvs där vi har solution fil och skriv in följande kommando:

git init

Detta skapar ett tomt repository för oss att använda. För att nu lägga till vår kod så skriver vi följande kommandon:

git add .
git commit -m "Initial Commit"

Nu ligger vår kod i vårt lokala repository. Nu är det dags att ansluta till Azure DevOps.

Steg 6. Skapa ett projekt i DevOps

Börja med att gå till https://dev.azure.com/ och logga in med ert Microsoft konto som är länkat till DevOps. Öppna upp den organisation som ni vill använda. Välj att skapa ett nytt projekt.

När projektet är skapat klicka på meny alternativet Repos.

När sidan visas gå till mitten av sidan och välj alternativet Push an existing repository from command line och kopiera git kommandot. Gå tillbaka till terminal fönstret och klistra in kommandot i huvudkatalogen och tryck på Enter. Om allt går bra så bör följande resultat synas i terminal fönstret.

Om vi nu går tillbaka till DevOps och gör en refresh av fönstret kommer vi nu se att vår kod nu finns vårt nya repository på Azure DevOps.

Nu har vi satt upp ett nytt DevOps projekt och placerat våra projekt och filer under dess ansvar. Nästa steg är att sätta upp CI och CD.

Continuous Integration med Azure Devops

Nu när vi har vår applikationskod i Azure DevOps Repository så är det dags att sätta upp vår CI Pipeline(Continuous Integration). Så att när vi checkar in vår kod så körs våra tester och om det går bra så görs en Build av våran kod.

Pipelines

När vi skall skapa ett flöde för vårt repository, det vill säga att vi behöver ett antal steg genomförda för att koden skall genomgå test samt genomgå en kompilering för att sedan byggas. Så använder vi Pipelines i Azure DevOps. En pipeline är helt enkelt ett antal steg som skall köra i en viss ordning.

Vi har två vägar/sätt att välja att skapa en pipeline för att bygga vår kod. Antingen kan vi via vårt repository välja att trycka på knappen "Set up build". Se nedanstående bild:

Eller så kan vi i den vänstra meny fältet klicka på Pipelines och sedan klicka på knappen Create Pipeline. Nu kommer några steg som vi behöver genomföra.

Steg 1.

Var finns vår kod.

Vi väljer här alternativet Azure Repos Git.

Steg 2.

I steg 2 väljer vilket repository som vi vill använda.

Steg 3.

I steg 3 så ska vi välja vad för typ av applikation är det vi har. Verktyget försöker analysera vårt repository för att ge oss förslag på vad för typ av applikation som den tror vi har skapat. Ibland fungerar det och ibland inte😁. I vårt fall så är det en .NET Core applikation och tyvärr så ser vi inte det alternativet i listan som presenteras. Utan vi behöver klicka på knappen Show more.

Rullar vi ner en bit så hittar vi alternativet ASP.NET Core. Vilket är den vi vill ha.

Steg 4.

Review your pipeline YAML

Nu är vi nästan klara. Vi har nu fått en konfigurationsfil skapad åt oss som innehåller information om vad som kommer att aktivera vår pipeline samt var själva arbetet med att köra vår Build Pipeline kommer att ske och vad som kommer att göras.

Låt oss bara stanna till lite och gå igenom de kommandon som står i vår YAML fil.

På rad 6 har vi steget trigger. Detta steget talar om att så fort en ändring sker i vår main branch så kommer vår pipeline att köras.
På rad 9. har vi steget pool: vmImage: Detta steget talar om för AzureDevOps att leta upp en virtual server i molnet med operativ systemet Ubuntu med senaste version. För att användas för arbetes som skall genomföras.
Rad 12 variables: buildConfiguration: 'Release'. Deklarerar vi en variabel som kommer att användas i kommande steg. I vårt fall så är variabelns värde satt till Release. För vi vill skapa ett applikations paket utan debug information.
På rad 15 Steps: Börjar egentligen själva arbetet med vad som behöver göras för att generera ett applikations paket. Så låt oss fokusera på detta första steg som är ett skript som kommer att köras.

Skriptet kommer att exekvera ett .net CLI kommando.

dotnet build --configuration Release

displayName kommer att vara det som visas som steg i jobbet när det exekveras.

Om vi nu är nöjda med vad som skall göras kan vi klicka på knappen Save and run uppe till höger.

När vi gör detta så får vi upp en bekräftelse dialog där vi kan ge ett namn på exekveringen.

Klickar vi nu på knappen Save and run igen. Så kommer bygg processen att starta.
Vi kan nu följa flödet och vi ser att jobbet går in i en Queued fas. Denna fas innebär att nu letas det efter en ledig resurs(virtuell server) i Azure för att ta hand om vårt jobb.

Nästa fas är Running.

Slutligen så övergår jobbet i fas Succeeded.

Testa Continuous Integration (Ci).

Så nu är allting uppsatt för att kontinuerligt bygga vår applikation vid commit till vår main branch. Så låt oss testa så att allting fungerar.

Öppna upp applikationen i VS Code för editering. Nu måste vi göra en viktig sak innan vi gör några ändringar. På grund av att vi har skapat en YAML fil i DevOps så har vi inte den i vårt projekt. Så nu behöver vi göra en Pull för att synkronisera det som vi har i vårt lokala repository med det som finns i DevOps repository.

Det finns två sätt att göra en Pull i VS Code. Antingen via menyn till vänster Source Control och klicka på de tre punkterna och i dropdown menyn välja pull.

Eller i ett terminal fönster skriva in kommandot git pull.

Nu är vi synkroniserad med vårt repository i DevOps. Om vi nu tittar i projektfönstret så kommer vi att hitta vår YAML fil.

Om vi nu gör en ändring i vår kod och pushar ändring till vårt lokala repo och sedan gör en git push till DevOps. Så kommer en ny build att starta automatiskt.

Och slutligen kan vi se att allt är fungerande.

Så nu har vi skapa en CI Pipeline med DevOps🎊.

Nästa steg är att skapa Continuous Deployment.

Continuous Deployment med Azure Devops