练习 - 部署示例 Spring Boot 应用程序

已完成

在此练习中,你将使用自动化工作流来生成并部署 Spring Boot 示例应用程序。

设置一个 GitHub 操作来部署示例应用程序

现在,你已预配了 Azure 资源,可以部署示例 Spring Boot 应用程序了。

为了创建 Maven GitHub 工作流,你将使用 Azure 应用服务门户的部署中心提供的内置持续集成和持续交付 (CI/CD) 向导工具。

Screenshot of the Azure App Service Deployment Center.

Azure 应用服务部署中心自动生成基于应用程序堆栈的 GitHub Actions 工作流文件。 然后,部署中心将该文件提交到正确目录中的 GitHub 存储库。 部署中心还会将你的 GitHub 操作链接到 Azure 应用服务发布配置文件。

  1. 在 Azure 门户中,转到你的 Azure 应用服务 Web 应用。

  2. 在左侧窗格上,展开“部署”,选择“部署中心”。

  3. 在“源”下拉列表中的“持续部署(CI/CD)”下,选择“GitHub”。

  4. 选择“GitHub Actions”。 (这应该是默认值,但如果不是,请选择“更改提供程序”以加载提供程序选项。)

  5. 在“设置”下的下拉列表中,执行以下操作:

    a. 选择你的 GitHub 存储库。
    b. 对于“分支”,请选择“main”。
    c. 对于“应用程序堆栈”,请选择“JAVA 8”。

  6. 在最后一页上,检查所做的选择,并预览将提交到存储库的工作流文件。

  7. 选择“保存”,将工作流文件提交到存储库,然后立即开始生成并部署你的应用。

    注意

    通过选择“操作”选项卡,然后选择“生成并部署”工作流和“重新运行作业”,也可触发你的存储库中的 GitHub Actions 工作流。

确认 GitHub Actions 生成

  1. 在 GitHub 存储库中,选择“操作”选项卡,然后在左侧的“所有工作流”下,选择“生成 JAR 应用并部署到 Azure Web 应用”。

  2. 接下来,在右侧表的“工作流运行”下,选择工作流运行“添加或更新应用服务部署工作流配置”。

  3. 等待工作流运行完成,然后在工作流运行的部署作业下,复制显示 Azure Web 应用 URL 的部署作业中的 URL。

  4. 最后,在浏览器中打开 URL,并验证 Java 应用程序已部署、已连接到 MySQL 数据库并返回数据。

后续步骤

祝贺你! 现在,你有了两个 GitHub Actions 工作流:一个预配操作,一个“生成并部署”操作。

每次你输入 git push 命令来提交代码时,都会触发“生成并部署”操作,然后系统就会部署你的应用程序。

重要

如果资源已经存在,则重新运行 GitHub 操作的预配不会重新创建资源。 你需要手动删除资源组或资源,然后重新运行 GitHub 操作。

重新运行“生成并部署”GitHub 操作会替换你的应用程序。

如果重新创建应用服务实例,则还需改为使用新的发布配置文件。 只需要更改以下行:

publish-profile: ${{ secrets.AzureAppService_PublishProfile_c1ee8d191003493b9c9e13a9b78ad2c3 }}

设置 Azure 管道以部署示例应用程序

与之前一样,你需要创建一个 Azure 管道来生成并部署你的应用程序。

在 Azure DevOps 中,转到“Project”,依次选择“Pipelines”和“New Pipeline”(右上角)。

现在将为你提供 4 个选项卡来设置管道:

  1. 在“连接”选项卡上,选择“GitHub”(YAML 文件)。
  2. 在“选择”选项卡上,选择包含模板的 GitHub 存储库。
  3. 在“配置”选项卡上,选择以使用“现有的 Azure Pipelines YAML 文件”。
  4. 在路径中,这次选择“/azuredevops/build_deploy.yml”
  5. 选择“继续”以转到“查看”选项卡,在运行管道前查看管道。

在“查看管道 YAML”屏幕上,检查要用于创建管道的 YAML 文件:

name: Build and Deploy

trigger:
- main

stages:

# Build your Spring Boot App using Maven
- stage: Build
  displayName: Build stage
  jobs:
  - job: MavenPackageAndPublishArtifacts
    displayName: Maven Package and Publish Artifacts
    pool:
      vmImage: 'ubuntu-latest'

    steps:
    - task: Maven@3
      displayName: 'Maven Package'
      inputs:
        mavenPomFile: 'pom.xml'

    - task: CopyFiles@2
      displayName: 'Copy Files to artifact staging directory'
      inputs:
        SourceFolder: '$(System.DefaultWorkingDirectory)'
        Contents: '**/target/*.?(war|jar)'
        TargetFolder: $(Build.ArtifactStagingDirectory)

    - upload: $(Build.ArtifactStagingDirectory)
      artifact: drop

# Deploy to Azure using the AzureWebApp task using your Service Connection
- stage: Deploy
  displayName: Deploy stage
  dependsOn: Build
  condition: succeeded()
  jobs:
  - deployment: DeployLinuxWebApp
    displayName: Deploy Linux Web App
    environment: 'production'
    pool:
      vmImage: 'ubuntu-latest'
    strategy:
      runOnce:
        deploy:
          steps:
          - task: AzureWebApp@1
            displayName: 'Azure Web App Deploy'
            inputs:
              azureSubscription: $(serviceConnection)
              appType: webAppLinux
              appName: '$(webAppName)'
              package: '$(Pipeline.Workspace)/drop/**/target/*.?(war|jar)'

让我们来看看我们在“Build”配置中使用的一些字段:

  • azureSubscription:你的 Azure 订阅
  • appType:你的 Web 应用类型
  • appName:现有应用服务的名称
  • package:包的文件路径或包含应用服务内容的文件夹

添加生成变量

对于我们的预配管道,在保存并运行生成和部署管道之前,你需要添加管道变量:

  1. 选择顶部的“Variables”。
  2. 添加一个名为“serviceConnection”的变量,其值作为服务连接的名称。
  3. 选择右下角的“确定”以保存变量。
  4. 通过应用服务名称(在 Terraform 变量“application_name”中定义的相同值)添加第二个名为“webAppName”的变量。
  5. 选择“确定”以保存变量。
  6. 在右下角选择“保存”以保存这两个变量。

Screenshot displaying the new variables.

监视管道运行

  1. 选择 && 以保存并运行管道
  2. 正如你对预配管道所做的那样,跟踪生成过程的每个阶段和步骤。
  3. 请验证你的 Java 应用程序已部署,已连接到 MySQL 数据库并返回数据。

Screenshot displaying the new Azure Pipeline run.

后续步骤

祝贺你! 现在有两个 Azure 管道工作流:预配管道和“生成并部署”管道。

每次你输入 git push 命令将代码提交到主分支时,都会触发“生成并部署”管道,然后系统就会部署你的应用程序。

重要

如果资源已经存在,则重新运行预配管道不会重新创建资源。 你需要手动删除资源组或资源,然后重新运行管道。 若要详细了解如何在生产中更好地实现这一点,可参阅“摘要”部分。

重新运行“生成并部署”管道会替换你的应用程序。

下一单元是知识检查,看看你在本模块中学会了哪些知识。