Udostępnij przez


Samouczek: Tworzenie pipeline'u wielostopniowego za pomocą usługi Azure DevOps

Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022

Użyj wieloetapowego potoku Azure DevOps, aby podzielić proces CI/CD na etapy, które reprezentują różne części cyklu rozwoju. Rurociąg wieloetapowy zapewnia lepszy wgląd w proces wdrażania i ułatwia integrację zatwierdzeń i kontroli.

W tym artykule utworzysz dwa wystąpienia usługi App Service i zbudujesz potok YAML z trzema fazami.

W rzeczywistym scenariuszu może istnieć kolejny etap wdrażania w środowisku produkcyjnym w zależności od procesu DevOps.

Przykładowy kod w tym ćwiczeniu jest przeznaczony dla aplikacji internetowej .NET dla fikcyjnej gry kosmicznej, która zawiera ranking pokazujący wysokie wyniki. Wdrożysz zarówno w instancjach deweloperskich, jak i testowych usługi Azure Web App dla systemu Linux.

Wymagania wstępne

produkt Wymagania
Azure DevOps — Organizacja i projekt usługi Azure DevOps. Utwórz je bezpłatnie.
Uprawnienia: -
    - Aby udzielić dostępu do wszystkich linii w projekcie: musisz być członkiem Grupy Administratorzy Projektu .
    - Aby utworzyć połączenia usług: musisz mieć rolę Administrator lub Twórca dla połączeń usług.
— Możliwość uruchamiania pipeline'ów na agentach hostowanych przez firmę Microsoft. Możesz kupić zadanie równoległe albo poprosić o darmowy poziom.
Usługa GitHub — Konto GitHub .

Sforkuj projekt

Rozgałęź podane przykładowe repozytorium na GitHubie.

https://github.com/MicrosoftDocs/mslearn-tailspin-spacegame-web-deploy

Tworzenie wystąpień usługi App Service

Przed wdrożeniem potoku musisz najpierw utworzyć wystąpienie App Service, do którego chcesz wdrażać. Użyjesz Azure CLI do utworzenia wystąpienia.

  1. Zaloguj się do witryny Azure Portal.

  2. Z menu wybierz Cloud Shell i Bash.

  3. Wygeneruj losową liczbę, która sprawia, że nazwa domeny aplikacji internetowej jest unikatowa. Zaletą unikalnej wartości jest to, że wystąpienie usługi App Service nie będzie miało konfliktu nazw z innymi osobami realizującymi ten samouczek.

    webappsuffix=$RANDOM    
    
  4. Otwórz wiersz polecenia i użyj az group create polecenia , aby utworzyć grupę zasobów o nazwie tailspin-space-game-rg , która zawiera wszystkie wystąpienia usługi App Service. Zaktualizuj wartość location, aby korzystać z najbliższego regionu.

    az group create --location eastus --name tailspin-space-game-rg
    
  5. Użyj wiersza polecenia, aby utworzyć plan usługi App Service.

    az appservice plan create \
      --name tailspin-space-game-asp \
      --resource-group tailspin-space-game-rg \
      --sku B1 \
      --is-linux
    
  6. W wierszu polecenia utwórz dwa wystąpienia usługi App Service, po jednym dla każdego wystąpienia (deweloperskie i przejściowe) przy użyciu polecenia az webapp create.

    az webapp create \
      --name tailspin-space-game-web-dev-$webappsuffix \
      --resource-group tailspin-space-game-rg \
      --plan tailspin-space-game-asp \
      --runtime "DOTNET|8.0"
    
    az webapp create \
      --name tailspin-space-game-web-staging-$webappsuffix \
      --resource-group tailspin-space-game-rg \
      --plan tailspin-space-game-asp \
      --runtime "DOTNET|8.0"
    
  7. W wierszu polecenia wyświetl listę obu wystąpień usługi App Service za pomocą polecenia az webapp list, aby sprawdzić, czy działają.

    az webapp list \
      --resource-group tailspin-space-game-rg \
      --query "[].{hostName: defaultHostName, state: state}" \
      --output table
    
  8. Skopiuj nazwy wystąpień usługi App Service do użycia jako zmienne w następnej sekcji.

Tworzenie projektu i zmiennych usługi Azure DevOps

Skonfiguruj projekt usługi Azure DevOps i potok kompilacji. Dodasz również zmienne dla wystąpień programistycznych i środowiska testowego.

Potok kompilacji:

  • Zawiera wyzwalacz uruchamiany po zmianie kodu w gałęzi
  • Definiuje dwie zmienne buildConfiguration i releaseBranchName
  • Zawiera etap o nazwie Kompilacja, który kompiluje aplikację internetową
  • Publikuje artefakt, którego będziesz używać w późniejszym etapie

Dodawanie etapu kompilacji

  1. W projekcie usługi Azure DevOps wybierz pozycję Potoki z menu nawigacji po lewej stronie.

  2. Wybierz pozycję Nowy potok lub Utwórz potok , jeśli ten potok jest pierwszym w projekcie.

  3. Na ekranie Gdzie jest twój kod wybierz pozycję GitHub.

  4. Być może nastąpi przekierowanie do usługi GitHub w celu zalogowania się. Jeśli tak, wprowadź poświadczenia GitHub.

  5. Na ekranie Wybieranie repozytorium wybierz repozytorium, w których znajduje się aplikacja .NET.

  6. Możesz zostać przekierowany do usługi GitHub, aby zainstalować aplikację Azure Pipelines. Jeśli tak, wybierz pozycję Zatwierdź i zainstaluj.

  1. Po wyświetleniu karty Konfigurowanie wybierz pozycję Potok startowy.

  2. Zastąp zawartość azure-pipelines.yml tym kodem.

    trigger:
    - '*'
    
    variables:
      buildConfiguration: 'Release'
      releaseBranchName: 'release'
    
    stages:
    - stage: 'Build'
      displayName: 'Build the web application'
      jobs: 
      - job: 'Build'
        displayName: 'Build job'
        pool:
          vmImage: 'ubuntu-22.04'
          demands:
          - npm
    
        variables:
          wwwrootDir: 'Tailspin.SpaceGame.Web/wwwroot'
          dotnetSdkVersion: '8.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. Gdy wszystko będzie gotowe, wybierz pozycję Zapisz i uruchom.

Dodaj zmienne wystąpienia

  1. W usłudze Azure DevOps przejdź do Potoki>Biblioteka.

  2. Wybierz + Grupa zmiennych.

  3. W obszarze Właściwości dodaj Release jako nazwę grupy zmiennych.

  4. Utwórz dwie zmienne, aby odwoływać się do nazw hostów programistycznych i testowych. Zastąp wartość 1234 poprawną wartością wystąpienia.

    Nazwa zmiennej Przykładowa wartość
    WebAppNameDev tailspin-space-game-web-dev-1234
    WebAppNameStaging tailspin-space-game-web-staging-1234
  5. Wybierz pozycję Zapisz , aby zapisać zmienne.

Dodawanie etapu deweloperskiego

Następnie zaktualizujesz ciąg pracy, aby przekazać kompilację do fazy deweloperskiej.

  1. W usłudze Azure Pipelines przejdź do PipelinesPipelines.

  2. Wybierz pozycję Edytuj w menu kontekstowym, aby edytować pipeline.

    Zrzut ekranu przedstawiający wybraną pozycję menu Edytuj.

  3. Zaktualizuj azure-pipelines.yml , aby uwzględnić etap deweloperski. Na etapie rozwoju twój potok będzie:

    • Uruchomienie po pomyślnym zakończeniu etapu kompilacji na skutek spełnienia warunku
    • Pobieranie artefaktu z drop
    • Wdrażanie w usłudze Azure App Service przy użyciu połączenia usługi Azure Resource Manager
    trigger:
    - '*'
    
    variables:
      buildConfiguration: 'Release'
      releaseBranchName: 'release'
    
    stages:
    - stage: 'Build'
      displayName: 'Build the web application'
      jobs: 
      - job: 'Build'
        displayName: 'Build job'
        pool:
          vmImage: 'ubuntu-22.04'
          demands:
          - npm
    
        variables:
          wwwrootDir: 'Tailspin.SpaceGame.Web/wwwroot'
          dotnetSdkVersion: '8.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-22.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. Zmień zadanie AzureWebApp@1, aby używało subskrypcji.

    1. Wybierz pozycję Ustawienia zadania.

      Zrzut ekranu przedstawiający opcję ustawień w zadaniu edytora YAML.

    2. Zaktualizuj wartość your-subscription dla subskrypcji Azure, aby używać własnej subskrypcji. W ramach tego procesu może być konieczne autoryzowanie dostępu. Jeśli wystąpi problem z autoryzowaniem zasobu w edytorze YAML, alternatywnym podejściem jest utworzenie połączenia z usługą.

      Zrzut ekranu przedstawiający element menu subskrypcji platformy Azure.

    3. Ustaw Typ aplikacji na Aplikację webową na systemie Linux.

    4. Wybierz pozycję Dodaj , aby zaktualizować zadanie.

  5. Zapisz i uruchom potok.

Dodawanie etapu przejściowego

Na koniec podwyższ poziom etapu deweloperskiego do etapu Testowego. W przeciwieństwie do środowiska deweloperskiego, w środowisku przejściowym chcesz mieć większą kontrolę, dlatego dodasz zatwierdzenie ręczne.

Utwórz środowisko przejściowe

  1. W obszarze Azure Pipelines wybierz pozycję Środowiska.

  2. Wybierz pozycję Nowe środowisko.

  3. Utwórz nowe środowisko o nazwie staging i ustaw zasób na Brak.

  4. Na stronie środowiska przejściowego wybierz pozycję Zatwierdzenia i testy.

    Zrzut ekranu przedstawiający opcję menu zatwierdzenia i sprawdzania.

  5. Wybierz Zatwierdzenia.

  6. W obszarze Osoby zatwierdzające wybierz pozycję Dodaj użytkowników i grupy, a następnie wybierz swoje konto.

  7. W sekcji Instrukcje dla zatwierdzających napisz zatwierdź tę zmianę, gdy będzie gotowa do wprowadzenia.

  8. Wybierz pozycję Zapisz.

Dodawanie nowego etapu do potoku

Do potoku dodasz nowy etap Staging, który zawiera ręczne zatwierdzenie.

  1. Edytuj plik potoku i dodaj sekcję Staging .

    trigger:
    - '*'
    
    variables:
      buildConfiguration: 'Release'
      releaseBranchName: 'release'
    
    stages:
    - stage: 'Build'
      displayName: 'Build the web application'
      jobs: 
      - job: 'Build'
        displayName: 'Build job'
        pool:
          vmImage: 'ubuntu-22.04'
          demands:
          - npm
    
        variables:
          wwwrootDir: 'Tailspin.SpaceGame.Web/wwwroot'
          dotnetSdkVersion: '8.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-22.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-22.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. Zmień zadanie na etapie Staging AzureWebApp@1, aby używać swojej subskrypcji.

    1. Wybierz pozycję Ustawienia zadania.

      Zrzut ekranu przedstawiający opcję ustawień w zadaniu edytora YAML.

    2. Zaktualizuj wartość your-subscription dla subskrypcji Azure, aby używać własnej subskrypcji. W ramach tego procesu może być konieczne autoryzowanie dostępu.

      Zrzut ekranu przedstawiający element menu subskrypcji platformy Azure.

    3. Ustaw Typ aplikacji na Aplikację webową na systemie Linux.

    4. Wybierz pozycję Dodaj , aby zaktualizować zadanie.

  3. Przejdź do wyników działania potoku. Obejrzyj kompilację podczas jej uruchamiania. Gdy osiągnie Stagingwartość , potok czeka na ręczne zatwierdzenie wydania. Otrzymasz również wiadomość e-mail z informacją, że twój proces oczekuje na zatwierdzenie.

    Zrzut ekranu czekania na zatwierdzenie procesu.

  4. Przejrzyj zatwierdzenie i zezwól na uruchomienie pipeline'u.

    Zrzut ekranu przedstawiający ręczne sprawdzanie poprawności.

Czyszczenie zasobów

Jeśli nie zamierzasz nadal korzystać z tej aplikacji, usuń grupę zasobów w witrynie Azure Portal i projekt w usłudze Azure DevOps, wykonując następujące czynności:

Aby wyczyścić grupę zasobów:

  1. Przejdź do witryny Azure Portal i zaloguj się.

  2. Na pasku menu wybierz pozycję Cloud Shell. Po wyświetleniu komunikatu wybierz opcję Bash.

    Zrzut ekranu witryny Azure Portal przedstawiający wybieranie elementu menu usługi Cloud Shell.

  3. Uruchom następujące polecenie az group delete, aby usunąć użytą grupę zasobów . tailspin-space-game-rg

    az group delete --name tailspin-space-game-rg
    

Aby usunąć projekt usługi Azure DevOps, w tym potok kompilacji, zobacz Usuwanie projektu.