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

注意

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. 设置配置服务器。 请确保将 <your 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. 创建三项微服务:gatewayauth-serviceaccount-service

    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
    • 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. 按如下所示更新 文件。 请确保替换资源组名称和<>服务名称>的值。< 将 azure_service_principal 替换为正确的 ID(如果你在 Jenkins 中添加凭据时使用了其他值)。

        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 并选择“管道”。 单击“确定”。

  3. 选择“管道”选项卡

  4. 对于“Definition”(定义),选择“Pipeline script from SCM”(来自 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 ,并验证应用程序是否已更新。

Updated Piggy Metrics

清理资源

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

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

后续步骤