Упражнение. Развертывание приложения Функции Azure в Azure

Завершено

Ваш проект изначально включает конвейер для сборки проектов в решении и для развертывания веб-приложения в Службе приложений Azure. Теперь пришло время расширить этот конвейер, чтобы также развернуть новый проект Функции Azure.

В этой части вы получите следующее:

  • Просмотрите этап сборки.
  • Добавьте задачу для развертывания приложения-функции.
  • Добавьте задачу, чтобы настроить опубликованную Служба приложений для использования опубликованной функции.
  • Сохраните конвейер, чтобы активировать рабочий процесс CI/CD.

Просмотр этапа сборки

Здесь вы просмотрите существующий конвейер CI/CD, определенный в azure-pipelines.yml.

  1. В Azure DevOps перейдите к Конвейерам.

  2. Выберите конвейер.

  3. Выберите Изменить. Убедитесь, что ветвь имеет значение main , выбрав ее в раскрывающемся меню. Откроется файл azure-pipelines.yml , определяющий существующий конвейер CI/CD.

    Из-за использования подстановочных знаков в пути проекта выделенные ниже задачи автоматически восстанавливают, создают и публикуют новый проект Функции Azure.

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

Энди: Это был наш предыдущий этап сборки. Я не изменил его из исходного проекта, так как задачи уже были настроены для выполнения для всех проектов на основе шаблона сопоставления подстановочных знаков.

Мара: Да, это должно работать как есть. Я не думаю, что нам нужно внести какие-либо изменения здесь. После выполнения этой задачи сборки артефакты ZIP-файла для проектов веб-и лидеров будут опубликованы для используемого этапа развертывания.

Добавление задачи для развертывания функции Azure

Энди: Я думаю, что мы также можем повторно использовать задачу развертывания Служба приложений как есть. Надеюсь, есть что-то подобное, что мы можем использовать для развертывания приложения-функции.

Мара: У меня есть хорошие новости. После небольшого исследования это выглядит так, как есть задача, которая концептуально похожа на задачу развертывания Служба приложений, но для Функции Azure развертываний. Давайте с ней познакомимся.

Задача приложения-функции Azure

Задача AzureFunctionApp@1 предназначена для развертывания приложений-функций. Он концептуально похож на AzureWebApp@1 задачу и включает все, что необходимо для этого сценария приложения-функции:

  • azureSubscription ссылается на имя переменной конвейера подключения службы Azure.
  • appType указывает, развертывается ли приложение для Linux (functionAppLinux) или Windows (functionApp).
  • appNameуказывает имя экземпляра приложения Функции Azure в учетной записи Azure.
  • package указывает путь к развернутом пакету.
  • runtimeStack указывает, в каком образе должна выполняться функция, которая требуется для развертываний Linux.
  • startUpCommand указывает команду запуска для запуска после развертывания функции, которая требуется для развертываний Linux.

Дополнительные сведения о гибкости этой задачи см. в документации по задаче приложения-функции Azure.

Добавьте следующий выделенный код в конец конвейера.

- stage: 'Deploy'
  displayName: 'Deploy the web application'
  dependsOn: Build
  jobs:
  - deployment: Deploy
    pool:
      vmImage: 'ubuntu-20.04'
    environment: spike
    variables:
    - group: Release
    strategy:
      runOnce:
        deploy:
          steps:
          - download: current
            artifact: drop
          - task: AzureWebApp@1
            displayName: 'Azure App Service Deploy: website'
            inputs:
              azureSubscription: 'Resource Manager - Tailspin - Space Game'
              appName: '$(WebAppName)'
              appType: webAppLinux
              package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/Tailspin.SpaceGame.Web.zip'

          - task: AzureFunctionApp@1
            displayName: 'Azure Function Deploy: leaderboard'
            inputs:
              azureSubscription: 'Resource Manager - Tailspin - Space Game'
              appType: functionAppLinux
              appName: '$(LeaderboardAppName)'
              package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/Tailspin.SpaceGame.LeaderboardFunction.zip'
              runtimeStack: DOCKER|microsoft/azure-functions-dotnet:4
              startUpCommand: 'func azure functionapp publish $(functionAppName) --no-bundler'

Совет

В файле YAML важно пробелы. Убедитесь, что добавленная здесь задача использует то же отступ, что и предыдущая задача.

Добавление задачи для обновления параметров приложения Служба приложений

Энди: Теперь все, что нам нужно сделать, — настроить веб-приложение для использования опубликованного API списка лидеров. Обычно мы настраиваем переменные на портале, но было бы лучше, если бы мы могли это сделать здесь. Он ожидает параметр AppSettings с именем LeaderboardFunctionUrl.

Мара: Я согласен. Добавление задачи для этого в наш конвейер поможет нам избежать случайного надзора по дороге, если мы изменим любую службу. Мы можем положить его прямо в конце.

Добавьте следующий выделенный код в конец конвейера. Следите за соблюдением отступов в соответствии с предшествующей задачей. Если вы хотите узнать больше об этой задаче, ознакомьтесь с документацией по приложение Azure задаче "Параметры службы".

- task: AzureFunctionApp@1
  displayName: 'Azure Function Deploy: leaderboard'
  inputs:
    azureSubscription: 'Resource Manager - Tailspin - Space Game'
    appType: functionAppLinux
    appName: '$(LeaderboardAppName)'
    package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/Tailspin.SpaceGame.LeaderboardFunction.zip'
    runtimeStack: DOCKER|microsoft/azure-functions-dotnet:4
    startUpCommand: 'func azure functionapp publish $(functionAppName) --no-bundler'

- task: AzureAppServiceSettings@1
  displayName: 'Update web app settings'
  inputs:
    azureSubscription: 'Resource Manager - Tailspin - Space Game'
    appName: $(WebAppName)
    resourceGroupName: $(ResourceGroupName)
    appSettings: |
      [
        {
          "name": "AppSettings__LeaderboardFunctionUrl",
          "value": "http://$(LeaderboardAppName).azurewebsites.net/api/LeaderboardFunction",
          "slotSetting": false
        }
      ]

Сохранение конвейера для активации сборки и выпуска

  1. Выберите "Сохранить " в правом верхнем углу страницы. Подтвердите сохранение , чтобы активировать запуск.

  2. В Azure Pipelines перейдите к сборке. Трассировка сборки при выполнении.

  3. После успешной сборки выберите задачу развертывания веб-сайта и выберите URL-адрес для просмотра развернутого сайта.

    Снимок экрана: расположение URL-адреса веб-сайта в Azure Pipelines.

  4. Вы получите страницу с сайтом, работающим на Служба приложений. Прокрутите вниз, чтобы убедиться, что в таблице лидеров есть реальные данные. Это осуществляется приложением-функцией.

    Снимок экрана: веб-сайт Space Game.

    Примечание.

    Если возникла ошибка при загрузке таблицы лидеров, дважды проверьте шаги, которые вы выполнили в этом модуле. Если отображается сообщение об исключении "An attempt was made to access a socket in a way forbidden by its access permissions" (Была предпринята попытка доступа к сокету с использованием способа, запрещенного в его разрешениях на доступ), убедитесь, что параметр AppSettings__LeaderboardFunctionUrl в службе приложений задан правильно.

  5. Вы также можете протестировать приложение-функцию напрямую. Просто перейдите по URL-адресу, используя следующий формат. Ответ — JSON, который должен отображаться как текст в браузере.

    http://<leaderboard function name>.azurewebsites.net/api/LeaderboardFunction?pageSize=10
    

    как

    http://tailspin-space-game-leaderboard-4692.azurewebsites.net/api/LeaderboardFunction?pageSize=10
    

Энди: Это оказалось здорово! Все должны быть довольно впечатлены потенциалом, который мы показали здесь.