首次云原生实践:自动化构建、测试和部署





5.00/5 (4投票s)
本文将作为 Node.js 开发者的云原生开发实践入门指南。与其他大多数入门教程不同,我们将使用现代工具,以一种真实的方式展示如何进行操作。
云原生开发不仅仅是在云中运行代码。正如我们在本系列 第一部分 所讨论的,DevOps 配合持续集成和持续部署 (CI/CD) 也是云原生的一部分,尤其是在运行微服务时。
在本文中,我们将重点关注 CI/CD,而不是编写太多代码。事实上,我们将在编写任何代码之前设置好 Azure DevOps 环境。然后,我们可以在几分钟内设置好一个新的 TypeScript Function App,之后,每次推送到 Git 存储库的代码都会自动部署。
设置项目
首先,我们需要在 Azure DevOps 中创建一个 Git 存储库。创建构建管道需要这个存储库。在 Azure DevOps 中,您可以创建一个新项目(这将自动创建一个我们可以使用的 Git 存储库),或者在现有项目之一中添加一个新的 Git 存储库。请务必通过添加 README 文件或 (Node.js) .gitignore 文件来初始化存储库。之后,将存储库克隆到您的计算机。
接下来,我们需要一个 Azure 中的 Function App。进入 Azure 门户,添加新资源,然后搜索“Function”。为了方便以后清理,请将新的 Function App 放在一个新的资源组中,您可以在打开的窗格中创建该资源组。您的 Function App 名称在整个 Azure 中必须是唯一的。
由于 Function 是无服务器的,您需要一个存储账户来存储您的代码。使用专用的存储账户是一种好习惯,因此在创建 Function App 时创建一个新的存储账户。Consumption Plan 是无服务器计划。请注意,您可以在常规托管计划上运行函数,但这会限制您的扩展选项。您可以选择 Linux 或 Windows 作为操作系统,但在本示例中我们选择了 Linux。接下来,禁用 Application Insights。
然后,单击“创建”,等待您的 Function App 预配完成。
请注意,虽然这是创建 Function App 的最简单方法,但它可能并非总是最佳选择,因为它仍然需要手动操作。
创建构建管道
现在,回到 Azure DevOps。在这里,我们将创建管道来构建、测试和部署我们的项目。转到 Pipelines,然后单击 New pipeline。我们将使用 Azure Repos Git 选项,但请注意,您也可以使用其他 Git 源,例如 GitHub(它会有一个授权过程,但其他方面完全相同)。
选择 Git 存储库后,选择一个管道模板。您会找到一些适用于 ASP.NET Core(和 .NET Framework)、Node.js、Android 和 Ant 的模板。单击 Show more,您会找到更多适用于 C/C++、Go、Python、PHP 等的模板。
我们要找的是 Node.js Function App to Linux on Azure。点击它会提示您选择 Azure 订阅和 Function App。因此,选择您的订阅以及我们刚刚创建的 Function App。
之后,您会得到一个 YAML 脚本,它描述了将代码部署到 Azure Function 所需的步骤。我们现在不必更改它,因为它与默认的 Node.js Azure Function 模板开箱即用。稍后我会深入探讨一些细节。首先,让我们通过将一些代码部署到 Azure 来验证它是否有效。
使用 TypeScript 创建 Azure Function
使用 TypeScript 创建 Azure Function 的最简单方法是使用 Visual Studio Code。安装 Azure Functions 扩展,然后转到新添加的 Azure 页面。
在那里,单击右上角的 Create New Project。
选择一个文件夹:您在设置此项目时克隆的存储库。
之后,选择您的语言:TypeScript。
选择 HTTP trigger,为其命名(或保留默认的 HttpTrigger1),然后按 Enter。
对于授权级别,选择 Function。
最后,选择在当前窗口中打开您的项目。这可能会提示您安装一些额外的 Azure Functions 扩展,您应该接受。
完成所有这些后,会生成一个新的 Function。按 F5 或从 Run 菜单中选择 Start Debugging 来检查它是否正常运行。您将在终端中看到一些活动,然后最终会看到
[Function name]: [GET,POST] https://:[port]/api/[Function name]
在浏览器中打开链接,您应该会看到“This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.”
因此,在 URL 末尾添加类似“?name=Bill”的内容,您现在应该会看到“Hello, Bill. This HTTP triggered function executed successfully.”这意味着一切正常。
现在,是时候将代码提交并推送到 Azure DevOps,然后观看魔法发生!转到您的构建管道,您应该会看到几个绿色的对勾,表示一切顺利。要检查您的代码是否真的在正确运行,请转到 Azure 门户并找到您的 Function App。单击 Functions 并选择您的函数。在这里,单击 Code + Test,然后单击 Get function URL 并复制 URL(它有一个代码,这是我们添加的 Function 授权,所以不是任何人都可以调用您的函数)。结果应该与您在本地运行时相同。
恭喜您,您刚刚自动构建并部署了您的 TypeScript Azure Function!
工作原理
那么我们刚刚做了什么?
首先,当我们在 Azure DevOps 中创建管道时,我们创建了一个 YAML 文件并将其推送到我们的 Git 存储库。此 YAML 文件描述了构建、测试和部署代码的步骤。Azure DevOps 可以读取并执行它。例如,以下命令告诉 Azure DevOps 当何か推送到我们的主分支时开始执行。
trigger:
– main
以下部分包含重要内容。
steps:
- task: NodeTool@0
inputs:
versionSpec: '10.x'
displayName: 'Install Node.js'
- script: |
if [ -f extensions.csproj ]
then
dotnet build extensions.csproj --runtime ubuntu.16.04-x64 --output ./bin
fi
displayName: 'Build extensions'
- script: |
npm install
npm run build --if-present
npm run test --if-present
displayName: 'Prepare binaries'
在这段代码中,我们定义了一些要运行的步骤。第一个任务是使用 NodeTool 任务安装 Node.js。在 Azure DevOps 中,转到任务上方的设置,以获得编写 YAML 脚本的一些可视化帮助。
之后,我们运行两个 Shell 脚本。第一个在必要时运行 `dotnet build` 命令。第二个运行 `npm install` 并运行我们 `package.json` 文件中的 build 和 test 脚本。同时,默认的 Node.js TypeScript Function 模板生成了一个项目,其中包含来自 npm 的 TypeScript 包,以及一个将我们的 TypeScript 编译为 JavaScript 的脚本。
下一个任务(为简洁起见此处省略)将我们的根文件夹放入 artifacts staging 文件夹中的 ZIP 文件中。之后,artifacts staging 文件夹被发布为一个名为“drop”的 artifact。后续进程可以重用这些 artifacts。
接下来是部署阶段。我们只有一个构建环境,但最终我们希望将 Function 部署到开发、测试、预发布和生产 (DTAP) 环境。所以,为此,我们使用发布管道。您可以完全删除 `-stage: Deploy` 代码,但在这样做之前,请查看 `AzureFunctionApp@1` 任务设置。当我们构建发布管道时,我们将使用完全相同的步骤。
发布管道
在 Azure DevOps 中转到 Releases。不幸的是,发布管道不适用于 YAML 脚本,因此我们必须在此处进行一些点击操作。
首先,创建一个新的发布管道。当提示选择模板时,选择:Deploy a function app to Azure Functions。
将您的管道重命名为“TypeScript Function release”之类的名称。
接下来,将“Stage 1”重命名为“Development”。
单击 Add an artifact,然后从您的项目中选择 Function App build。通过 artifact 上的闪电按钮启用持续部署。
接下来,转到您的任务。在您的 Development 部署过程中,选择一个 Azure 订阅,将 App type 设置为 Function App on Linux。
对于 App service name,设置为 `$(AppServiceName)`。“AppServiceName”是一个我们可以在每个环境中设置的变量,因此当我们设置测试环境时,我们可以为其指定一个不同的名称。
在 Run on agent 下,将 Agent Specification 设置为 ubuntu-20.04。Deploy Azure Function App 实际上与我们在 YAML 脚本中的 `AzureFunctionApp@1` 是相同的任务。
接下来,转到 variables 并添加“AppServiceName”。对于 value,输入您的 App Service 的名称,并将其设置为 Development 范围。
保存,然后运行您的管道。如果一切顺利,您的 Azure Function URL 仍然可以工作。
现在可以克隆 Development 阶段并将其重命名为“Test”。然后,您可以在 Test 范围内为您的变量指定另一个名称。这样,您的开发和测试发布将使用相同的 artifact(由相同的构建创建)执行相同的过程,但会将您的代码部署到另一个 Azure Function App。然而,我们现在还不会克隆到新环境。首先,我们将为管道添加一些额外的步骤,如下一篇文章所述。
后续步骤
创建和部署一个使用 TypeScript 的 Node.js Function App 非常容易,您可以在几分钟内完成。默认模板实际上提供了一个很好的基础。
在本系列的 下一期 中,我们将为我们的 Function App 添加后端,并在我们的发布管道中添加 DTAP,将我们的 Function App 变成一个微服务。