在 Azure Devops 中为基于 Python 的 Azure Function 设置发布管道的正确方法

Posted

技术标签:

【中文标题】在 Azure Devops 中为基于 Python 的 Azure Function 设置发布管道的正确方法【英文标题】:Proper way to set up a release pipeline in Azure Devops for Python based Azure Function 【发布时间】:2019-01-28 08:25:26 【问题描述】:

我在 Azure Devops 中有一个有效的构建管道,它基本上安装 Python3.6,设置虚拟环境 (.env),然后执行所有单元测试。然后,它使用复制操作作为最后一步,将所有文件(包括虚拟环境)移动到放置文件夹。

我的问题来自创建发布管道。我正在为基本上安装 azure 函数命令工具的发布管道运行 bash 脚本,然后在调用 func azure 发布指令之前激活 python 虚拟环境。

我得到的错误表明设置已加密,我需要调用 func setting add 来添加设置,但是,当在本地运行时,脚本执行时没有任何错误。

是否有人在 Azure Devops 中有一个基于 python 的 Azure 函数的工作发布管道,他们可以与我共享,这样我也许可以看到我做错了什么?

这是执行的相关脚本:

#!/usr/bin/env bash
FUNCTION_APP_NAME="secret"
FUNCTION_APP_FOLDER="evenMoreSecret"


# Install Azure Functions Core Tools
echo "--> Install Azure Functions Core Tools"
wget -q https://packages.microsoft.com/config/ubuntu/16.04/packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
sudo apt-get update
sudo apt-get install azure-functions-core-tools -y

echo ">>>>>>>> Initialize Python Virtual Environment"
source .env/bin/activate

echo "--> Publish the function app to Azure Functions"
cd $FUNCTION_APP_FOLDER
func azure functionapp publish $FUNCTION_APP_NAME --build-native-deps

该脚本使用 Azure CLI 执行,使用的安全主体绑定到它所针对的 azure 帐户。

【问题讨论】:

为什么不使用本机 azure devops webapp 步骤呢? 因为它是一个 Azure FunctionApp,而不是一个 WebApp,而且我所知道的用 Python 编写的函数没有部署步骤。 有没有区别?它复制文件并运行deployment.cmd,至少我是这么认为的? 没有deployment.cmd。 azure 函数是使用 Azure Function 核心工具创建的,它在 python 中制作了骨架项目,没有任何部署文件。 ,根据文档,它应该工作的方式是使用 azure 函数核心工具进行部署,如上面脚本的最后一行所示 【参考方案1】:

通常使用 Azure DevOps,您会创建几个生成步骤,这些步骤会产生一些生成工件 - 这些是在 azure-pipelines.yml 文件中定义的。然后,您执行发布步骤以发布您创建的工件 - 这是在 UI 中创建的。这可能涉及部署到测试服务器,然后部署到生产环境,或者您想要配置它。您所描述的是在一个 yaml 文件中执行构建和发布步骤,因为 func 发布本质上是在执行发布,并且似乎都在一个脚本中。

在 az cli 的下一个版本中,有一个名为 az functionapp devops-build 的新命令将使用单独的构建和发布步骤设置 DevOps 管道。但是,与此同时,我们创建了一系列 beta yaml 文件,希望您可以在构建部分中拖放这些文件来执行构建和发布步骤(就像您正在做的那样)。

测试版 yaml 文件在这里: https://github.com/Azure/azure-functions-devops-build/wiki/Yaml-Samples

我必须声明它们没有经过全面测试,也不受支持。

【讨论】:

【参考方案2】:

我会在解决问题后回答自己。 致@Oliver Dolk:我们​​不想作为构建管道的一部分发布。我唯一感兴趣的是设置一个虚拟环境,然后运行单元测试。

RELEASE 阶段是我们要部署从构建步骤复制过来的脚本的地方。然后,这些工件是发布到开发、测试和生产环境的基础。

我在我的脚本中遗漏了一个非常重要的步骤;创建一个 local.settings.json 文件,其中包含 functionapp 的加密设置。

为了解决问题,我只需要调用以下代码:

func azure functionapp fetch-app-settings $FUNCTION_APP_NAME

这会调用 azure functionApp,并将其设置检索到加密的 local.settings.json 中,然后在发布期间使用该文件。

对于构建 YAML 脚本和执行部署的 bash 脚本的完整脚本参考,我将两者都放在了一个匿名的 github 存储库中:

https://github.com/digitaldias/Python-Examples

【讨论】:

以上是关于在 Azure Devops 中为基于 Python 的 Azure Function 设置发布管道的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

在 Azure DevOps 管道中为 WebApp 创建部署槽

如何在 Azure DevOps 中为 .net6 iOS 应用程序配置配置文件?

如何在 Azure DevOps Server 2020 中为 C#10 / .NET 6.0 项目创建构建任务

以编程方式在本地 Azure DevOps 服务器工作项注释中为 Active Directory 用户帐户添加 @提及(2021 年 1 月)

托管代理失败的 Azure DevOps 构建管道

Azure Devops 无法连接到 Service Fabric 群集