Wdrażanie w usłudze App Service przy użyciu usługi Azure Pipelines

Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019

Użyj usługi Azure Pipelines, aby automatycznie wdrożyć aplikację internetową w celu aplikacja systemu Azure Service w każdej pomyślnej kompilacji. Usługa Azure Pipelines umożliwia tworzenie, testowanie i wdrażanie za pomocą ciągłej integracji i ciągłego dostarczania (CD) przy użyciu usługi Azure DevOps.

Potoki YAML są definiowane przy użyciu pliku YAML w repozytorium. Krok jest najmniejszym blokiem konstrukcyjnym potoku i może być skryptem lub zadaniem (wstępnie spakowanym skryptem). Dowiedz się więcej o kluczowych pojęciach i składnikach tworzących potok.

Użyjesz zadania Azure Web App (AzureWebApp) do wdrożenia w usłudze aplikacja systemu Azure Service w potoku. W przypadku bardziej skomplikowanych scenariuszy, takich jak konieczność używania parametrów XML we wdrożeniu, możesz użyć zadania wdrażania usługi aplikacja systemu Azure (AzureRmWebAppDeployment).

Wymagania wstępne

1. Tworzenie potoku dla stosu

W przykładach kodu w tej sekcji założono, że wdrażasz aplikację internetową ASP.NET. Możesz dostosować instrukcje dotyczące innych struktur.

Dowiedz się więcej o obsłudze ekosystemu usługi Azure Pipelines.

  1. Zaloguj się do organizacji usługi Azure DevOps i przejdź do projektu.

  2. Przejdź do obszaru Potoki, a następnie wybierz pozycję Nowy potok.

  3. Po wyświetleniu monitu wybierz lokalizację kodu źródłowego: Azure Repos Git lub GitHub.

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

  4. Po wyświetleniu listy repozytoriów wybierz repozytorium.

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

  6. Po wyświetleniu karty Konfigurowanie wybierz pozycję ASP.NET Core.

  7. Gdy pojawi się nowy potok, przyjrzyj się kodowi YAML, aby zobaczyć, co robi. Gdy wszystko będzie gotowe, wybierz pozycję Zapisz i uruchom.

2. Dodaj zadanie wdrażania

  1. Kliknij koniec pliku YAML, a następnie wybierz pozycję Pokaż asystenta.

  2. Użyj asystenta zadań, aby dodać zadanie Aplikacji internetowej platformy Azure.

    Screenshot of Azure web app task.

    Alternatywnie możesz dodać zadanie wdrażania usługi aplikacja systemu Azure (AzureRmWebAppDeployment).

  3. Wybierz subskrypcję platformy Azure. Pamiętaj, aby autoryzować połączenie. Autoryzacja tworzy wymagane połączenie z usługą.

  4. Wybierz stos Typ aplikacji, Nazwa aplikacji i Środowisko uruchomieniowe na podstawie aplikacji usługi App Service. Kompletny kod YAML powinien wyglądać podobnie do poniższego kodu.

    variables:
      buildConfiguration: 'Release'
    
    steps:
    - script: dotnet build --configuration $(buildConfiguration)
      displayName: 'dotnet build $(buildConfiguration)'
    - task: DotNetCoreCLI@2
      inputs:
        command: 'publish'
        publishWebProjects: true
    - task: AzureWebApp@1
      inputs:
        azureSubscription: '<service-connection-name>'
        appType: 'webAppLinux'
        appName: '<app-name>'
        package: '$(System.DefaultWorkingDirectory)/**/*.zip'
    
    • azureSubscription: nazwa autoryzowanego połączenia usługi z subskrypcją platformy Azure.
    • appName: nazwa istniejącej aplikacji.
    • package: ścieżka pliku do pakietu lub folderu zawierającego zawartość usługi App Service. Obsługiwane są symbole wieloznaczne.

Przykład: wdrażanie aplikacji .NET

Aby wdrożyć pakiet internetowy .zip (na przykład z aplikacji internetowej ASP.NET) do aplikacji internetowej platformy Azure, użyj następującego fragmentu kodu, aby wdrożyć kompilację w aplikacji.

variables:
  buildConfiguration: 'Release'

steps:
- script: dotnet build --configuration $(buildConfiguration)
  displayName: 'dotnet build $(buildConfiguration)'
- task: DotNetCoreCLI@2
  inputs:
    command: 'publish'
    publishWebProjects: true
- task: AzureWebApp@1
  inputs:
    azureSubscription: '<service-connection-name>'
    appType: 'webAppLinux'
    appName: '<app-name>'
    package: '$(System.DefaultWorkingDirectory)/**/*.zip'
  • azureSubscription: Twoja subskrypcja platformy Azure.
  • appType: typ aplikacji internetowej.
  • appName: nazwa istniejącej usługi app Service.
  • package: ścieżka pliku do pakietu lub folderu zawierającego zawartość usługi App Service. Obsługiwane są symbole wieloznaczne.

Przykład: wdrażanie w aplikacji wirtualnej

Domyślnie wdrożenie odbywa się z aplikacją główną w aplikacji internetowej platformy Azure. Wdrożenie w określonej aplikacji wirtualnej można wdrożyć przy użyciu VirtualApplication właściwości zadania wdrażania usługi aplikacja systemu Azure (AzureRmWebAppDeployment):

- task: AzureRmWebAppDeployment@4
  inputs:
    VirtualApplication: '<name of virtual application>'

Przykład: Wdrażanie w miejscu

W poniższym przykładzie pokazano, jak wdrożyć w miejscu przejściowym, a następnie zamienić na miejsce produkcyjne:

- task: AzureWebApp@1
  inputs:
    azureSubscription: '<service-connection-name>'
    appType: webAppLinux
    appName: '<app-name>'
    deployToSlotOrASE: true
    resourceGroupName: '<name of resource group>'
    slotName: staging
    package: '$(Build.ArtifactStagingDirectory)/**/*.zip'

- task: AzureAppServiceManage@0
  inputs:
    azureSubscription: '<service-connection-name>'
    appType: webAppLinux
    WebAppName: '<app-name>'
    ResourceGroupName: '<name of resource group>'
    SourceSlot: staging
    SwapWithProduction: true
  • azureSubscription: Twoja subskrypcja platformy Azure.
  • appType: (opcjonalnie) Użyj webAppLinux polecenia , aby wdrożyć aplikację internetową w systemie Linux.
  • appName: nazwa istniejącej usługi app Service.
  • deployToSlotOrASE: wartość logiczna. Wdróż w istniejącym miejscu wdrożenia lub środowisku usługi aplikacja systemu Azure.
  • resourceGroupName: nazwa grupy zasobów. Wymagane, jeśli deployToSlotOrASE ma wartość true.
  • slotName: nazwa miejsca, które domyślnie ma wartość production. Wymagane, jeśli deployToSlotOrASE ma wartość true.
  • package: ścieżka pliku do pakietu lub folderu zawierającego zawartość usługi App Service. Obsługiwane są symbole wieloznaczne.
  • SourceSlot: miejsce wysłane do środowiska produkcyjnego, gdy SwapWithProduction ma wartość true.
  • SwapWithProduction: wartość logiczna. Zamień ruch miejsca źródłowego na środowisko produkcyjne.

Przykład: Wdrażanie w wielu aplikacjach internetowych

Zadania w pliku YAML umożliwiają skonfigurowanie potoku wdrożeń. Za pomocą zadań można kontrolować kolejność wdrażania w wielu aplikacjach internetowych.

jobs:
- job: buildandtest
  pool:
    vmImage: ubuntu-latest
 
  steps:
  # publish an artifact called drop
  - task: PublishPipelineArtifact@1
    inputs:
      targetPath: '$(Build.ArtifactStagingDirectory)' 
      artifactName: drop
  
  # deploy to Azure Web App staging
  - task: AzureWebApp@1
    inputs:
      azureSubscription: '<service-connection-name>'
      appType: <app type>
      appName: '<staging-app-name>'
      deployToSlotOrASE: true
      resourceGroupName: <group-name>
      slotName: 'staging'
      package: '$(Build.ArtifactStagingDirectory)/**/*.zip'

- job: deploy
  dependsOn: buildandtest
  condition: succeeded()

  pool: 
    vmImage: ubuntu-latest  
  
  steps:
    # download the artifact drop from the previous job
  - task: DownloadPipelineArtifact@2
    inputs:
      source: 'current'
      artifact: 'drop'
      path: '$(Pipeline.Workspace)'

  - task: AzureWebApp@1
    inputs:
      azureSubscription: '<service-connection-name>'
      appType: <app type>
      appName: '<production-app-name>'
      resourceGroupName: <group-name>
      package: '$(Pipeline.Workspace)/**/*.zip'

Przykład: Tworzenie podstawień zmiennych

W przypadku większości stosów języków ustawienia aplikacji i parametry połączenia można ustawić jako zmienne środowiskowe w czasie wykonywania.

Istnieją jednak inne powody, dla których warto utworzyć podstawianie zmiennych w pliku Web.config. W tym przykładzie plik Web.config zawiera parametry połączenia o nazwie connectionString. Przed wdrożeniem w każdej aplikacji internetowej można zmienić jej wartość. Można to zrobić, stosując przekształcenie Web.config lub zastępując zmienne w pliku Web.config.

Poniższy fragment kodu przedstawia przykład podstawianie zmiennych przy użyciu zadania aplikacja systemu Azure Service Deploy (AzureRmWebAppDeployment):

jobs:
- job: test
  variables:
    connectionString: <test-stage connection string>
  steps:
  - task: AzureRmWebAppDeployment@4
    inputs:
      azureSubscription: '<Test stage Azure service connection>'
      WebAppName: '<name of test stage web app>'
      enableXmlVariableSubstitution: true

- job: prod
  dependsOn: test
  variables:
    connectionString: <prod-stage connection string>
  steps:
  - task: AzureRmWebAppDeployment@4
    inputs:
      azureSubscription: '<Prod stage Azure service connection>'
      WebAppName: '<name of prod stage web app>'
      enableXmlVariableSubstitution: true

Przykład: wdrażanie warunkowe

Aby to zrobić w języku YAML, możesz użyć jednej z następujących technik:

  • Izoluj kroki wdrażania do oddzielnego zadania i dodaj warunek do tego zadania.
  • Dodaj warunek do kroku.

W poniższym przykładzie pokazano, jak używać warunków kroku do wdrażania tylko kompilacji pochodzących z gałęzi głównej:

- task: AzureWebApp@1
  condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
  inputs:
    azureSubscription: '<service-connection-name>'
    appName: '<app-name>'

Aby dowiedzieć się więcej na temat warunków, zobacz Określanie warunków.

Przykład: wdrażanie przy użyciu narzędzia Web Deploy

Zadanie wdrażania usługi aplikacja systemu Azure (AzureRmWebAppDeployment) może zostać wdrożone w usłudze App Service przy użyciu narzędzia Web Deploy.

trigger:
- main

pool:
  vmImage: windows-latest

variables:
  buildConfiguration: 'Release'

steps:
- script: dotnet build --configuration $(buildConfiguration)
  displayName: 'dotnet build $(buildConfiguration)'
- task: DotNetCoreCLI@2
  inputs:
    command: 'publish'
    publishWebProjects: true
    arguments: '--configuration $(buildConfiguration)'
    zipAfterPublish: true
- task: AzureRmWebAppDeployment@4
  inputs:
    ConnectionType: 'AzureRM'
    azureSubscription: '<service-connection-name>'
    appType: 'webApp'
    WebAppName: '<app-name>'
    packageForLinux: '$(System.DefaultWorkingDirectory)/**/*.zip'
    enableCustomDeployment: true
    DeploymentType: 'webDeploy'

Często zadawane pytania

Jaka jest różnica między zadaniami AzureWebApp i AzureRmWebAppDeployment ?

Zadanie aplikacji internetowej platformy Azure (AzureWebApp) to najprostszy sposób wdrażania w aplikacji internetowej platformy Azure. Domyślnie wdrożenie odbywa się z aplikacją główną w aplikacji internetowej platformy Azure.

Zadanie aplikacja systemu Azure Service Deploy (AzureRmWebAppDeployment) może obsługiwać więcej scenariuszy niestandardowych, takich jak:

Uwaga

Przekształcenia plików i podstawienie zmiennych są również obsługiwane przez oddzielne zadanie Przekształcanie plików do użycia w usłudze Azure Pipelines. Za pomocą zadania Przekształcanie plików można zastosować przekształcenia plików i podstawienia zmiennych w dowolnych plikach konfiguracji i parametrów.

Otrzymuję komunikat "Podano nieprawidłowy pakiet usługi App Service lub ścieżkę folderu".

W potokach YAML w zależności od potoku może występować niezgodność między miejscem zapisania utworzonego pakietu internetowego i miejscem, w którym szuka zadania wdrażania. Na przykład AzureWebApp zadanie pobiera pakiet internetowy do wdrożenia. Na przykład zadanie AzureWebApp wygląda w pliku $(System.DefaultWorkingDirectory)/**/*.zip. Jeśli pakiet internetowy jest zdeponowany w innym miejscu, zmodyfikuj wartość package.

Otrzymuję komunikat "Publikowanie przy użyciu opcji webdeploy są obsługiwane tylko w przypadku korzystania z agenta systemu Windows".

Ten błąd występuje w zadaniu AzureRmWebAppDeployment podczas konfigurowania zadania do wdrożenia przy użyciu narzędzia Web Deploy, ale agent nie jest uruchomiony w systemie Windows. Sprawdź, czy kod YAML jest podobny do następującego:

pool:
  vmImage: windows-latest

Narzędzie Web Deploy nie działa, gdy wyłączam uwierzytelnianie podstawowe

Aby uzyskać informacje dotyczące rozwiązywania problemów z uzyskiwaniem uwierzytelniania identyfikatora entra firmy Microsoft w celu pracy z AzureRmWebAppDeployment zadaniem, zobacz Nie mogę wdrożyć w sieci Web w usłudze aplikacja systemu Azure przy użyciu uwierzytelniania identyfikatora Entra firmy Microsoft z mojego agenta systemu Windows

Następne kroki

  • Dostosowywanie potoku usługi Azure DevOps.