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

时间:2018-10-12 19:25:07

标签: node.js azure-devops azure-pipelines continuous-deployment

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

2 个答案:

答案 0 :(得分:3)

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

先决条件:

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

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

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

答案 1 :(得分:0)

当我写一年前的上一个答案时,Azure DevOps没有用于构建管道的Web应用程序部署任务,因此必须使用发布任务来完成,我不喜欢发布任务,因为发布管道不能添加到源代码管理中。通过您的构建管道进行部署要好得多,我强烈建议您这样做。它允许您将所有CI / CD任务写在一个文件中,然后将此文件添加到项目源中。

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

首先,您将需要服务连接。 See this question.

假设您的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}!`))

现在,您需要用于管道的YAML文件。将此文件命名为azure-pipelines.yaml。 YAML模式文档为here

trigger: # Runs pipeline every time you push commits and when you create a tag
  - '*'
  - 'refs/tags/*'

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

- job: deploy
  condition: contains(variables['Build.SourceBranch'], 'refs/tags') # Run deploy job only if triggered by tag
  dependsOn: test
  pool:
    vmImage: ubuntu-18.04
  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>
      appName: test-project
      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

将其推送到您的仓库中,然后创建一个构建管道。设置很简单。如果您的仓库中有azure-pipelines.yaml,则安装程序应检测到该文件并允许您运行它。在第一次运行时,可能会说该服务连接未经授权。单击“授权资源”,然后使用“队列”按钮再次手动运行构建即可解决此问题。

我在构建中两次执行npm install的原因是因为每个作业后都会清理工作区。我无法弄清楚如何保留上一份工作中的文件。

构建完成后,您可以通过创建标签来部署代码。在仓库的边栏中,有一个“标签”页面。在这里,您可以创建标签。由于某种原因,它需要标签描述,所以我只复制标签名称。现在,如果您返回到构建列表,您将看到部署作业正在运行。

构建完成后,请转到您的站点,您应该会看到hello world消息。如果您的站点显示应用程序错误消息,则可以通过以下方法检查错误日志:转到Azure门户中的Web应用程序,然后转到侧边栏中的“日志流”页面。请注意,只有在有人访问网页后,应用容器才会启动。因此,要测试应用程序的初始化,必须首先访问该网站。