Упражнение. Публикация результата в конвейере

Завершено

На этом этапе можно создать веб-проект Space Game через конвейер.

Но куда деваются результаты сборки? Прямо сейчас выходные данные сборки остаются на временном сервере сборки. Маре нужен способ передать эту сборку Амите, чтобы она начала тестирование.

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

Примечание.

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

Публикация сборки в конвейере

В .NET можно упаковать приложение в виде ZIP-файла. Затем можно использовать встроенную задачу PublishBuildArtifacts@1 для публикации ZIP-файла в Azure Pipelines.

  1. В Visual Studio Code измените azure-pipelines.yml следующим образом:

    trigger:
    - '*'
    
    pool:
      name: 'Default' #replace if needed with name of your agent pool
    
    steps:
    - task: UseDotNet@2
      displayName: 'Use .NET SDK 6.x'
      inputs:
        version: '6.x'
    
    - task: Npm@1
      displayName: 'Run npm install'
      inputs:
        verbose: false
    
    - script: './node_modules/.bin/node-sass Tailspin.SpaceGame.Web/wwwroot --output Tailspin.SpaceGame.Web/wwwroot'
      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: Tailspin.SpaceGame.Web/wwwroot
    
    - task: DotNetCoreCLI@2
      displayName: 'Restore project dependencies'
      inputs:
        command: 'restore'
        projects: '**/*.csproj'
    
    - task: DotNetCoreCLI@2
      displayName: 'Build the project - Release'
      inputs:
        command: 'build'
        arguments: '--no-restore --configuration Release'
        projects: '**/*.csproj'
    
    - task: DotNetCoreCLI@2
      displayName: 'Publish the project - Release'
      inputs:
        command: 'publish'
        projects: '**/*.csproj'
        publishWebProjects: false
        arguments: '--no-build --configuration Release --output $(Build.ArtifactStagingDirectory)/Release'
        zipAfterPublish: true
    
    - task: PublishBuildArtifacts@1
      displayName: 'Publish Artifact: drop'
      condition: succeeded()
    
    trigger:
    - '*'
    
    pool:
      vmImage: ubuntu-latest
    
    steps:
    - task: UseDotNet@2
      displayName: 'Use .NET SDK 6.x'
      inputs:
        version: '6.x'
    
    - task: Npm@1
      displayName: 'Run npm install'
      inputs:
        verbose: false
    
    - script: './node_modules/.bin/node-sass Tailspin.SpaceGame.Web/wwwroot --output Tailspin.SpaceGame.Web/wwwroot'
      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: Tailspin.SpaceGame.Web/wwwroot
    
    - task: DotNetCoreCLI@2
      displayName: 'Restore project dependencies'
      inputs:
        command: 'restore'
        projects: '**/*.csproj'
    
    - task: DotNetCoreCLI@2
      displayName: 'Build the project - Release'
      inputs:
        command: 'build'
        arguments: '--no-restore --configuration Release'
        projects: '**/*.csproj'
    
    - task: DotNetCoreCLI@2
      displayName: 'Publish the project - Release'
      inputs:
        command: 'publish'
        projects: '**/*.csproj'
        publishWebProjects: false
        arguments: '--no-build --configuration Release --output $(Build.ArtifactStagingDirectory)/Release'
        zipAfterPublish: true
    
    - task: PublishBuildArtifacts@1
      displayName: 'Publish Artifact: drop'
      condition: succeeded()
    

    Эта версия azure-pipelines.yml выглядит как предыдущая версия, но добавляет две дополнительные задачи.

    Первая задача использует задачу DotNetCoreCLI@2 для публикации или упаковки результатов сборки приложения (включая зависимости) в папку. Аргумент zipAfterPublish указывает, что нужно добавить результаты сборки в ZIP-файл.

    Вторая задача использует задачу PublishBuildArtifacts@1 для публикации ZIP-файла в Azure Pipelines. Аргумент condition указывает, что задача должна выполняться только в том случае, если предыдущая задача выполнена успешно. succeeded() является условием по умолчанию, поэтому не нужно его указывать. Но мы показываем его здесь, чтобы показать свое использование.

  2. В окне встроенного терминала добавьте azure-pipelines.yml в индекс, зафиксируйте изменения и отправьте их в GitHub.

    Совет

    Прежде чем выполнять эти команды Git, не забудьте сохранить azure-pipelines.yml.

    git add azure-pipelines.yml
    git commit -m "Add publish tasks"
    git push origin build-pipeline
    
  3. Как и раньше, в Azure Pipelines проследите за всеми шагами сборки.

  4. По завершении конвейера вернитесь к сводке для сборки.

  5. В разделе Related (Связанные) указывается 1 published (Опубликованных: 1).

    Screenshot of the build summary. Details include the repository and version, the time started and elapsed, and a link to the published build artifact.

  6. Выберите артефакт.

  7. Разверните папку удаления.

    Появится файл ZIP, содержащий созданное приложение и его зависимости.

    Screenshot of the packaged web application in the Artifacts explorer.

    В качестве дополнительного упражнения можно скачать этот файл ZIP на компьютер и исследовать его содержимое.

Определение переменных для повышения удобства чтения

Мара изучает свою работу. Конфигурация сборки работает, как задумано, но Мара хочет убедиться, что Энди и другие пользователи могут легко поддерживать актуальность этой конфигурации и расширять ее.

С помощью переменных вы можете один раз определить значения и ссылаться на них в любом месте конвейера. Azure Pipelines заменяет каждую переменную текущим значением при запуске конвейера.

Как и в случае с другими языками программирования, переменные позволяют выполнять следующие действия.

  • Определите значения, которые могут изменяться между запусками конвейера.
  • Храните данные, которые повторяются в конвейере, например номер версии или путь к файлу, в одном месте. В этом случае вам не потребуется обновлять все повторения, когда что-то изменяется у вас.

Azure Pipelines предоставляет множество встроенных переменных. Эти переменные описывают аспекты процесса сборки, такие как идентификатор сборки и имена каталогов, в которых создается и выполняется программное обеспечение.

Также вы можете определить собственные переменные. Ниже приведен пример переменной buildConfiguration, которая определяет конфигурацию сборки выпуска:

variables:
  buildConfiguration: 'Release'

Используйте переменные, если повторять одно и то же значение несколько раз или когда значение, например версия зависимости, может измениться.

Не нужно создавать переменную для каждого фрагмента конфигурации сборки. На самом деле слишком много переменных сделают код конвейера сложнее для чтения и понимания.

Проверьте файл azure-pipelines.yml. Обратите внимание, что эти значения повторяются:

  • Конфигурация сборки: Release.
  • Расположение каталога wwwroot: Tailspin.SpaceGame.Web/wwwroot.
  • Версия пакета SDK для .NET: 6.x.

Теперь вы используете переменные для определения этих значений один раз. Затем вы ссылаетесь на переменные во всем конвейере.

  1. В Visual Studio Code измените azure-pipelines.yml следующим образом:

    trigger:
    - '*'
    
    pool:
      name: 'Default' #replace if needed with name of your agent pool
    
    variables:
      buildConfiguration: 'Release'
      wwwrootDir: 'Tailspin.SpaceGame.Web/wwwroot'
      dotnetSdkVersion: '6.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
    
    - task: PublishBuildArtifacts@1
      displayName: 'Publish Artifact: drop'
      condition: succeeded()
    
    trigger:
    - '*'
    
    pool:
      vmImage: ubuntu-latest
    
    variables:
      buildConfiguration: 'Release'
      wwwrootDir: 'Tailspin.SpaceGame.Web/wwwroot'
      dotnetSdkVersion: '6.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
    
    - task: PublishBuildArtifacts@1
      displayName: 'Publish Artifact: drop'
      condition: succeeded()
    

    Обратите внимание на раздел variables, в котором определены эти переменные:

    • buildConfiguration: указывает конфигурацию сборки.
    • wwwrootDir: указывает путь к каталогу wwwroot.
    • dotnetSdkVersion: указывает используемую версию пакета SDK для .NET.

    Чтобы ссылаться на эти переменные, используйте синтаксис $() точно так же, как вы ссылаетесь на встроенные переменные. Вот шаг, на котором выполняется node-Sass для преобразования файлов Sass в CSS. Для получения пути к каталогу wwwroot используется ссылка на переменную wwwrootDir.

    - script: './node_modules/.bin/node-sass $(wwwrootDir) --output $(wwwrootDir)'
      displayName: 'Compile Sass assets'
    

    Команда скрипта использует переменную для определения исходного каталога для файлов Sass и каталога, в котором записываются CSS-файлы. Она также использует переменную для определения имени задачи, отображаемого в пользовательском интерфейсе.

  2. В окне встроенного терминала добавьте azure-pipelines.yml в индекс, зафиксируйте изменения и отправьте их в GitHub.

    git add azure-pipelines.yml
    git commit -m "Refactor common variables"
    git push origin build-pipeline
    
  3. В Azure Pipelines проследите за всеми шагами сборки.

    Вы увидите, что переменные заменяются на их значения при выполнении сборки. Например, в задаче UseDotNet@2 задается используемая версия пакета SDK для .NET.

    Screenshot of Azure Pipelines showing the .NET SDK task running in the pipeline.

    Как и раньше, чтобы увидеть артефакт после завершения сборки, можно перейти к сводке сборки.

Поздравляем! Вы успешно использовали Azure Pipelines и создали первый артефакт сборки.