教程:使用 Jenkins 和 Azure CLI 部署到Azure App 服务

重要

许多 Azure 服务都有 Jenkins 插件。其中一些插件将从 2024 年 2 月 29 日开始不受支持。 当前推荐通过 Azure CLI 将 Jenkins 与 Azure 服务集成。 有关详细信息,请参阅适用于 Azure 的 Jenkins 插件一文。

若要将 Java Web 应用部署到 Azure,可以通过 Jenkins 管道使用 Azure CLI。 在本教程中,你将执行以下任务:

  • 创建 Jenkins VM
  • 配置 Jenkins
  • 在 Azure 中创建 Web 应用
  • 准备 GitHub 存储库
  • 创建 Jenkins 管道
  • 运行管道并验证 Web 应用

先决条件

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

配置 Jenkins

以下步骤演示如何在 Jenkins 控制器上安装必需的 Java JDK 和 Maven:

  1. 使用 SSH 登录 Jenkins 控制器。

  2. 从 apt-get 存储库下载并安装 Azul Zulu 版 OpenJDK for Azure:

    sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 0xB1998361219BD9C9
    sudo apt-add-repository "deb http://repos.azul.com/azure-only/zulu/apt stable main"
    sudo apt-get -q update
    sudo apt-get -y install zulu-8-azure-jdk
    
  3. 运行以下命令安装 Maven:

    sudo apt-get install -y maven
    

将 Azure 服务主体添加到 Jenkins 凭据

以下步骤演示如何指定 Azure 凭据:

  1. 请确保已安装凭据插件

  2. 在 Jenkins 仪表板中,选择“凭据 -> 系统 ”。>

  3. 选择“全局凭据(不受限制)”

  4. 选择“添加凭据”来添加 Microsoft Azure 服务主体。 确保凭据类型为“用户名和密码”,并输入以下项:

    • 用户名:服务主体 appId
    • 密码:服务主体 password
    • ID:凭据标识符(例如 AzureServicePrincipal

创建 Azure 应用服务以部署 Java Web 应用

使用 az appservice plan create 通过“免费”定价层创建 Azure 应用服务计划

az appservice plan create \
    --name <app_service_plan> \ 
    --resource-group <resource_group> \
    --sku FREE

要点

  • appservice 计划定义用于托管应用的物理资源。
  • 分配到应用服务计划的所有应用程序都会共享这些资源。
  • 通过应用服务计划,可在托管多个应用时节省成本。

创建 Azure Web 应用

使用 az webapp createmyAppServicePlan 应用服务计划中创建 Web 应用定义。

az webapp create \
    --name <app_name> \ 
    --resource-group <resource_group> \
    --plan <app_service_plan>

要点

  • Web 应用定义提供了一个用于访问应用程序的 URL,并配置了多个将代码部署到 Azure 的选项。
  • 将占位符 <app_name> 替换为唯一的应用名称。
  • 应用名称是 Web 应用的默认域名的一部分。 因此,该名称在 Azure 中的所有应用中必须是唯一的。
  • 可以先将任何自定义域名条目映射到 Web 应用,然后向用户公开该条目。

配置 Java

使用 az appservice web config update 为应用设置 Java 运行时配置:

az webapp config set \ 
    --name <app_name> \
    --resource-group <resource_group> \ 
    --java-version 1.8 \ 
    --java-container Tomcat \
    --java-container-version 8.0

准备 GitHub 存储库

  1. 打开适用于 Azure 的简单 Java Web 应用存储库。

  2. 若要将存储库分叉到自己的 GitHub 帐户,请选择“分叉”按钮

  3. 单击文件名打开 Jenkinsfile 文件

  4. 要编辑该文件,请选择铅笔图标。

  5. 更新订阅 ID 和租户 ID。

      withEnv(['AZURE_SUBSCRIPTION_ID=<subscription_id>',
            'AZURE_TENANT_ID=<tenant_id>']) 
    
  6. 分别更新第 22 行和第 23 行上的资源组和 Web 应用名称。

    def resourceGroup = '<resource_group>'
    def webAppName = '<app_name>'
    
  7. 更新 Jenkins 实例中的凭据 ID

    withCredentials([usernamePassword(credentialsId: '<service_princial>', passwordVariable: 'AZURE_CLIENT_SECRET', usernameVariable: 'AZURE_CLIENT_ID')]) {
    

创建 Jenkins 管道

执行以下操作创建 Jenkins 管道:

  1. 在 Web 浏览器中打开 Jenkins。

  2. 选择“新建项”。

  3. 输入作业的名称。

  4. 选择“管道”。

  5. 选择“确定”

  6. 选择“管道”。

  7. 对于“Definition”(定义),选择“Pipeline script from SCM”(来自 SCM 的管道脚本)

  8. 对于“SCM”,选择“Git”。

  9. 输入分叉存储库的 GitHub URL:https:\<forked_repo\>.git

  10. 选择 “保存”

测试管道

  1. 转到所创建的管道

  2. 选择“立即生成”

  3. 生成完成后,选择“控制台输出”以查看生成详细信息。

验证 Web 应用

执行以下操作,验证 WAR 文件是否已成功部署到 Web 应用:

  1. 浏览到以下 URL:http://&lt;app_name>.azurewebsites.net/api/calculator/ping

  2. 应看到类似于以下内容的文本:

    Welcome to Java Web App!!! This is updated!
    Today's date
    
  3. 浏览到以下 URL(将 x 和 y 替换为要求和的两个值):http://>< app_name.azurewebsites.net/api/calculator/add?x=<x>&y=<y>。<><>

    Example of running the demo add

部署到 Linux 上的 Azure 应用服务

应用服务也可以在 Linux 上为支持的应用堆栈本地托管 Web 应用。 它还可运行自定义 Linux 容器(也称为用于容器的 Web 应用。)

可修改脚本以部署到 Linux 上的 Azure 应用服务。 Linux 上的应用服务支持 Docker。 因此,你要提供一个 Dockerfile,用于将 Web 应用与服务运行时打包到 Docker 映像中。 该插件会生成映像、将映像推送到 Docker 注册表,并将映像部署到 Web 应用。

  1. 若要创建 Linux 上的 Azure 应用服务和 Azure 容器注册表,请参阅使用自定义容器将自定义软件迁移到 Azure 应用服务

        az group create --name myResourceGroup2 --location westus2
        az acr create --name myACRName --resource-group myResourceGroup2 --sku Basic --admin-enabled true
        az appservice plan create --name myAppServicePlan --resource-group  myResourceGroup2 --is-linux
        az webapp create --resource-group myResourceGroup2 --plan myAppServicePlan --name myApp --deployment-container-image-name myACRName.azurecr.io/calculator:latest
    
  2. 在 Jenkins 上安装 Docker

  3. 请确保已安装 Docker 管道插件

  4. 在同一个已分叉的适用于 Azure 的简单 Java Web 应用存储库中,编辑 Jenkinsfile2 文件,如下所示:

    1. 更新订阅 ID 和租户 ID。

       withEnv(['AZURE_SUBSCRIPTION_ID=<mySubscriptionId>',
              'AZURE_TENANT_ID=<myTenantId>']) {
      
    2. 更新为你的资源组、Web 应用和 ACR 的名称(将占位符替换为你的值)。

      def webAppResourceGroup = '<resource_group>'
      def webAppName = '<app_name>'
      def acrName = '<registry>'
      
    3. <azsrvprincipal\> 更新为你的凭据 ID

      withCredentials([usernamePassword(credentialsId: '<service_principal>', passwordVariable: 'AZURE_CLIENT_SECRET', usernameVariable: 'AZURE_CLIENT_ID')]) {
      
  5. 创建新的 Jenkins 管道,就像在使用 Jenkinsfile2 部署到 Windows 中的 Azure Web 应用时一样。

  6. 运行新作业。

  7. 若要验证,请在 Azure CLI 中运行以下命令:

    az acr repository list -n <myRegistry> -o json
    

    应会看到如下所示的结果:

    [
    "calculator"
    ]
    
  8. 浏览到 http://<app_name>.azurewebsites.net/api/calculator/ping(替换占位符)。 应看到类似于以下内容的结果:

    Welcome to Java Web App!!! This is updated!
    Today's date
    
  9. 浏览到 http://<app_name>.azurewebsites.net/api/calculator/add?x=<x>&y=<y>(替换占位符)。 你为 xy 指定的值会进行求和并显示出来。

后续步骤