如何在 Azure DevOps 中为 Node.js Web 应用程序创建发布管道?

How do I create a Release pipeline for a Node.js web app in Azure DevOps?

我想通过创建发布管道在 Azure DevOps 上为 Node.js 应用启用持续部署。我该如何做到这一点?

我花了几个小时试图弄清楚如何让 CI/CD 在 Azure DevOps 上为 Node.js 应用程序工作,因为我可以参考的文档很少。我终于让它工作了,所以我希望这些步骤对你有所帮助。注意:UI 可能会随时间变化。本文写于2018年10月

先决条件:

  • 要部署到的 Azure Web App 服务
  • 一个 Azure 订阅
  • Azure DevOps 上的一个 Node.js 项目,具有有效的构建管道
  • 您已经能够通过其他方式部署您的应用程序,例如 ftp 或 Git

有两种方法可以将部署步骤添加到您的管道,它们是:通过构建管道中的 YAML 脚本,或使用发布管道。这些步骤用于创建发布管道。我选择这个是为了我可以手动选择要部署的提交,但它也可以自动触发。

  1. 在您的构建管道中生成您的回购目录的工件。如果您的构建管道是通过 YAML 脚本完成的,请将其添加到 YAML 文件 (more info):
- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(System.DefaultWorkingDirectory)'
  1. 运行 构建管道并等待它完成。确认生成了工件。
  2. 转到“发布”选项卡并创建新的发布管道。
  3. 在模板菜单中,找到“将 Node.js 应用部署到 Azure 应用服务”,然后单击应用。
  4. 单击显示“1 个工作,1 个任务”的 link 打开阶段 1。
  5. 在“Azure 订阅”字段中,单击“+ 新建”按钮。弹出“添加 Azure 资源管理器服务连接”模式。
  6. 这部分非常令人沮丧,但 this Medium article 帮了大忙。起初它不起作用,但那是因为我没有阅读所有内容。确保阅读每个句子,它应该有效。当连接显示“已验证”时,单击“确定”。
    • 有“使用服务连接对话框的自动化版本”的选项,但该界面对我不起作用。
    • 使这一步变得困难的原因是 DevOps 和门户网站对每个变量使用不同的术语。 Azure 服务,请大家一起商定一个单一的命名系统。
  7. Select 应用类型。
  8. 找到您的应用程序服务名称。
  9. 转到“部署 Azure 应用服务”任务。大多数设置不需要更改,但您需要指定要使用的构建工件。这是在“包或文件夹”下完成的。单击“...”并找到您的构建工件。如果没有工件显示,则说明您的构建管道不工作。
  10. 保存发布管道。
  11. 打开您最新的 CI 版本并单击发布按钮。
  12. “创建新版本”模式中的所有默认设置都应该没问题。点击“创建”。现在您可以打开发布管道并观察进度。如果由于连接问题而失败,请编辑您的发布管道并确认您的 Azure 资源管理器连接已验证并选择了正确的应用程序类型和应用程序服务。
  13. 转到您的站点并确认您的应用已成功部署。

当我写我一年前做的上一个答案时,Azure DevOps 没有用于构建管道的 Web 应用程序部署任务,因此必须使用发布管道来完成。通过构建管道进行部署要好得多,我强烈推荐它,因为它允许您将所有 CI/CD 作业提交到存储库。 (构建管道在侧边栏中标记为“管道”,发布管道在“发布”中。)

因此,此答案适用于通过构建管道部署 Web 应用程序。如果您想使用发布管道,请参阅我的旧答案。

  1. 假设您的 Web 应用程序有一个服务连接,并且您在 DevOps 中有一个 Node.js 项目,请为您的项目创建一个 package.jsonmain.js。 运行 这在本地进行以确保它在您的计算机上工作。
{
  "name": "test-project",
  "version": "0.0.0",
  "scripts": {
    "start": "node main.js",
    "test": ""
  },
  "dependencies": {
    "express": "^4.17.1"
  }
}
const express = require('express');
const app = express();
const port = process.env.PORT || 3000; // You can see your app's env variables in Kudu: https://<your app>.scm.azurewebsites.net/

app.get('/', (req, res) => res.send('Hello World!'));

app.listen(port, () => console.log(`Example app listening on port ${port}!`));
  1. 现在您需要管道的 YAML 文件。将此文件命名为 azure-pipelines.yml。 YAML 模式文档是 here.
trigger:
  - '*' # Run pipeline when a commit is pushed to any branch
  - 'refs/tags/*' # Run pipeline when a tag is pushed

jobs:
- job: test
  pool:
    vmImage: ubuntu-latest
  steps:
  - script: npm install
    displayName: npm install
  - script: npm run test
    displayName: npm run test

- job: deploy
  condition: startsWith(variables['Build.SourceBranch'], 'refs/tags/') # Run deploy job only if triggered by tag
  pool:
    vmImage: ubuntu-latest
  steps:
  - script: npm install
    displayName: npm install
#  - script: npm run build # If you are using TypeScript
#    displayName: npm run build
  - task: AzureWebApp@1 # https://docs.microsoft.com/en-us/azure/devops/pipelines/tasks/deploy/azure-rm-web-app?view=azure-devops
    inputs:
      azureSubscription: <service connection name> # Replace this with the service connection name
      appName: test-project # Replace this with the web app name
      package: $(Build.SourcesDirectory)
      customWebConfig: -Handler iisnode -NodeStartFile main.js -appType node # https://docs.microsoft.com/en-us/azure/devops/pipelines/targets/webapp?view=azure-devops&tabs=yaml
  1. 替换 AzureWebApp@1 任务中的项目特定值并将此文件推送到您的存储库。
  2. 转到“管道”页面并单击“新建管道”。管道选项(真的很简单):
  • “你的代码在哪里?” Azure 存储库 Git
  • "Select 一个存储库" Select 你的存储库
  • “配置你的管道”现有 Azure Pipelines YAML 文件
  • "Select 一个现有的 YAML 文件" azure-pipelines.yml
  • 的路径
  • 点击运行
  • 第一个运行,可能会说服务连接未授权。单击“授权资源”,然后 运行 使用“队列”按钮再次手动构建将解决此问题。
  1. 到 运行 构建作业,创建一个标签并推送它。返回构建列表,您将看到您的部署作业 运行ning.
  • 要通过 Web 界面执行此操作:转到 Repos 下的“标签”页面,然后单击“新建标签”。由于某些原因它需要标签描述,所以我只是复制标签名称。
  1. 构建成功完成后,转到您的站点,您应该会看到 hello world 消息。
  • 如果您的站点显示应用程序错误消息,您可以通过在 Azure 门户中转到您的 Web 应用程序,然后在边栏中的日志流页面来检查错误日志。请注意,只有在有人访问网页后,应用程序容器才会启动。因此,要测试应用程序初始化,您必须先访问您的网页。