При использовании Azure DevOps CI / CD для Linux веб-приложения, как я могу заархивировать и опубликовать sh артефакт сборки только в виде zip-файла вместо копирования в каталог - PullRequest
0 голосов
/ 17 апреля 2020

В соответствии с этими инструкциями Я создаю проект devops, интегрирующий CI / CD для Linux веб-приложения.

Вот мое первоначальное задание Pipelines / buildlines

trigger:
- master

pool:
  vmImage: 'ubuntu-latest'

steps:
- task: NodeTool@0
  inputs:
    versionSpec: '12.x'
  displayName: 'Install Node.js'

- script: |
    npm install -g @angular/cli
    npm install
    npm run build:ssr
  displayName: 'npm install and build'

- task: CopyFiles@2
  inputs:
    Contents: |
      dist/** 
      node_modules/**
      package.json
    TargetFolder: '$(Build.ArtifactStagingDirectory)'
    CleanTargetFolder: true
    OverWrite: true

- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)'
    ArtifactName: 'drop'
    publishLocation: 'Container'

Когда из-за задачи CopyFiles@2 существует 65000 файлов, копируемых в каталог для публикации в следующей задаче PublishBuildArtifacts@1 ,

Из-за этого я подумал, что могу добавить задачу Artifact после задачи копирования, и это приведет к созданию файла .zip и сделает развертывание более эффективным и во много раз быстрее.

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

Async Command Start: Upload Artifact
Uploading 65244 files
Total file: 65244 ---- Processed file: 69 (0%)
Total file: 65244 ---- Processed file: 200 (0%)
Total file: 65244 ---- Processed file: 333 (0%)
Total file: 65244 ---- Processed file: 460 (0%)
Total file: 65244 ---- Processed file: 603 (0%)
Total file: 65244 ---- Processed file: 746 (1%)
Total file: 65244 ---- Processed file: 884 (1%)
Total file: 65244 ---- Processed file: 1026 (1%)
Total file: 65244 ---- Processed file: 1142 (1%)
Total file: 65244 ---- Processed file: 1268 (1%)
Total file: 65244 ---- Processed file: 1365 (2%)
Total file: 65244 ---- Processed file: 1509 (2%)
Total file: 65244 ---- Processed file: 1672 (2%)
Total file: 65244 ---- Processed file: 1839 (2%)
Total file: 65244 ---- Processed file: 1993 (3%)
Total file: 65244 ---- Processed file: 2188 (3%)
Total file: 65244 ---- Processed file: 2362 (3%)
Total file: 65244 ---- Processed file: 2540 (3%)
Total file: 65244 ---- Processed file: 2701 (4%)
Total file: 65244 ---- Processed file: 2854 (4%)
Total file: 65244 ---- Processed file: 3051 (4%)
Total file: 65244 ---- Processed file: 3256 (4%)
Total file: 65244 ---- Processed file: 3459 (5%)
Total file: 65244 ---- Processed file: 3656 (5%)
Total file: 65244 ---- Processed file: 3836 (5%)
Total file: 65244 ---- Processed file: 4025 (6%)
Total file: 65244 ---- Processed file: 4196 (6%)
Total file: 65244 ---- Processed file: 4385 (6%)
Total file: 65244 ---- Processed file: 4545 (6%)
Total file: 65244 ---- Processed file: 4694 (7%)
Total file: 65244 ---- Processed file: 4864 (7%)
Total file: 65244 ---- Processed file: 5044 (7%)
Total file: 65244 ---- Processed file: 5253 (8%)
Total file: 65244 ---- Processed file: 5422 (8%)
Total file: 65244 ---- Processed file: 5620 (8%)

Есть ли способ сделать то, что я ищу? Должен ли я не копировать и затем zip, а просто zip? Это потому, что это путь Linux против пути Windows.

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

Вот задача для Deploy Azure App Service задачи

steps:
- task: AzureRmWebAppDeployment@4
  displayName: 'Deploy Azure App Service'
  inputs:
    azureSubscription: '$(Parameters.ConnectedServiceName)'
    appType: '$(Parameters.WebAppKind)'
    WebAppName: '$(Parameters.WebAppName)'
    packageForLinux: '$(System.DefaultWorkingDirectory)/**/**/*.zip'
    RuntimeStack: 'NODE|12-lts'
    StartupCommand: '$(Parameters.StartupCommand)'

1 Ответ

1 голос
/ 17 апреля 2020

Да, вы можете архивировать указанную папку c в архив zip, 7z или tar. Тогда вы можете опубликовать sh только архив как артефакт из конвейера. Вот пример архивирования содержимого dist, node_modules и package.json в zip-файл и последующей публикации его в качестве артефакта.

Важный бит здесь replaceExistingArchive: false в задачах архивирования, это добавит каждую папку / файл в архив. Единственное исключение - если вы архивируете в сжатый файл TAR, они всегда полностью заменяются. ( Источник )

Также задача Артефакт просто публикует файлы, чтобы они были недоступны вне конвейера, но не сжимает их в архив.

steps:
- task: ArchiveFiles@2
  displayName: 'Archive Dist Folder'
  inputs:
    rootFolderOrFile: 'dist'
    includeRootFolder: false
    archiveFile: '$(Build.ArtifactStagingDirectory)/archive.zip'
    replaceExistingArchive: false
- task: ArchiveFiles@2
  displayName: 'Archive node_modules Folder'
  inputs:
    rootFolderOrFile: 'node_modules'
    includeRootFolder: false
    archiveFile: '$(Build.ArtifactStagingDirectory)/archive.zip'
    replaceExistingArchive: false
- task: ArchiveFiles@2
  displayName: 'Archive package.json File'
  inputs:
    rootFolderOrFile: 'package.json'
    includeRootFolder: false
    archiveFile: '$(Build.ArtifactStagingDirectory)/archive.zip'
    replaceExistingArchive: false
- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)/archive.zip'
    ArtifactName: 'drop'
    publishLocation: 'Container'

Я хотел обновить этот ответ, чтобы включить мое окончательное решение, которое работало с 17.04.2020. Помните, что в облачном пространстве все постоянно меняется, но на данный момент это полное решение.

  1. Вот мои шаги сборки конвейера:
steps:
- task: NodeTool@0
  inputs:
    versionSpec: '12.x'
  displayName: 'Install Node.js'

- script: |
    npm install -g @angular/cli
    npm install
    npm run build:ssr
  displayName: 'npm install and build'

- task: ArchiveFiles@2
  displayName: 'Archive dist Folder'
  inputs:
    rootFolderOrFile: 'dist'
    includeRootFolder: true
    archiveType: 'zip'
    archiveFile: '$(Build.ArtifactStagingDirectory)/archive.zip'
    replaceExistingArchive: false

- task: ArchiveFiles@2
  displayName: 'Archive node_modules Folder'
  inputs:
    rootFolderOrFile: 'node_modules'
    includeRootFolder: true
    archiveType: 'zip'
    archiveFile: '$(Build.ArtifactStagingDirectory)/archive.zip'
    replaceExistingArchive: false

- task: ArchiveFiles@2
  displayName: 'Archive package.json File'
  inputs:
    rootFolderOrFile: 'package.json'
    includeRootFolder: false
    archiveType: 'zip'
    archiveFile: '$(Build.ArtifactStagingDirectory)/archive.zip'
    replaceExistingArchive: false

- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)/archive.zip'
    ArtifactName: 'drop'
    publishLocation: 'Container'
Вот мой шаг развертывания в части Releases конвейера при использовании задачи Deploy Azure App Service.
steps:
- task: AzureRmWebAppDeployment@4
  displayName: 'Deploy Azure App Service'
  inputs:
    azureSubscription: '$(Parameters.ConnectedServiceName)'
    appType: '$(Parameters.WebAppKind)'
    WebAppName: '$(Parameters.WebAppName)'
    packageForLinux: '$(System.DefaultWorkingDirectory)/**/**/*.zip'
    RuntimeStack: 'NODE|12-lts'
    StartupCommand: '$(Parameters.StartupCommand)'

По какой-то причине yaml говорит, что у меня много неопределенных системных переменных, но это не так, потому что A. это работает и B. Я полагаю, что это из вашей подписки и из серверная система.

Наконец, убедитесь, что вы создали правильную команду запуска PM2 для вашего сервера express или универсальной реализации сервера приложений angular. Это можно найти на портале azure npm run serve:ssr

Не забудьте использовать npm run для Linux серверов, поскольку Microsoft Windows использует запуск узла

...