Självstudie: Skapa en pipeline för flera steg med Azure DevOps
Azure DevOps Services | Azure DevOps Server 2022 – Azure DevOps Server 2019
Du kan använda en Azure DevOps-pipeline för flera steg för att dela upp CI/CD-processen i faser som representerar olika delar av utvecklingscykeln. Med hjälp av en pipeline för flera flöden får du mer insyn i distributionsprocessen och gör det enklare att integrera godkännanden och kontroller.
I den här artikeln skapar du två App Service-instanser och skapar en YAML-pipeline med tre steg:
I ett verkligt scenario kan du ha en annan fas för distribution till produktion beroende på din DevOps-process.
Exempelkoden i den här övningen är för ett .NET-webbprogram för ett låtsasutrymmesspel som innehåller en topplista för att visa höga poäng. Du distribuerar till både utvecklings- och mellanlagringsinstanser av Azure Web App för Linux.
Förutsättningar
- Ett GitHub-konto där du kan skapa en lagringsplats. Skapa en kostnadsfritt.
- Ett Azure-konto med en aktiv prenumeration. Skapa ett konto utan kostnad.
- En Azure DevOps-organisation och ett projekt. Skapa en kostnadsfritt.
- En möjlighet att köra pipelines på Microsoft-värdbaserade agenter. Du kan antingen köpa ett parallellt jobb eller begära en kostnadsfri nivå.
Förgrena projektet
Förgrena följande exempellagringsplats på GitHub.
https://github.com/MicrosoftDocs/mslearn-tailspin-spacegame-web-deploy
Skapa App Service-instanserna
Innan du kan distribuera din pipeline måste du först skapa en App Service-instans att distribuera till. Du använder Azure CLI för att skapa instansen.
Logga in på Azure-portalen.
På menyn väljer du Cloud Shell och Bash-upplevelsen .
Generera ett slumptal som gör webbappens domännamn unikt. Fördelen med att ha ett unikt värde är att din App Service-instans inte har någon namnkonflikt med andra elever som slutför den här självstudien.
webappsuffix=$RANDOM
Öppna en kommandotolk och använd ett
az group create
kommando för att skapa en resursgrupp med namnet tailspin-space-game-rg som innehåller alla dina App Service-instanser. Uppdatera värdetlocation
för att använda din närmaste region.az group create --location eastus --name tailspin-space-game-rg
Använd kommandotolken för att skapa en App Service-plan.
az appservice plan create \ --name tailspin-space-game-asp \ --resource-group tailspin-space-game-rg \ --sku B1 \ --is-linux
I kommandotolken skapar du två App Service-instanser, en för varje instans (Dev och Staging) med
az webapp create
kommandot .az webapp create \ --name tailspin-space-game-web-dev-$webappsuffix \ --resource-group tailspin-space-game-rg \ --plan tailspin-space-game-asp \ --runtime "DOTNET|6.0" az webapp create \ --name tailspin-space-game-web-staging-$webappsuffix \ --resource-group tailspin-space-game-rg \ --plan tailspin-space-game-asp \ --runtime "DOTNET|6.0"
I kommandotolken listar du båda App Service-instanserna för att kontrollera att de körs med
az webapp list
kommandot .az webapp list \ --resource-group tailspin-space-game-rg \ --query "[].{hostName: defaultHostName, state: state}" \ --output table
Kopiera namnen på App Service-instanserna som ska användas som variabler i nästa avsnitt.
Skapa ditt Azure DevOps-projekt och variabler
Konfigurera ditt Azure DevOps-projekt och en bygg-pipeline. Du lägger också till variabler för dina utvecklings- och mellanlagringsinstanser.
Din byggpipeline:
- Innehåller en utlösare som körs när en kod ändras till gren
- Definierar två variabler och
buildConfiguration
releaseBranchName
- Innehåller en fas med namnet Build som skapar webbprogrammet
- Publicerar en artefakt som du använder i ett senare skede
Lägg till byggsteget
Logga in på din Azure DevOps-organisation och gå till projektet.
Gå till Pipelines och välj sedan Ny pipeline eller Skapa pipeline om du skapar din första pipeline.
Utför stegen i guiden genom att först välja GitHub som plats för källkoden.
Du kan omdirigeras till GitHub för att logga in. I så fall anger du dina GitHub-autentiseringsuppgifter.
När du ser listan över lagringsplatser väljer du din lagringsplats.
Du kan omdirigeras till GitHub för att installera Azure Pipelines-appen. I så fall väljer du Godkänn och installera.
När fliken Konfigurera visas väljer du Startpipeline.
Ersätt innehållet i azure-pipelines.yml med den här koden.
trigger: - '*' variables: buildConfiguration: 'Release' releaseBranchName: 'release' stages: - stage: 'Build' displayName: 'Build the web application' jobs: - job: 'Build' displayName: 'Build job' pool: vmImage: 'ubuntu-20.04' demands: - npm variables: wwwrootDir: 'Tailspin.SpaceGame.Web/wwwroot' dotnetSdkVersion: '6.x' steps: - task: UseDotNet@2 displayName: 'Use .NET SDK $(dotnetSdkVersion)' inputs: version: '$(dotnetSdkVersion)' - task: Npm@1 displayName: 'Run npm install' inputs: verbose: false - script: './node_modules/.bin/node-sass $(wwwrootDir) --output $(wwwrootDir)' displayName: 'Compile Sass assets' - task: gulp@1 displayName: 'Run gulp tasks' - script: 'echo "$(Build.DefinitionName), $(Build.BuildId), $(Build.BuildNumber)" > buildinfo.txt' displayName: 'Write build info' workingDirectory: $(wwwrootDir) - task: DotNetCoreCLI@2 displayName: 'Restore project dependencies' inputs: command: 'restore' projects: '**/*.csproj' - task: DotNetCoreCLI@2 displayName: 'Build the project - $(buildConfiguration)' inputs: command: 'build' arguments: '--no-restore --configuration $(buildConfiguration)' projects: '**/*.csproj' - task: DotNetCoreCLI@2 displayName: 'Publish the project - $(buildConfiguration)' inputs: command: 'publish' projects: '**/*.csproj' publishWebProjects: false arguments: '--no-build --configuration $(buildConfiguration) --output $(Build.ArtifactStagingDirectory)/$(buildConfiguration)' zipAfterPublish: true - publish: '$(Build.ArtifactStagingDirectory)' artifact: drop
När du är klar väljer du Spara och kör.
Lägga till instansvariabler
I Azure DevOps går du till Pipelines-biblioteket>.
Välj + Variabelgrupp.
Under Egenskaper lägger du till Version för variabelgruppens namn.
Skapa två variabler för att referera till dina värdnamn för utveckling och mellanlagring. Ersätt värdet
1234
med rätt värde för din instans.Variabelnamn Exempelvärde WebAppNameDev tailspin-space-game-web-dev-1234 WebAppNameStaging tailspin-space-game-web-staging-1234 Spara variablerna genom att välja Spara .
Lägg till Utvecklingssteget
Därefter uppdaterar du pipelinen för att höja upp bygget till Utvecklingssteget.
I Azure Pipelines går du till Pipelines Pipelines>.
Välj Redigera på snabbmenyn för att redigera din pipeline.
Uppdatera azure-pipelines.yml för att inkludera en Dev-fas. I Utvecklingsfasen kommer pipelinen att:
Kör när byggfasen lyckas på grund av ett villkor
Ladda ned en artefakt från
drop
Distribuera till Azure App Service med en Azure Resource Manager-tjänstanslutning
trigger: - '*' variables: buildConfiguration: 'Release' releaseBranchName: 'release' stages: - stage: 'Build' displayName: 'Build the web application' jobs: - job: 'Build' displayName: 'Build job' pool: vmImage: 'ubuntu-20.04' demands: - npm variables: wwwrootDir: 'Tailspin.SpaceGame.Web/wwwroot' dotnetSdkVersion: '6.x' steps: - task: UseDotNet@2 displayName: 'Use .NET SDK $(dotnetSdkVersion)' inputs: version: '$(dotnetSdkVersion)' - task: Npm@1 displayName: 'Run npm install' inputs: verbose: false - script: './node_modules/.bin/node-sass $(wwwrootDir) --output $(wwwrootDir)' displayName: 'Compile Sass assets' - task: gulp@1 displayName: 'Run gulp tasks' - script: 'echo "$(Build.DefinitionName), $(Build.BuildId), $(Build.BuildNumber)" > buildinfo.txt' displayName: 'Write build info' workingDirectory: $(wwwrootDir) - task: DotNetCoreCLI@2 displayName: 'Restore project dependencies' inputs: command: 'restore' projects: '**/*.csproj' - task: DotNetCoreCLI@2 displayName: 'Build the project - $(buildConfiguration)' inputs: command: 'build' arguments: '--no-restore --configuration $(buildConfiguration)' projects: '**/*.csproj' - task: DotNetCoreCLI@2 displayName: 'Publish the project - $(buildConfiguration)' inputs: command: 'publish' projects: '**/*.csproj' publishWebProjects: false arguments: '--no-build --configuration $(buildConfiguration) --output $(Build.ArtifactStagingDirectory)/$(buildConfiguration)' zipAfterPublish: true - publish: '$(Build.ArtifactStagingDirectory)' artifact: drop - stage: 'Dev' displayName: 'Deploy to the dev environment' dependsOn: Build condition: succeeded() jobs: - deployment: Deploy pool: vmImage: 'ubuntu-20.04' environment: dev variables: - group: Release strategy: runOnce: deploy: steps: - download: current artifact: drop - task: AzureWebApp@1 displayName: 'Azure App Service Deploy: dev website' inputs: azureSubscription: 'your-subscription' appType: 'webAppLinux' appName: '$(WebAppNameDev)' package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/*.zip'
Ändra aktiviteten
AzureWebApp@1
så att den använder din prenumeration.Välj Inställningar för aktiviteten.
your-subscription
Uppdatera värdet för Azure-prenumeration för att använda din egen prenumeration. Du kan behöva auktorisera åtkomst som en del av den här processen. Om du stöter på ett problem med att auktorisera din resurs i YAML-redigeraren är en alternativ metod att skapa en tjänstanslutning.Ange Apptyp till Webbapp i Linux.
Välj Lägg till för att uppdatera aktiviteten.
Spara och kör din pipeline.
Lägg till mellanlagringssteget
Slutligen höjer du utvecklingssteget till Mellanlagring. Till skillnad från Dev-miljön vill du ha mer kontroll i mellanlagringsmiljön så lägger du till ett manuellt godkännande.
Skapa mellanlagringsmiljö
Välj Miljöer i Azure Pipelines.
Välj Ny miljö.
Skapa en ny miljö med namnet mellanlagring och Resurs inställt på Ingen.
På sidan mellanlagringsmiljö väljer du Godkännanden och kontroller.
Välj Godkännanden.
I Godkännare väljer du Lägg till användare och grupper och sedan ditt konto.
I Instruktioner för godkännare skriver du Godkänn den här ändringen när den är redo för mellanlagring.
Välj Spara.
Lägga till ny fas i pipelinen
Du lägger till en ny fas i Staging
pipelinen som innehåller ett manuellt godkännande.
Redigera pipelinefilen och lägg till avsnittet
Staging
.trigger: - '*' variables: buildConfiguration: 'Release' releaseBranchName: 'release' stages: - stage: 'Build' displayName: 'Build the web application' jobs: - job: 'Build' displayName: 'Build job' pool: vmImage: 'ubuntu-20.04' demands: - npm variables: wwwrootDir: 'Tailspin.SpaceGame.Web/wwwroot' dotnetSdkVersion: '6.x' steps: - task: UseDotNet@2 displayName: 'Use .NET SDK $(dotnetSdkVersion)' inputs: version: '$(dotnetSdkVersion)' - task: Npm@1 displayName: 'Run npm install' inputs: verbose: false - script: './node_modules/.bin/node-sass $(wwwrootDir) --output $(wwwrootDir)' displayName: 'Compile Sass assets' - task: gulp@1 displayName: 'Run gulp tasks' - script: 'echo "$(Build.DefinitionName), $(Build.BuildId), $(Build.BuildNumber)" > buildinfo.txt' displayName: 'Write build info' workingDirectory: $(wwwrootDir) - task: DotNetCoreCLI@2 displayName: 'Restore project dependencies' inputs: command: 'restore' projects: '**/*.csproj' - task: DotNetCoreCLI@2 displayName: 'Build the project - $(buildConfiguration)' inputs: command: 'build' arguments: '--no-restore --configuration $(buildConfiguration)' projects: '**/*.csproj' - task: DotNetCoreCLI@2 displayName: 'Publish the project - $(buildConfiguration)' inputs: command: 'publish' projects: '**/*.csproj' publishWebProjects: false arguments: '--no-build --configuration $(buildConfiguration) --output $(Build.ArtifactStagingDirectory)/$(buildConfiguration)' zipAfterPublish: true - publish: '$(Build.ArtifactStagingDirectory)' artifact: drop - stage: 'Dev' displayName: 'Deploy to the dev environment' dependsOn: Build condition: succeeded() jobs: - deployment: Deploy pool: vmImage: 'ubuntu-20.04' environment: dev variables: - group: Release strategy: runOnce: deploy: steps: - download: current artifact: drop - task: AzureWebApp@1 displayName: 'Azure App Service Deploy: dev website' inputs: azureSubscription: 'your-subscription' appType: 'webAppLinux' appName: '$(WebAppNameDev)' package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/*.zip' - stage: 'Staging' displayName: 'Deploy to the staging environment' dependsOn: Dev jobs: - deployment: Deploy pool: vmImage: 'ubuntu-20.04' environment: staging variables: - group: 'Release' strategy: runOnce: deploy: steps: - download: current artifact: drop - task: AzureWebApp@1 displayName: 'Azure App Service Deploy: staging website' inputs: azureSubscription: 'your-subscription' appType: 'webAppLinux' appName: '$(WebAppNameStaging)' package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/*.zip'
Ändra uppgiften
AzureWebApp@1
i mellanlagringsfasen så att den använder din prenumeration.Välj Inställningar för aktiviteten.
your-subscription
Uppdatera värdet för Azure-prenumeration för att använda din egen prenumeration. Du kan behöva auktorisera åtkomst som en del av den här processen.Ange Apptyp till Webbapp i Linux.
Välj Lägg till för att uppdatera aktiviteten.
Gå till pipelinekörningen. Titta på bygget när det körs. När den når
Staging
väntar pipelinen på manuellt godkännande av versionen. Du får också ett e-postmeddelande om att du har en pipeline som väntar på godkännande.Granska godkännandet och tillåt att pipelinen körs.
Rensa resurser
Om du inte kommer att fortsätta att använda det här programmet tar du bort resursgruppen i Azure Portal och projektet i Azure DevOps med följande steg:
Så här rensar du resursgruppen:
Gå till Azure Portal och logga in.
I menyraden väljer du Cloud Shell. När du uppmanas till det väljer du Bash-upplevelsen.
Kör följande az group delete-kommando för att ta bort den resursgrupp som du använde,
tailspin-space-game-rg
.az group delete --name tailspin-space-game-rg
Information om hur du tar bort ditt Azure DevOps-projekt, inklusive bygg-pipelinen, finns i Ta bort projekt.