Dela via


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

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.

  1. Logga in på Azure-portalen.

  2. På menyn väljer du Cloud Shell och Bash-upplevelsen .

  3. 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    
    
  4. Ö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ärdet location för att använda din närmaste region.

    az group create --location eastus --name tailspin-space-game-rg
    
  5. 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
    
  6. 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"
    
  7. 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
    
  8. 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 buildConfigurationreleaseBranchName
  • 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

  1. Logga in på din Azure DevOps-organisation och gå till projektet.

  2. Gå till Pipelines och välj sedan Ny pipeline eller Skapa pipeline om du skapar din första pipeline.

  3. Utför stegen i guiden genom att först välja GitHub som plats för källkoden.

  4. Du kan omdirigeras till GitHub för att logga in. I så fall anger du dina GitHub-autentiseringsuppgifter.

  5. När du ser listan över lagringsplatser väljer du din lagringsplats.

  6. Du kan omdirigeras till GitHub för att installera Azure Pipelines-appen. I så fall väljer du Godkänn och installera.

  1. När fliken Konfigurera visas väljer du Startpipeline.

  2. 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
    
  3. När du är klar väljer du Spara och kör.

Lägga till instansvariabler

  1. I Azure DevOps går du till Pipelines-biblioteket>.

  2. Välj + Variabelgrupp.

  3. Under Egenskaper lägger du till Version för variabelgruppens namn.

  4. 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
  5. 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.

  1. I Azure Pipelines går du till Pipelines Pipelines>.

  2. Välj Redigera på snabbmenyn för att redigera din pipeline.

    Skärmbild av välj Redigera menyalternativ.

  3. 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'
      
  4. Ändra aktiviteten AzureWebApp@1 så att den använder din prenumeration.

    1. Välj Inställningar för aktiviteten.

      Skärmbild av inställningsalternativet i YAML-redigeraraktiviteten.

    2. 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.

      Skärmbild av menyalternativet i Azure-prenumerationen.

    3. Ange Apptyp till Webbapp i Linux.

    4. Välj Lägg till för att uppdatera aktiviteten.

  5. 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ö

  1. Välj Miljöer i Azure Pipelines.

  2. Välj Ny miljö.

  3. Skapa en ny miljö med namnet mellanlagring och Resurs inställt på Ingen.

  4. På sidan mellanlagringsmiljö väljer du Godkännanden och kontroller.

    Skärmbild av menyalternativet godkännanden och kontroller.

  5. Välj Godkännanden.

  6. I Godkännare väljer du Lägg till användare och grupper och sedan ditt konto.

  7. I Instruktioner för godkännare skriver du Godkänn den här ändringen när den är redo för mellanlagring.

  8. 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.

  1. 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'
    
  2. Ändra uppgiften AzureWebApp@1 i mellanlagringsfasen så att den använder din prenumeration.

    1. Välj Inställningar för aktiviteten.

      Skärmbild av inställningsalternativet i YAML-redigeraraktiviteten.

    2. 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.

      Skärmbild av menyalternativet i Azure-prenumerationen.

    3. Ange Apptyp till Webbapp i Linux.

    4. Välj Lägg till för att uppdatera aktiviteten.

  3. Gå till pipelinekörningen. Titta på bygget när det körs. När den når Stagingvä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.

    Skärmbild av väntan på godkännande av pipelinen.

  4. Granska godkännandet och tillåt att pipelinen körs.

    Skärmbild av manuell valideringskontroll.

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:

  1. Gå till Azure Portal och logga in.

  2. I menyraden väljer du Cloud Shell. När du uppmanas till det väljer du Bash-upplevelsen.

    En skärmbild av Azure Portal som visar hur du väljer menyalternativet Cloud Shell.

  3. 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.