教程:使用 Jenkins 部署到 Azure Functions

重要

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

Azure Functions 是一个无服务器计算服务。 使用 Azure Functions 可以按需运行代码,而无需预配或管理基础结构。 本教程演示如何使用 Azure Functions 插件将 Java 函数部署到 Azure Functions。

先决条件

  • Azure 订阅:如果没有 Azure 订阅,请在开始之前创建一个免费帐户。
  • Jenkins 服务器:如果没有安装 Jenkins 服务器,请参阅文章: 在 Azure 上创建 Jenkins 服务器。

查看源代码

本教程中使用的源代码位于 Visual Studio China GitHub 存储库

创建 Java 函数

若要使用 Java 运行时堆栈创建 Java 函数,请使用 Azure 门户Azure CLI

以下步骤演示如何使用 Azure CLI 创建 Java 函数:

  1. 创建资源组,将 <resource_group> 占位符替换为资源组名称。

    az group create --name <resource_group> --location eastus
    
  2. 创建 Azure 存储帐户,将占位符替换为适当的值。

    az storage account create --name <storage_account> --location eastus --resource-group <resource_group> --sku Standard_LRS    
    
  3. 创建测试函数应用,将占位符替换为适当的值。

    az functionapp create --resource-group <resource_group> --runtime java --consumption-plan-location eastus --name <function_app> --storage-account <storage_account> --functions-version 2
    

准备 Jenkins 服务器

以下步骤说明如何准备 Jenkins 服务器:

  1. 在 Azure 上部署 Jenkins 服务器。 如果尚未安装 Jenkins 服务器的实例,则文章在 Azure 上创建 Jenkins 服务器会指导你完成该过程。

  2. 使用 SSH 登录 Jenkins 实例。

  3. 在 Jenkins 实例上,安装 Az CLI 2.0.67 版或更高版本。

  4. 使用以下命令安装 Maven:

    sudo apt install -y maven
    
  5. 在 Jenkins 实例上,通过在终端提示处发出以下命令来安装 Azure Functions Core Tools

    curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
    sudo mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg
    sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-$(lsb_release -cs)-prod $(lsb_release -cs) main" > /etc/apt/sources.list.d/dotnetdev.list'
    cat /etc/apt/sources.list.d/dotnetdev.list
    sudo apt-get update
    sudo apt-get install azure-functions-core-tools-3
    
  6. Jenkins 需要 Azure 服务主体以进行身份验证和访问 Azure 资源。 有关分步说明,请参阅部署到 Azure 应用服务

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

    1. 从菜单中选择“管理 Jenkins”

    2. 在“系统配置”下,选择“管理插件”

    3. 选择“已安装”选项卡。

    4. 在“筛选器”字段中,输入 credentials

    5. 验证是否已安装凭据插件。 如果未安装,则需要从“可用”选项卡进行安装

    The Credentials Plug-in needs to be installed.

  8. 从菜单中选择“管理 Jenkins”

  9. 在“安全性”下,选择“管理凭据”

  10. 在“凭据”下,选择“(全局)”

  11. 从菜单中选择“添加凭据”

  12. Microsoft Azure 服务主体输入以下值:

    • 类型:选择值: 使用密码的用户名。
    • 用户名:指定 appId 创建的服务主体。
    • 密码:指定 password 服务主体的(机密)。
    • ID:指定凭据标识符,例如 azuresp
  13. 选择“确定”

分叉示例 GitHub 存储库

  1. 登录到 GitHub 存储库获取奇数或偶数示例应用

  2. 在 GitHub 的右上角,选择“分叉”。

  3. 遵照提示选择 GitHub 帐户并完成分叉。

创建 Jenkins 管道

在本部分中,将创建 Jenkins 管道

  1. 在 Jenkins 仪表板中,创建一个管道。

  2. 启用“为运行准备环境”

  3. “管道定义>”部分中,从 SCM 中选择管道脚本。

  4. 输入 GitHub 分叉的 URL 和要在 JenkinsFile 示例中使用的脚本路径 ("doc/resources/jenkins/JenkinsFile")。

     node {
     withEnv(['AZURE_SUBSCRIPTION_ID=99999999-9999-9999-9999-999999999999',
             'AZURE_TENANT_ID=99999999-9999-9999-9999-999999999999']) {
         stage('Init') {
             cleanWs()
             checkout scm
         }
    
         stage('Build') {
             sh 'mvn clean package'
         }
    
         stage('Publish') {
             def RESOURCE_GROUP = '<resource_group>' 
             def FUNC_NAME = '<function_app>'
             // login Azure
             withCredentials([usernamePassword(credentialsId: 'azuresp', passwordVariable: 'AZURE_CLIENT_SECRET', usernameVariable: 'AZURE_CLIENT_ID')]) {
             sh '''
                 az login --service-principal -u $AZURE_CLIENT_ID -p $AZURE_CLIENT_SECRET -t $AZURE_TENANT_ID
                 az account set -s $AZURE_SUBSCRIPTION_ID
             '''
             }
             sh 'cd $PWD/target/azure-functions/odd-or-even-function-sample && zip -r ../../../archive.zip ./* && cd -'
             sh "az functionapp deployment source config-zip -g $RESOURCE_GROUP -n $FUNC_NAME --src archive.zip"
             sh 'az logout'
             }
         }
     }
    

构建和部署

现在可以运行 Jenkins 作业。

  1. 首先,通过 Azure Functions HTTP 触发器和绑定一文中的说明获取授权密钥。

  2. 在浏览器中,输入应用的 URL。 将占位符替换为相应的值,并为input_number>指定数值<作为 Java 函数的输入。

    https://<function_app>.azurewebsites.net/api/HttpTrigger-Java?code=<authorization_key>&number=<input_number>
    
  3. 你会看到类似于以下示例输出的结果(在其中将奇数 365 用作测试):

    The number 365 is Odd.
    

清理资源

如果不打算继续使用此应用程序,请按以下步骤删除创建的资源:

az group delete -y --no-wait -n <resource_group>

后续步骤