教程:使用 Jenkins 和 Azure CLI 将应用部署到 Azure Spring Apps

注释

Azure Spring Apps 是 Azure Spring Cloud 服务的新名称。 尽管该服务具有新名称,但在一些位置可以看到旧名称,因为我们的工作是更新资产,如屏幕截图、视频和图表。

Azure Spring Apps 是一种完全托管的微服务开发,具有内置服务发现和配置管理。 借助该服务,可以轻松地将基于 Spring Boot 的微服务应用程序部署到 Azure。 本教程演示如何在 Jenkins 中使用 Azure CLI 自动实现 Azure Spring Apps 的持续集成和交付(CI/CD)。

在本教程中,你将完成以下任务:

  • 预配服务实例并启动 Java Spring 应用程序
  • 准备 Jenkins 服务器
  • 在 Jenkins 管道中使用 Azure CLI 生成和部署微服务应用程序

先决条件

  • Azure 订阅:如果没有 Azure 订阅,请在开始之前创建 一个免费帐户

预配服务实例并启动 Java Spring 应用程序

我们使用 Piggy Metrics 作为示例Microsoft服务应用程序,并遵循快速入门中的相同步骤 :使用 Azure CLI 启动 Java Spring 应用程序 来预配服务实例并设置应用程序。 如果已完成相同的过程,可以跳到下一部分。 否则,将包含以下 Azure CLI 命令。 请参阅 快速入门:使用 Azure CLI 启动 Java Spring 应用程序 以获取详细信息。

本地计算机需要满足与 Jenkins 生成服务器相同的先决条件。 请确保安装以下内容以生成和部署微服务应用程序:

  1. 安装 Azure Spring Apps 扩展:

    az extension add --name spring
    
  2. 创建资源组以包含 Azure Spring Apps 服务:

    az group create --location eastus --name <resource group name>
    
  3. 预配 Azure Spring Apps 的实例:

    az spring create -n <service name> -g <resource group name>
    
  4. Piggy 指标 存储库分叉到你自己的 GitHub 帐户。 在本地,将你的存储库克隆到名为 source-code 的目录中:

    mkdir source-code
    git clone https://github.com/<your GitHub id>/piggymetrics
    
  5. 请设置您的配置服务器。 请确保将 GitHub ID< 替换为>正确的值。

    az spring config-server git set -n <your-service-name> --uri https://github.com/<your GitHub id>/piggymetrics --label config
    
  6. 生成项目:

    cd piggymetrics
    mvn clean package -D skipTests
    
  7. 创建三个微服务:网关身份验证服务和帐户服务

    az spring app create --n gateway -s <service name> -g <resource group name>
    az spring app create --n auth-service -s <service name> -g <resource group name>
    az spring app create --n account-service -s <service name> -g <resource group name>
    
  8. 部署应用程序:

    az spring app deploy -n gateway -s <service name> -g <resource group name> --jar-path ./gateway/target/gateway.jar
    az spring app deploy -n account-service -s <service name> -g <resource group name> --jar-path ./account-service/target/account-service.jar
    az spring app deploy -n auth-service -s <service name> -g <resource group name> --jar-path ./auth-service/target/auth-service.jar
    
  9. 为网关分配公共端点:

    az spring app update -n gateway -s <service name> -g <resource group name> --is-public true
    
  10. 查询网关应用程序以获取 URL,以便可以验证应用程序是否正在运行。

    az spring app show --name gateway | grep url
    
  11. 导航到上一命令提供的 URL 以运行 PiggyMetrics 应用程序。

准备 Jenkins 服务器

在本部分中,你将准备 Jenkins 服务器以运行构建,这适合用于测试。 但是,出于安全影响,应使用 Azure VM 代理Azure 容器代理 来启动 Azure 中的代理来运行生成。

安装插件

  1. 登录到 Jenkins 服务器。

  2. 选择“ 管理 Jenkins”。

  3. 选择“ 管理插件”。

  4. “可用 ”选项卡上,选择以下插件:

    如果这些插件未显示在列表中,请检查 “已安装 ”选项卡以查看它们是否已安装。

  5. 若要安装插件,请选择“ 立即下载”,并在重启后安装

  6. 重启 Jenkins 服务器以完成安装。

在 Jenkins 凭据存储中添加 Azure 服务主体凭据

  1. 需要一个 Azure 服务主体才能部署到 Azure。 有关详细信息,请参阅“部署到 Azure 应用服务”教程中的 “创建服务主体 ”部分。 输出 az ad sp create-for-rbac 如下所示:

    {
        "appId": "xxxxxx-xxx-xxxx-xxx-xxxxxxxxxxxx",
        "displayName": "xxxxxxxjenkinssp",
        "name": "http://xxxxxxxjenkinssp",
        "password": "xxxxxx-xxx-xxxx-xxx-xxxxxxxxxxxx",
        "tenant": "xxxxxx--xxx-xxxx-xxx-xxxxxxxxxxxx"
    }
    
  2. 在 Jenkins 仪表盘上,选择“凭据”>“系统”。 然后选择“全局凭据”(不受限制)。

  3. 选择“添加凭据”。

  4. 选择 Microsoft Azure 服务主体 作为类型。

  5. 提供以下字段的值:

    • 订阅 ID:Azure 订阅 ID
    • 客户端 ID:服务主体 appid
    • 客户端密码:服务主体密码
    • 租户 ID:Microsoft 账户租户 ID
    • Azure 环境:为环境选择适当的值。 例如,将 Azure 用于 Azure Global
    • ID:设置为 azure_service_principal. 本文后面将使用此 ID
    • 说明:此值是可选的,但建议从文档/维护的角度来看。

安装 Maven 和 Azure CLI Spring 扩展

示例管道使用 Maven 构建,并使用 Azure CLI 部署到服务实例。 安装 Jenkins 后,它会创建名为 jenkins 的管理员帐户。 确保用户 jenkins 有权运行 spring 扩展。

  1. 通过 SSH 连接到 Jenkins 控制器。

  2. 安装 Maven。

    sudo apt-get install maven
    
  3. 输入 az version验证是否已安装 Azure CLI。 如果未安装 Azure CLI,请参阅 安装 Azure CLI

  4. 切换至 jenkins 用户:

    sudo su jenkins
    
  5. 安装 Spring 扩展:

    az extension add --name spring
    

创建 Jenkinsfile

  1. 在自己的存储库 - https://github.com/your_github_id/piggymetrics - 在根目录中创建 Jenkinsfile

  2. 按如下所示更新文件。 请确保替换资源组名称和<服务名称><的值。> 如果在 Jenkins 中添加凭据时使用不同的值,请将 azure_service_principal 替换为正确的 ID。

        node {
          stage('init') {
            checkout scm
          }
          stage('build') {
            sh 'mvn clean package'
          }
          stage('deploy') {
            withCredentials([azureServicePrincipal('azure_service_principal')]) {
              // Log in to Azure
              sh '''
                az login --service-principal -u $AZURE_CLIENT_ID -p $AZURE_CLIENT_SECRET -t $AZURE_TENANT_ID
                az account set -s $AZURE_SUBSCRIPTION_ID
              '''  
              // Set default resource group name and service name. Replace <resource group name> and <service name> with the right values
              sh 'az config set defaults.group=<resource group name>'
              sh 'az config set defaults.spring=<service name>'
    
              // Deploy applications
              sh 'az spring app deploy -n gateway --jar-path ./gateway/target/gateway.jar'
              sh 'az spring app deploy -n account-service --jar-path ./account-service/target/account-service.jar'
              sh 'az spring app deploy -n auth-service --jar-path ./auth-service/target/auth-service.jar'
              sh 'az logout'
            }
          }
        }
    
  3. 保存并提交更改。

创建任务

  1. 在 Jenkins 仪表板上,选择“ 新建项”。

  2. 提供名称 Deploy-PiggyMetrics 给作业,并选择 Pipeline。 单击“确定”。

  3. 选择 “管道 ”选项卡。

  4. 对于 定义请从 SCM 中选择管道脚本

  5. 对于 SCM,请选择 “Git”。

  6. 输入分叉存储库的 GitHub URL: https://github.com/&lt;your GitHub id&gt;/piggymetrics.git

  7. 对于分支说明符(黑色表示“any”),请选择/Azure

  8. 对于 脚本路径,请选择 Jenkinsfile

  9. 选择“保存

验证并运行作业

在运行作业之前,请编辑登录输入框中的文本以 输入登录 ID

  1. 在您的存储库中,打开 index.html 中的 /gateway/src/main/resources/static/

  2. 搜索 enter your login 并将其更新为 enter login ID

    <input class="frontforms" id="frontloginform" name="username" placeholder="enter login ID" type="text" autocomplete="off"/>
    
  3. 保存并提交更改。

  4. 在 Jenkins 中手动运行作业。 在 Jenkins 仪表板上,选择作业 Deploy-PiggyMetrics ,然后选择“ 立即生成”。

作业完成后,导航到应用程序的公共 IP gateway ,并验证应用程序是否已更新。

更新了 Piggy 指标

清理资源

如果不再需要资源,请删除本文中创建的资源:

az group delete -y --no-wait -n <resource group name>

后续步骤