Nasazení vlastního kontejneru do služby App Service pomocí Azure Pipelines

Azure DevOps umožňuje hostovat, sestavovat, plánovat a testovat kód pomocí bezplatných pracovních postupů. Použití Azure Pipelines jako jednoho z těchto pracovních postupů umožňuje nasadit aplikaci pomocí CI/CD, která funguje s libovolnou platformou a cloudem. Kanál se definuje jako soubor YAML v kořenovém adresáři vašeho úložiště.

V tomto článku použijeme Azure Pipelines k nasazení aplikace typu kontejner pro Windows do služby App Service z úložiště Git v Azure DevOps. Předpokládá se, že už máte aplikaci .NET s podpůrným souborem Dockerfile v Azure DevOps.

Požadavky

Přidání připojení služby

Před vytvořením kanálu byste měli nejprve vytvořit připojení ke službě, protože při vytváření šablony se zobrazí výzva k výběru a ověření připojení. Připojení ke službě umožňuje připojit se k libovolnému registru (ACR nebo Docker Hub) při použití šablon úloh. Při přidávání nového připojení služby zvolte možnost Registr Dockeru. Následující formulář vás požádá o výběr Centra Dockeru nebo služby Azure Container Registry spolu s souvisejícími informacemi. Pokud chcete postupovat podle tohoto kurzu, použijte Azure Container Registry. Nové připojení ke službě můžete vytvořit podle pokynů zde.

Zabezpečení tajných kódů

Vzhledem k tomu, že používáme citlivé informace, ke kterým nechcete, aby ostatní měli přístup, používáme proměnné k ochraně našich informací. Vytvořte proměnnou podle zde uvedených pokynů.

Pokud chcete přidat proměnnou, klikněte na tlačítko Proměnné vedle tlačítka Uložit v pravém horním rohu zobrazení pro úpravy kanálu. Vyberte tlačítko Nová proměnná a zadejte své informace. Přidejte níže uvedené proměnné s vlastními tajnými kódy odpovídajícími jednotlivým prostředkům.

  • vmImageName: windows-latest
  • imageRepository: your-image-repo-name
  • dockerfilePath: $(Build.SourcesDirectory)/path/to/Dockerfile
  • dockerRegistryServiceConnection: your-service-connection-number

Vytvoření nového kanálu

Po vytvoření úložiště pomocí aplikace .NET a podpůrného souboru Dockerfile můžete kanál vytvořit pomocí následujícího postupu.

  1. Přejděte na Kanály na levém řádku nabídek a klikněte na tlačítko Vytvořit kanál .
  2. Na další obrazovce jako možnost úložiště vyberte Git Azure Repos a vyberte úložiště, ve kterém je váš kód.
  3. Na kartě Konfigurace zvolte možnost Počáteční kanál .
  4. Pod další kartou Revize klikněte na tlačítko Uložit .

Sestavení a nasdílení image do registru kontejnerů Azure

Po vytvoření a uložení kanálu budete muset kanál upravit a spustit kroky pro sestavení kontejneru, nasdílení do registru a nasazení image do služby App Service. Začněte tak, že přejdete do nabídky Pipelines , zvolíte kanál, který jste vytvořili, a kliknete na tlačítko Upravit .

Nejprve musíte přidat úlohu Dockeru, abyste mohli vytvořit image. Přidejte následující kód a nahraďte soubor Dockerfile: app/Dockerfile cestou k souboru Dockerfile.

trigger:
 - main

 pool:
   vmImage: 'windows-latest' 

 variables:
   vmImageName: 'windows-latest'
   imageRepository: 'your-image-repo-name'
   dockerfilePath: '$(Build.SourcesDirectory)/path/to/Dockerfile'
   dockerRegistryServiceConnection: 'your-service-connection-number'

- stage: Build
  displayName: Build and push stage
  jobs:  
  - job: Build
    displayName: Build job
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: Docker@2
      displayName: Build and push an image to container registry
      inputs:
        command: buildAndPush
        repository: $(imageRepository)
        dockerfile: $(dockerfilePath)
        containerRegistry: $(dockerRegistryServiceConnection)
        tags: |
          $(tag)

Přidání úlohy nasazení služby App Service

Dále je potřeba nastavit úlohu nasazení. To vyžaduje název předplatného, název aplikace a registr kontejneru. Do souboru yaml přidejte novou fázi vložením následujícího kódu.

- stage: Deploy
  displayName: Deploy to App Service
  jobs:
  - job: Deploy
    displayName: Deploy
    pool:
      vmImage: $(vmImageName)
    steps:

Dále přejděte na kartu Zobrazit asistenta v pravém horním rohu a vyhledejte úlohu nasazení služby Aplikace Azure a vyplňte následující formulář:

  • Typ připojení: Azure Resource Manager
  • Předplatné Azure: název vašeho předplatného
  • Typ služby App Service: Web App for Containers (Windows)
  • Název služby App Service: název vaší aplikace
  • Registr nebo obor názvů: your-azure-container-registry-namespace
  • Obrázek: název vaší image-azure-container-registry-image-name

Jakmile je vyplníte, klikněte na tlačítko Přidat a přidejte následující úkol:

- task: AzureRmWebAppDeployment@4
  inputs:
    ConnectionType: 'AzureRM'
    azureSubscription: 'my-subscription-name'
    appType: 'webAppHyperVContainer'
    WebAppName: 'my-app-name'
    DockerNamespace: 'myregsitry.azurecr.io'
    DockerRepository: 'dotnetframework:12'

Po přidání úlohy je kanál připravený ke spuštění. Klikněte na tlačítko Ověřit a uložit a spusťte kanál. Kanál prochází kroky pro sestavení a nasdílení image kontejneru Windows do služby Azure Container Registry a nasazení image do služby App Service.

Níže je příklad úplného souboru yaml:

trigger:
 - main

 pool:
   vmImage: 'windows-latest' 

 variables:
   vmImageName: 'windows-latest'
   imageRepository: 'your-image-repo-name'
   dockerfilePath: '$(Build.SourcesDirectory)/path/to/Dockerfile'
   dockerRegistryServiceConnection: 'your-service-connection-number'

- stage: Build
  displayName: Build and push stage
  jobs:  
  - job: Build
    displayName: Build job
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: Docker@2
      displayName: Build and push an image to container registry
      inputs:
        command: buildAndPush
        repository: $(imageRepository)
        dockerfile: $(dockerfilePath)
        containerRegistry: $(dockerRegistryServiceConnection)
        tags: |
          $(tag)

- stage: Deploy
  displayName: Deploy to App Service
  jobs:
  - job: Deploy
    displayName: Deploy
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: AzureRmWebAppDeployment@4
		  inputs:
		    ConnectionType: 'AzureRM'
		    azureSubscription: 'my-subscription-name'
		    appType: 'webAppHyperVContainer'
		    WebAppName: 'my-app-name'
		    DockerNamespace: 'myregsitry.azurecr.io'
		    DockerRepository: 'dotnetframework:12'