Průběžné doručování s využitím Azure Pipelines

Azure Pipelines můžete použít k automatickému nasazení do Azure Functions. Azure Pipelines umožňuje sestavovat, testovat a nasazovat s využitím kontinuální integrace (CI) a průběžného doručování (CD) pomocí Azure DevOps.

Kanály YAML se definují pomocí souboru YAML ve vašem úložišti. Krok je nejmenší stavební blok kanálu a může to být skript nebo úloha (předpřipravený skript). Seznamte se s klíčovými koncepty a komponentami, které tvoří kanál.

K nasazení do Azure Functions použijete úlohu AzureFunctionApp. Nyní existují dvě verze úlohy AzureFunctionApp (AzureFunctionApp@1, AzureFunctionApp@2). AzureFunctionApp@2 zahrnuje rozšířenou podporu ověřování, která z důvodu chyb snižuje pravděpodobnost selhání kanálů.

Zvolte verzi úkolu v horní části článku. Kanály YAML nejsou k dispozici pro Azure DevOps 2019 a starší.

Požadavky

Sestavte aplikaci

  1. Přihlaste se ke své organizaci Azure DevOps a přejděte k projektu.
  2. V projektu přejděte na stránku Kanály . Pak vyberte Nový kanál.
  3. Vyberte jednu z těchto možností pro kde je váš kód?:
    • GitHub: Můžete být přesměrováni na GitHub a přihlásit se. Pokud ano, zadejte svoje přihlašovací údaje GitHubu. Když se jedná o první připojení k GitHubu, průvodce vás také provede procesem připojení DevOps k účtům GitHubu.
    • Git Azure Repos: V aktuálním projektu DevOps si můžete vybrat úložiště.
  4. Jakmile se zobrazí seznam úložišť, vyberte úložiště ukázkové aplikace.
  5. Služba Azure Pipelines analyzuje vaše úložiště a v části Konfigurace kanálu poskytuje seznam potenciálních šablon. Zvolte příslušnou šablonu aplikace funkcí pro váš jazyk. Pokud nevidíte správnou šablonu, vyberte Zobrazit více.
  6. Vyberte Uložit a spusťte, pak vyberte Potvrdit přímo do hlavní větve a pak zvolte Uložit a spustit znovu.
  7. Spustí se nové spuštění. Počkejte na dokončení.

Příklady kanálů sestavení YAML

Pro vytváření aplikací je možné použít následující kanály specifické pro jazyk.

Pomocí následující ukázky můžete vytvořit soubor YAML pro sestavení aplikace .NET.

Pokud se při sestavování aplikace zobrazí chyby, ověřte, že verze rozhraní .NET, kterou používáte, odpovídá vaší verzi Azure Functions. Další informace najdete v přehledu verzí modulu runtime Azure Functions.

pool:
  vmImage: 'windows-latest'
steps:
- script: |
    dotnet restore
    dotnet build --configuration Release
- task: DotNetCoreCLI@2
  inputs:
    command: publish
    arguments: '--configuration Release --output publish_output'
    projects: '*.csproj'
    publishWebProjects: false
    modifyOutputPath: false
    zipAfterPublish: false
- task: ArchiveFiles@2
  displayName: "Archive files"
  inputs:
    rootFolderOrFile: "$(System.DefaultWorkingDirectory)/publish_output"
    includeRootFolder: false
    archiveFile: "$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip"
- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip'
    artifactName: 'drop'

Nasazení aplikace

Nasadíte ji pomocí úlohy Nasazení aplikace funkcí Azure. Tato úloha vyžaduje připojení služby Azure jako vstup. Připojení služby Azure ukládá přihlašovací údaje pro připojení z Azure Pipelines k Azure.

Pokud chcete službu Azure Functions nasadit, přidejte na konec azure-pipelines.yml souboru následující fragment kódu. Výchozí appType hodnota je Windows. Můžete zadat Linux nastavením na appTypefunctionAppLinuxhodnotu .

trigger:
- main

variables:
  # Azure service connection established during pipeline creation
  azureSubscription: <Name of your Azure subscription>
  appName: <Name of the function app>
  # Agent VM image name
  vmImageName: 'ubuntu-latest'

- task: AzureFunctionApp@1 # Add this at the end of your file
  inputs:
    azureSubscription: <Azure service connection>
    appType: functionAppLinux # default is functionApp
    appName: $(appName)
    package: $(System.ArtifactsDirectory)/**/*.zip
    #Uncomment the next lines to deploy to a deployment slot
    #Note that deployment slots is not supported for Linux Dynamic SKU
    #deployToSlotOrASE: true
    #resourceGroupName: '<Resource Group Name>'
    #slotName: '<Slot name>'

Fragment kódu předpokládá, že kroky sestavení v souboru YAML vytvoří archiv zip ve $(System.ArtifactsDirectory) složce vašeho agenta.

Nasazení kontejneru

Kód můžete automaticky nasadit do Služby Azure Functions jako vlastní kontejner po každém úspěšném sestavení. Další informace o kontejnerech najdete v tématu Vytvoření funkce v Linuxu pomocí vlastního kontejneru.

Nasazení pomocí aplikace Funkcí Azure pro úlohu kontejneru

Nejjednodušším způsobem nasazení do kontejneru je použití aplikace Azure Function App v úloze Nasazení kontejneru.

Nasazení provedete tak, že na konec souboru YAML přidáte následující fragment kódu:

trigger:
- main

variables:
  # Container registry service connection established during pipeline creation
  dockerRegistryServiceConnection: <Docker registry service connection>
  imageRepository: <Name of your image repository>
  containerRegistry: <Name of the Azure container registry>
  dockerfilePath: '$(Build.SourcesDirectory)/Dockerfile'
  tag: '$(Build.BuildId)'

  # Agent VM image name
  vmImageName: 'ubuntu-latest'

- task: AzureFunctionAppContainer@1 # Add this at the end of your file
  inputs:
    azureSubscription: '<Azure service connection>'
    appName: '<Name of the function app>'
    imageName: $(containerRegistry)/$(imageRepository):$(tag)

Fragment kódu odešle image Dockeru do služby Azure Container Registry. Úloha Nasazení služby Azure Function App v kontejneru načte příslušnou image Dockeru odpovídající zadanému BuildId úložišti a pak image nasadí.

Nasazení do slotu

Aplikaci funkcí můžete nakonfigurovat tak, aby měla více slotů. Sloty umožňují bezpečně nasadit aplikaci a otestovat ji před tím, než ji zpřístupní vašim zákazníkům.

Následující fragment kódu YAML ukazuje, jak se nasadí do přípravného slotu a pak se prohodí do produkčního slotu:

- task: AzureFunctionApp@1
  inputs:
    azureSubscription: <Azure service connection>
    appType: functionAppLinux
    appName: <Name of the Function app>
    package: $(System.ArtifactsDirectory)/**/*.zip
    deployToSlotOrASE: true
    resourceGroupName: <Name of the resource group>
    slotName: staging

- task: AzureAppServiceManage@0
  inputs:
    azureSubscription: <Azure service connection>
    WebAppName: <name of the Function app>
    ResourceGroupName: <name of resource group>
    SourceSlot: staging
    SwapWithProduction: true

Vytvoření kanálu pomocí Azure CLI

K vytvoření kanálu buildu v Azure použijte az functionapp devops-pipeline createpříkaz. Kanál buildu se vytvoří a uvolní všechny změny kódu provedené v úložišti. Příkaz vygeneruje nový soubor YAML, který definuje kanál sestavení a verze a pak ho potvrdí do vašeho úložiště. Požadavky pro tento příkaz závisí na umístění kódu.

  • Pokud je váš kód na GitHubu:

    • Musíte mít oprávnění k zápisu pro vaše předplatné.

    • V Azure DevOps musíte být správcem projektu.

    • Musíte mít oprávnění k vytvoření tokenu PAT (Personal Access Token) GitHubu, který má dostatečná oprávnění. Další informace najdete v tématu Požadavky na oprávnění PAT GitHubu.

    • Musíte mít oprávnění k potvrzení do hlavní větve v úložišti GitHub, abyste mohli potvrdit automaticky vygenerovaný soubor YAML.

  • Pokud je váš kód v Azure Repos:

    • Musíte mít oprávnění k zápisu pro vaše předplatné.

    • V Azure DevOps musíte být správcem projektu.

Sestavte aplikaci

  1. Přihlaste se ke své organizaci Azure DevOps a přejděte k projektu.
  2. V projektu přejděte na stránku Kanály . Pak zvolte akci, která vytvoří nový kanál.
  3. Projděte si kroky průvodce tak, že nejprve vyberete GitHub jako umístění zdrojového kódu.
  4. Můžete být přesměrováni na GitHub kvůli přihlášení. Pokud ano, zadejte svoje přihlašovací údaje GitHubu.
  5. Jakmile se zobrazí seznam úložišť, vyberte úložiště ukázkové aplikace.
  6. Azure Pipelines bude analyzovat vaše úložiště a doporučí šablonu. Vyberte Uložit a spusťte, pak vyberte Potvrdit přímo do hlavní větve a pak zvolte Uložit a spustit znovu.
  7. Spustí se nové spuštění. Počkejte na dokončení.

Příklady kanálů sestavení YAML

Pro vytváření aplikací je možné použít následující kanály specifické pro jazyk.

K vytvoření souboru YAML pro sestavení aplikace .NET můžete použít následující ukázku:

pool:
  vmImage: 'windows-latest'
steps:
- script: |
    dotnet restore
    dotnet build --configuration Release
- task: DotNetCoreCLI@2
  inputs:
    command: publish
    arguments: '--configuration Release --output publish_output'
    projects: '*.csproj'
    publishWebProjects: false
    modifyOutputPath: false
    zipAfterPublish: false
- task: ArchiveFiles@2
  displayName: "Archive files"
  inputs:
    rootFolderOrFile: "$(System.DefaultWorkingDirectory)/publish_output"
    includeRootFolder: false
    archiveFile: "$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip"
- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip'
    artifactName: 'drop'

Nasazení aplikace

Nasadíte ji pomocí úlohy Nasazení aplikace funkcí Azure v2 . Tato úloha vyžaduje připojení služby Azure jako vstup. Připojení služby Azure ukládá přihlašovací údaje pro připojení z Azure Pipelines k Azure.

Verze úlohy v2 zahrnuje podporu pro novější zásobníky aplikací pro .NET, Python a Node. Úloha zahrnuje kontroly předběžného nasazení sítě. Pokud dojde k problémům s předběžným nasazením, nasazení se zastaví.

Pokud chcete službu Azure Functions nasadit, přidejte na konec azure-pipelines.yml souboru následující fragment kódu. Výchozí appType hodnota je Windows. Můžete zadat Linux nastavením na appTypefunctionAppLinuxhodnotu .

trigger:
- main

variables:
  # Azure service connection established during pipeline creation
  azureSubscription: <Name of your Azure subscription>
  appName: <Name of the function app>
  # Agent VM image name
  vmImageName: 'ubuntu-latest'

- task: AzureFunctionApp@2 # Add this at the end of your file
  inputs:
    azureSubscription: <Azure service connection>
    appType: functionAppLinux # default is functionApp
    appName: $(appName)
    package: $(System.ArtifactsDirectory)/**/*.zip
    deploymentMethod: 'auto' # 'auto' | 'zipDeploy' | 'runFromPackage'. Required. Deployment method. Default: auto.
    #Uncomment the next lines to deploy to a deployment slot
    #Note that deployment slots is not supported for Linux Dynamic SKU
    #deployToSlotOrASE: true
    #resourceGroupName: '<Resource Group Name>'
    #slotName: '<Slot name>'

Fragment kódu předpokládá, že kroky sestavení v souboru YAML vytvoří archiv zip ve $(System.ArtifactsDirectory) složce vašeho agenta.

Nasazení kontejneru

Kód můžete automaticky nasadit do Služby Azure Functions jako vlastní kontejner po každém úspěšném sestavení. Další informace o kontejnerech najdete v tématu Práce s kontejnery a Azure Functions .

Nasazení pomocí aplikace Funkcí Azure pro úlohu kontejneru

Nejjednodušším způsobem nasazení do kontejneru je použití aplikace Azure Function App v úloze Nasazení kontejneru.

Nasazení provedete tak, že na konec souboru YAML přidáte následující fragment kódu:

trigger:
- main

variables:
  # Container registry service connection established during pipeline creation
  dockerRegistryServiceConnection: <Docker registry service connection>
  imageRepository: <Name of your image repository>
  containerRegistry: <Name of the Azure container registry>
  dockerfilePath: '$(Build.SourcesDirectory)/Dockerfile'
  tag: '$(Build.BuildId)'

  # Agent VM image name
  vmImageName: 'ubuntu-latest'

- task: AzureFunctionAppContainer@1 # Add this at the end of your file
  inputs:
    azureSubscription: '<Azure service connection>'
    appName: '<Name of the function app>'
    imageName: $(containerRegistry)/$(imageRepository):$(tag)

Fragment kódu odešle image Dockeru do služby Azure Container Registry. Úloha Nasazení služby Azure Function App v kontejneru načte příslušnou image Dockeru odpovídající zadanému BuildId úložišti a pak image nasadí.

Nasazení do slotu

Aplikaci funkcí můžete nakonfigurovat tak, aby měla více slotů. Sloty umožňují bezpečně nasadit aplikaci a otestovat ji před tím, než ji zpřístupní vašim zákazníkům.

Následující fragment kódu YAML ukazuje, jak se nasadí do přípravného slotu a pak se prohodí do produkčního slotu:

- task: AzureFunctionApp@2
  inputs:
    azureSubscription: <Azure service connection>
    appType: functionAppLinux
    appName: <Name of the Function app>
    package: $(System.ArtifactsDirectory)/**/*.zip
    deploymentMethod: 'auto'
    deployToSlotOrASE: true
    resourceGroupName: <Name of the resource group>
    slotName: staging

- task: AzureAppServiceManage@0
  inputs:
    azureSubscription: <Azure service connection>
    WebAppName: <name of the Function app>
    ResourceGroupName: <name of resource group>
    SourceSlot: staging
    SwapWithProduction: true

Vytvoření kanálu pomocí Azure CLI

K vytvoření kanálu buildu v Azure použijte az functionapp devops-pipeline createpříkaz. Kanál buildu se vytvoří a uvolní všechny změny kódu provedené v úložišti. Příkaz vygeneruje nový soubor YAML, který definuje kanál sestavení a verze a pak ho potvrdí do vašeho úložiště. Požadavky pro tento příkaz závisí na umístění kódu.

  • Pokud je váš kód na GitHubu:

    • Musíte mít oprávnění k zápisu pro vaše předplatné.

    • V Azure DevOps musíte být správcem projektu.

    • Musíte mít oprávnění k vytvoření tokenu PAT (Personal Access Token) GitHubu, který má dostatečná oprávnění. Další informace najdete v tématu Požadavky na oprávnění PAT GitHubu.

    • Musíte mít oprávnění k potvrzení do hlavní větve v úložišti GitHub, abyste mohli potvrdit automaticky vygenerovaný soubor YAML.

  • Pokud je váš kód v Azure Repos:

    • Musíte mít oprávnění k zápisu pro vaše předplatné.

    • V Azure DevOps musíte být správcem projektu.

Další kroky