部署到环境中的 Linux VM

Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020

本快速入门介绍如何设置 Azure DevOps 管道,以便部署到环境中的多个 Linux 虚拟机(VM)资源。 可以将这些说明用于发布 Web 部署包的任何应用。

先决条件

对于 JavaScript 或Node.js应用, 至少有两个 Linux VM 在 Azure 上使用 Nginx 进行设置。

创建示例代码分支

如果 GitHub 中已有要部署的应用,则可以尝试为该代码创建管道。

如果你是新用户,请在 GitHub 中为此存储库创建分支:

https://github.com/MicrosoftDocs/pipelines-javascript

使用 Linux VM 创建环境

可以将 VM 添加为环境中的资源,并将其作为目标用于多 VM 部署。 环境的部署历史记录提供从 VM 到提交的可跟踪性。

添加 VM 资源

  1. 在 Azure DevOps 项目中,转到 Pipelines>环境,然后选择“创建环境”或新建环境”。

  2. 在第一个“新建环境”屏幕上,添加名称和可选说明

  3. 在“资源”下,选择“虚拟机”,然后选择“下一步”。

  4. 在下一个“新建环境”屏幕上,选择操作系统下的 Linux。

  5. 复制 Linux 注册脚本。 对于添加到环境的所有 Linux VM,该脚本是相同的。

    屏幕截图显示 VM 创建。

    注意

    已登录用户的个人访问令牌(PAT)在脚本中预插入,并在三小时后过期。

  6. 选择“关闭,并记下新环境已创建。

  7. 在要向环境注册的每个目标 VM 上运行复制的脚本。

    注意

    如果 VM 上已运行另一个代理,请为代理提供唯一名称以向环境注册。

注册 VM 后,它会显示为环境“ 资源 ”选项卡下的资源。

屏幕截图显示 VM 资源视图。

若要再次复制脚本以创建更多资源,例如,如果 PAT 过期,请选择 环境页面上的“添加资源 ”。

添加和管理标记

标记是针对部署环境中特定 VM 集的一种方法。 可以使用的标记数量没有限制。 每个标记限制为 256 个字符。

可以通过为 VM 资源选择“更多操作”,在交互式注册脚本中或通过 UI 为 VM 添加标记或删除标记。 对于本快速入门,请将不同的标记分配给环境中的每个 VM。

屏幕截图显示标记视图。

定义 CI 生成管道

需要一个持续集成(CI)生成管道来发布 Web 应用,以及要在 Linux 服务器上本地运行的部署脚本。 根据要使用的运行时设置 CI 生成管道。

重要

在 GitHub 过程中,系统可能会提示你创建 GitHub 服务连接 或重定向到 GitHub 以登录、安装 Azure Pipelines 或授权 Azure Pipelines。 按照屏幕上的说明完成该过程。 有关详细信息,请参阅 访问 GitHub 存储库

  1. 在 Azure DevOps 项目中,选择“管道>创建管道”,然后选择 GitHub 作为源代码的位置。
  2. “选择存储库 ”屏幕上,选择分叉示例存储库。
  3. 在“配置管道”屏幕上,选择“入门管道”。 Azure Pipelines 为管道生成名为azure-pipelines.ymlYAML 文件。
  4. 选择“保存并运行”旁边的下拉列表插入符号,选择“保存”,然后再次选择“保存”。 该文件将保存到分支 GitHub 存储库。

编辑代码

选择“编辑”,并将azure-pipelines.yml文件的内容替换为以下代码。 以后的步骤将添加到此 YAML。

以下代码使用 npm 生成Node.js项目。

    trigger:
    - main
    
    pool:
      vmImage: ubuntu-latest
    
    stages:
    - stage: Build
      displayName: Build stage
      jobs:  
      - job: Build
        displayName: Build
        steps:
        - task: UseNode@1
          inputs:
            version: '16.x'
          displayName: 'Install Node.js'
        - script: |
            npm install
            npm run build --if-present
            npm run test --if-present
          displayName: 'npm install, build and test'
        - task: ArchiveFiles@2
          displayName: 'Archive files'
          inputs:
            rootFolderOrFile: '$(System.DefaultWorkingDirectory)'
            includeRootFolder: false
            archiveType: zip
            archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
            replaceExistingArchive: true
        - upload: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
          artifact: drop

有关详细信息,请查看使用 gulp 生成 Node.js 应用中的步骤来创建生成。

运行管道

选择“ 验证并保存”,然后选择“ 保存”,选择“ 运行”,然后再次选择“ 运行 ”。

管道运行后,验证作业是否成功运行,以及是否看到已发布的工件。

部署到 Linux VM

  1. 编辑管道以添加以下 部署作业。 替换为 <environment name> 之前创建的环境的名称。 通过指定 <VM tag> 为每个 VM 定义的部署,从环境中选择特定的 VM 来接收部署。

    jobs:  
    - deployment: VMDeploy
      displayName: Web deploy
      environment:
        name:  <environment name>
        resourceType: VirtualMachine
        tags: <VM tag> # Update value for VMs to deploy to
      strategy:
    

    有关详细信息,请参阅完整的 jobs.deployment 定义

    有关部署作业所针对的关键字和资源的详细信息 environment ,请参阅 jobs.deployment.environment 定义

  2. 指定或runOncerolling指定为部署strategy

    • runOnce 是最简单的部署策略。 每个preDeploydeploy执行一次,routeTraffic生命周期postRouteTraffic挂钩。 然后执行或 on: success on: failure 执行。

      以下代码显示了用于以下对象的 runOnce部署作业:

      jobs:
      - deployment: VMDeploy
        displayName: Web deploy
        environment:
          name: <environment name>
          resourceType: VirtualMachine
          tags: <VM tag>
        strategy:
          runOnce:
            deploy:
              steps:
              - script: echo my first deployment
      
    • 以下代码演示使用 Java 管道部署策略的 rolling YAML 代码片段。 每次迭代最多可以更新五个目标。 该 maxParallel 参数指定可并行部署到的目标数。

      所选 maxParallel 内容包含必须随时保持可用目标的绝对数或百分比,不包括要部署到的目标,并确定部署期间的成功和失败情况。

      jobs: 
      - deployment: VMDeploy
        displayName: web
        environment:
          name: <environment name>
          resourceType: VirtualMachine
          tags: <VM tag>
        strategy:
            rolling:
              maxParallel: 2  #for percentages, mention as x%
              preDeploy:
                steps:
                - download: current
                  artifact: drop
                - script: echo initialize, cleanup, backup, install certs
              deploy:
                steps:
                - task: Bash@3
                  inputs:
                    targetType: 'inline'
                    script: |
                      # Modify deployment script based on the app type
                      echo "Starting deployment script run"
                      sudo java -jar '$(Pipeline.Workspace)/drop/**/target/*.jar'
              routeTraffic:
                steps:
                - script: echo routing traffic
              postRouteTraffic:
                steps:
                - script: echo health check post-route traffic
              on:
                failure:
                  steps:
                  - script: echo Restore from backup! This is on failure
                success:
                  steps:
                  - script: echo Notify! This is on success
      

      每次运行此作业时,都会根据创建和注册 VM 的环境记录部署历史记录。

在环境中访问管道可追溯性

环境 部署 视图提供提交和工作项的完整可跟踪性,以及环境的跨管道部署历史记录。

屏幕截图显示了部署视图。