Поделиться через


Реализация непрерывной интеграции и непрерывного развертывания с использованием Azure Pipelines

Azure Pipelines - это более новая версия функций сборки и выпуска Azure DevOps.

В этой статье описываются действия по настройке среды Azure Pipelines с помощью непрерывной интеграции и непрерывного развертывания для автоматизации сборок, модульных тестов и развертывания SharePoint Framework.

Выбор между многоступенчатыми конвейерами Azure и сборками и выпусками Azure DevOps

В настоящее время доступны два подхода для реализации непрерывной интеграции и развертывания в Azure DevOps. Сборки и выпуски Azure появились раньше, предлагая интерфейс с графическим оформлением и сохранение определений в JSON-документе, скрытом от пользователя.

Многоступенчатые конвейеры Azure используют определения конвейеров, хранящиеся в репозитории в виде файлов YAML, обеспечивая прозрачность, ведение журнала версий и повторяемость. Оба подхода описаны для SharePoint Framework:

Внедрение непрерывной интеграции и непрерывного тестирования

Этап непрерывной интеграции и непрерывного тестирования описывается следующим шаблоном YAML. Скопируйте следующее содержимое в новый файл в корне проекта с именем azure-pipelines-build-template.yml.

parameters:
  name: ''
jobs:
  - job: ${{ parameters.name }}
    pool:
      vmImage: 'ubuntu-latest'
      demands:
      - npm
      - node.js
      - java
    variables:
      npm_config_cache: $(Pipeline.Workspace)/.npm

    steps:
      - checkout: self

      - task: NodeTool@0
        displayName: 'Use Node 10.x'
        inputs:
          versionSpec: 10.x
          checkLatest: true

      - task: CacheBeta@1
        inputs:
          key: npm | $(Agent.OS) | package-lock.json
          path: $(npm_config_cache)
          cacheHitVar: CACHE_RESTORED
      - script: npm ci
        displayName: 'npm ci'

      - task: Gulp@0
        displayName: 'Bundle project'
        inputs:
          targets: bundle
          arguments: '--ship'

      - script: npm test
        displayName: 'npm test'

      - task: PublishTestResults@2
        displayName: Publish test results
        inputs:
          testResultsFormat: JUnit
          testResultsFiles: '**/junit.xml'
          #failTaskOnFailedTests: true #if we want to fail the build on failed unit tests

      - task: PublishCodeCoverageResults@1
        displayName: 'Publish code coverage results'
        inputs:
          codeCoverageTool: Cobertura
          summaryFileLocation: '$(System.DefaultWorkingDirectory)/**/*coverage.xml'

      - task: Gulp@0
        displayName: 'Package Solution'
        inputs:
          targets: 'package-solution'
          arguments: '--ship'

      - task: CopyFiles@2
        displayName: 'Copy Files to: $(Build.ArtifactStagingDirectory)'
        inputs:
          Contents: |
            sharepoint/**/*.sppkg
          TargetFolder: '$(Build.ArtifactStagingDirectory)'

      - task: PublishBuildArtifacts@1
        displayName: 'Publish Artifact: drop'

Примечание.

Вы можете закомментировать / удалить задачи PublishCodeCoverageResults, PublishTestResults и npm тест, если у вас нет встроенного модульного теста и / или вы не хотите запускать модульные тесты.

Примечание.

Вы можете найти последнюю версию этого файла на образце

Внедрение непрерывного развертывания

Этап непрерывного развертывания описывается следующим шаблоном YAML. Скопируйте следующее содержимое в новый файл в корне проекта с именем azure-pipelines-deploy-template.yml.

parameters:
  # unique name of the job
  job_name: deploy_sppkg
  # friendly name of the job
  display_name: Upload & deploy *.sppkg to SharePoint app catalog
  # name of target environment deploying to
  target_environment: ''
  # app catalog scope (tenant|sitecollection)
  m365cli_app_catalog_scope: 'tenant'
  variable_group_name: ''
jobs:
- deployment: ${{ parameters.job_name }}
  displayName: ${{ parameters.display_name }}
  pool:
    vmImage: 'ubuntu-latest'
  environment: ${{ parameters.target_environment }}
  variables:
  - group: ${{parameters.variable_group_name}} #m365_user_login, m365_user_password, m365_app_catalog_site_url
  strategy:
    runOnce:
      deploy:
        steps:
        - checkout: none
        - download: current
          artifact: drop
          patterns: '**/*.sppkg'
        - script: sudo npm install --global @pnp/cli-microsoft365
          displayName: Install CLI for Microsoft365
        - script: m365 login $(m365_app_catalog_site_url) --authType password --userName $(m365_user_login) --password $(m365_user_password)
          displayName: Login to Microsoft 365
        - script: |
            CMD_GET_SPPKG_NAME=$(find $(Pipeline.Workspace)/drop -name '*.sppkg' -exec basename {} \;)
            echo "##vso[task.setvariable variable=SpPkgFileName;isOutput=true]${CMD_GET_SPPKG_NAME}"
          displayName: Get generated *.sppkg filename
          name: GetSharePointPackage
        - script: m365 spo app add --filePath "$(Pipeline.Workspace)/drop/sharepoint/solution/$(GetSharePointPackage.SpPkgFileName)" --appCatalogUrl $(m365_app_catalog_site_url) --scope ${{ parameters.m365cli_app_catalog_scope }} --overwrite
          displayName: Upload SharePoint package to Site Collection App Catalog
        - script: m365 spo app deploy --name $(GetSharePointPackage.SpPkgFileName) --appCatalogUrl $(m365_app_catalog_site_url) --scope ${{ parameters.m365cli_app_catalog_scope }}
          displayName: Deploy SharePoint package

Примечание.

Вы можете найти последнюю версию этого файла на образце

Определение структуры конвейера

Теперь, когда этапы сборки и развертывания определены в соответствующих шаблонах, его необходимо собрать как многоступенчатый конвейер. В этом документе будет описана структура конвейера, а также различные используемые среды. Скопируйте следующее содержимое в новый файл в корне проекта с именем azure-pipelines.yml.

name: $(TeamProject)_$(BuildDefinitionName)_$(SourceBranchName)_$(Date:yyyyMMdd)$(Rev:.r)
resources:
- repo: self

trigger:
  branches:
    include:
    - master
    - develop

stages:
- stage: build
  displayName: build
  jobs:
    - template: ./azure-pipelines-build-template.yml
      parameters:
        name: 'buildsolution'
- stage: 'deployqa'
  # uncomment if you want deployments to occur only for a specific branch
  #condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))
  jobs:
    - template: ./azure-pipelines-deploy-template.yml
      parameters:
        job_name: deploy_solution
        target_environment: 'qa'
        variable_group_name: qa_configuration

Примечание.

Вы можете найти последнюю версию этого файла на образце

Примечание.

Вы можете определить несколько сред, дублируя этап deployqa и предоставляя различные параметры. В этом случае убедитесь, что имя этапа, имя задания, целевая среда и имя группы переменных являются уникальными.

Примечание.

Вы можете выполнять условное развертывание в разных средах, используя условия

Настройка учетных данных для сред

Секреты никогда не должны передаваться в хранилище по соображениям безопасности. Конвейер, описанный в предыдущих шагах, использует группы переменных для сохранения секретности значений конфигурации. Группы переменных должны быть созданы для каждой среды, и имя должно соответствовать тому, что описано в определении конвейера (здесь qa_configuration). Чтобы создать группу переменных, выполните следующие действия:

  1. Войдите в Azure DevOps, перейдите к своему проекту
  2. В разделе Конвейеры выбрать Библиотека
  3. Добавьте новую группу переменных убедившись, что имя соответствует тому, что определено в определении конвейера
  4. Добавьте следующие переменные в группу и выберите Сохранить
    • m365_user_login: имя для входа администратора клиента SharePoint
    • m365_user_password: пароль пользователя учетной записи
    • m365_app_catalog_site_url: URL-адрес семейства сайтов каталога приложений

Примечание.

Вы можете выбрать значок на панели блокировки рядом с вводом значения переменной, чтобы пометить его как чувствительный, и Azure DevOps Services скрывает это значение от других пользователей и из журналов.