首页 > 解决方案 > 将 Azure DevOps CI/CD 用于 Linux Web 应用程序时,如何仅将构建工件压缩并发布为 zip 文件,而不是复制到目录

问题描述

根据这些说明,我正在为 Linux Web 应用程序创建集成 CI/CD 的 devops 项目。

这是我最初的 Pipelines 管道/构建工作

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%)

有没有办法做我正在寻找的东西?我不应该复制然后压缩,而只是压缩吗?这是因为它是 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)'

标签: azureazure-devopsazure-pipelinesazure-web-app-serviceazure-webapps

解决方案


是的,您可以将特定文件夹归档为 zip、7z 或 tar 归档文件。然后,您只能将存档作为管道中的工件发布。dist这是一个将、node_modules和内容归档package.json到 zip 然后将其作为工件发布的示例。

这里的重要一点是replaceExistingArchive: false存档任务,这会将每个文件夹/文件添加到存档中。一个例外是,如果您归档到压缩的 TAR 文件,这些文件总是会被完全替换。(来源

此外,Artifact 任务只是发布文件,因此它们可以在管道之外访问,它不会将它们压缩到存档中。

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'

我想更新这个答案,以包括我在 2020 年 4 月 17 日有效的最终解决方案。请记住,云空间中的事情总是在变化,但到目前为止,这是一个完整的解决方案。

  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'
  1. 这是我在使用任务时在管道的 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. 我相信这来自您的订阅和服务器系统。

最后确保为您的快速服务器或通用 Angular 应用程序服务器实现创建正确的 PM2 启动命令。这可以在 azure 门户中找到 npm run serve:ssr

请记住,使用 npm run 是针对 Linux 服务器的,因为 Microsoft Windows 使用 node run


推荐阅读