教程:将 Java 应用部署到虚拟机规模集

Azure DevOps Services

利用虚拟机规模集,你可以部署和管理相同的自动缩放虚拟机。

可以根据需要在规模集中创建 VM。 可以定义规则来控制如何以及何时在规模集中添加或删除 VM。 这些规则基于 CPU 负载、内存用量或网络流量等指标触发。

在本教程中,你将生成一个 Java 应用并将其部署到虚拟机规模集。 你将学习如何执行以下操作:

  • 创建虚拟机规模集
  • 生成计算机映像
  • 将自定义映像部署到虚拟机规模集

先决条件

开始前,需要具备:

设置 Java 管道

  1. 登录到你的 Azure DevOps 组织,并转到你的项目。

  2. 转到“管道”,然后选择“新建管道”或是“创建管道”(如果是首次创建管道)。

  3. 完成向导中的各个步骤。首先选择“GitHub”作为源代码位置。

  4. 可能会重定向到 GitHub 进行登录。 如果是这样,请输入 GitHub 凭据。

  5. 看到存储库列表时,请选择你的存储库。

  6. 你可能会被重定向到 GitHub 来安装 Azure Pipelines 应用。 如果是,请选择“批准并安装”。

出现“配置”选项卡时,选择“Maven”。

自定义管道

  1. 当新管道出现时,请查看 YAML 以了解其功能。 准备就绪后,选择“保存并运行”。

    Save and run button in a new YAML pipeline

  2. 系统会提示你将新的 azure-pipelines.yml 文件提交到存储库。 对消息感到满意后,再次选择“保存并运行”。

    如果你要观察管道的运行情况,请选择生成作业。

    你刚刚创建并运行了我们为你自动创建的管道,因为你的代码看起来与 Maven 模板非常匹配。

    现在你的存储库中已经有一个正常工作的 YAML 管道 (azure-pipelines.yml),你可以对其进行自定义了!

  3. 准备好更改管道后,请在“管道”页面中选择它,然后选择“编辑”来编辑 azure-pipelines.yml 文件。

添加“复制文件”和“发布生成工件”任务

  1. 更新管道以包括 CopyFiles@2 任务。 这将创建一个可以部署到虚拟机规模集的工件。

      trigger: none
    
      pool:
        vmImage: 'ubuntu-latest'
    
      steps:
    - task: Maven@4
      inputs:
        mavenPomFile: 'pom.xml'
        mavenOptions: '-Xmx3072m'
        javaHomeOption: 'JDKVersion'
        jdkVersionOption: '1.8'
        jdkArchitectureOption: 'x64'
        publishJUnitResults: true
        testResultsFiles: '**/surefire-reports/TEST-*.xml'
        goals: 'package'
    
    - task: CopyFiles@2
      displayName: 'Copy File to: $(TargetFolder)'
      inputs:
        SourceFolder: '$(Build.SourcesDirectory)'
        Contents: |
          **/*.sh 
          **/*.war
          **/*jar-with-dependencies.jar
        TargetFolder: '$(System.DefaultWorkingDirectory)/pipeline-artifacts/'
        flattenFolders: true  
    

创建自定义映像并将其上传到 Azure

自定义映像需要资源组、存储帐户和共享映像库。

  1. 使用 az group create 创建资源组。 此示例在“eastus2”位置创建一个名为 myVMSSResourceGroup 的资源组:

    az group create --name myVMSSResourceGroup --location eastus2
    
  2. 新建存储帐户。 此示例创建存储帐户 vmssstorageaccount

    az storage account create \
      --name vmssstorageaccount \
      --resource-group myVMSSResourceGroup \
      --location eastus2 \
      --sku Standard_LRS 
    
  3. 创建共享映像库

    az sig create --resource-group myVMSSResourceGroup --gallery-name myVMSSGallery
    
  4. myVMSSGallery 资源中创建新的映像库。 若要详细了解如何使用映像库,请参阅使用门户创建 Azure 共享映像库

    az sig create --resource-group myVMSSResourceGroup --gallery-name myVMSSGallery
    
  5. 创建映像定义。 复制看起来像 /subscriptions/<SUBSCRIPTION ID>/resourceGroups/<RESOURCE GROUP>/providers/Microsoft.Compute/galleries/myVMSSGallery/images/MyImage 的新映像的 id

    az sig image-definition create -g myVMSSResourceGroup --gallery-name myVMSSGallery --gallery-image-definition MyImage --publisher GreatPublisher --offer GreatOffer --sku GreatSku --os-type linux
    

创建托管标识

  1. 在资源组中创建托管标识

    az identity create -g myVMSSResourceGroup -n myVMSSIdentity
    
  2. 从输出中复制 idid 看起来像 /subscriptions/<SUBSCRIPTION ID>/resourcegroups/<RESOURCE GROUP>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<USER ASSIGNED IDENTITY NAME>

  3. 在库中打开你的映像库并为 myVMSSIdentity 分配“参与者”角色。 执行这些添加角色分配的步骤

创建自定义映像

若要创建自定义映像,可以使用 Azure VM 映像生成器 DevOps 任务

  1. AzureImageBuilderTask@1 任务添加到 YAML 文件。 用你自己的值替换 <SUBSCRIPTION ID><RESOURCE GROUP><USER ASSIGNED IDENTITY NAME> 的值。 请确保验证 galleryImageIdmanagedIdentitystorageAccountName 的值是否准确。

    - task: AzureImageBuilderTask@1
      displayName: 'Azure VM Image Builder Task'
      inputs:
        managedIdentity: '/subscriptions/<SUBSCRIPTION ID>/resourcegroups/<RESOURCE GROUP>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<USER ASSIGNED IDENTITY NAME>'
        imageSource: 'marketplace'
        packagePath: '$(System.DefaultWorkingDirectory)/pipeline-artifacts'
        inlineScript: |
          sudo mkdir /lib/buildArtifacts
          sudo cp  "/tmp/pipeline-artifacts.tar.gz" /lib/buildArtifacts/.
          cd /lib/buildArtifacts/.
          sudo tar -zxvf pipeline-artifacts.tar.gz
          sudo sh install.sh
        storageAccountName: 'vmssstorageaccount2'
        distributeType: 'sig'
        galleryImageId: '/subscriptions/<SUBSCRIPTION ID>/resourceGroups/<RESOURCE GROUP>/providers/Microsoft.Compute/galleries/myVMSSGallery/images/MyImage/versions/0.0.$(Build.BuildId)'
        replicationRegions: 'eastus2'
        ibSubscription: '<SUBSCRIPTION ID>'
        ibAzureResourceGroup: 'myVMSSResourceGroup'
        ibLocation: 'eastus2'
    
  2. 运行管道以生成第一个映像。 可能需要在管道运行期间授权资源

  3. 转到 Azure 门户中的新映像,然后打开“概述”。 选择“创建 VMSS”,从新映像创建新的虚拟机规模集。 将“虚拟机规模集名称”设置为 vmssScaleSet。 请参阅在 Azure 门户中创建虚拟机规模集,详细了解如何在 Azure 门户中创建虚拟机规模集。

将更新部署到虚拟机规模集

将 Azure CLI 任务添加到管道,以将更新部署到规模集。 在管道末尾添加任务。 将 <SUBSCRIPTION ID> 替换为订阅 ID。

- task: AzureCLI@2
  inputs:
    azureSubscription: '`YOUR_SUBSCRIPTION_ID`' #Authorize and in the task editor
    ScriptType: 'pscore'
    scriptLocation: 'inlineScript'
    Inline: 'az vmss update --resource-group myVMSSResourceGroup --name vmssScaleSet --set virtualMachineProfile.storageProfile.imageReference.id=/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myVMSSResourceGroup/providers/Microsoft.Compute/galleries/myVMSSGallery/images/MyImage/versions/0.0.$(Build.BuildId)'

清理资源

转到 Azure 门户并删除资源组 myVMSSResourceGroup

后续步骤