динамическое создание и развертывание приложения nodejs из octopusdeploy в веб-приложение Azure с правильной версией узла и npm

#node.js #powershell #azure #automation #octopus-deploy

#node.js #powershell #azure #автоматизация #octopus-развертывание

Вопрос:

Цель состоит в том, чтобы иметь возможность создавать развертывания ветвей функций на лету. Наша настройка:

  • GITHUB
  • Teamcity
  • Развертывание Octopus
  • Веб-приложения Azure

Разработчик будет передавать / отправлять код на Github в новой ветке функций. Teamcity будет создавать все ветви функций по мере их создания или обновления. Предполагая, что успешная сборка создаст артефакт необходимых файлов и отправит его в Octopus deploy. Затем это определит имя веб-приложения Azure, создаст его и отправит в него файлы.

введите описание изображения здесь

Выше приведены шаги сборки Teamcity (в настоящее время очень простые, просто пытаюсь получить первые принципы).

Отправленный пакет в octopus создает следующий артефакт

 *** => %vcsroot.branch%-Recolight.web.%RecolightWebBuildVersionNumber%%build.number%.zip
  

Это создает пакет в Octopus:

введите описание изображения здесь

Развертывание Octopus состоит из 3 основных этапов:

  • Определите имя экземпляра приложения
  • Убедитесь, что веб-приложение
  • Развертывание веб-приложения

шаг 1:

 $version = $OctopusParameters["Octopus.Release.Number"]
$environment = $OctopusParameters["Octopus.Environment.Name"]
$subscriptionId = $OctopusParameters["Octopus.Action.Azure.SubscriptionId"]
$uniquifier = $subscriptionId.Split("-")[0]

Write-Host "Package Version: $version"

$name = "### UNKNOWN ###"
$isPreRelease = $version -match "-(?<name>p{L}*)"
if ($isPreRelease) {
    $name = $matches['name']
} else {
    $name = $environment
}

$appInstanceName = "$name-$uniquifier"
$webAppName = "$projectName-$appInstanceName"

Set-OctopusVariable -name "AppInstanceName" -value $appInstanceName
Write-Output "AppInstanceName: $appInstanceName"
  

шаг 2)

 $projectName = $OctopusParameters["Octopus.Project.Name"].Replace(".", "-")
$appInstanceName = $OctopusParameters["Octopus.Action[Determine App Instance Name].Output.AppInstanceName"]
$azureLocation = $OctopusParameters["AzureLocation"]

$webAppName = "$projectName-$appInstanceName"
Write-Output "WebAppName: $webAppName"

$existingWebApp = Get-AzureWebSite -Name $webAppName
if ($existingWebApp) {
    Write-Host "Web App named $webAppName already exists, no need to provision it."
} else {
    Write-Host "Creating new Web App named $webAppName in $azureLocation..."
    New-AzureWebSite -Name $webAppName -Location $azureLocation
}

Set-OctopusVariable -name "WebAppName" -value $webAppName
Set-OctopusVariable -Name "WebAppUrl" -Value ("https://{0}.azurewebsites.net" -f $webAppName.ToLowerInvariant())
  

шаг 3)

это встроенная функция развертывания Octopus:

 Deploy an Azure Web App master-Recolight.web from Octopus Server (built-in)
  

Развернутый zip-файл содержит:

введите описание изображения здесь

файл package json является:

 {
  "name": "recolightweb",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "clean": "gulp clean",
    "compile": "gulp compile",
    "build": "gulp build",
    "start": "concurrent --kill-others "gulp watch" "node ./bin/www"",
    "postinstall": "typings install amp;amp; gulp build"
  },
  "dependencies": {
    "@angular/common": "2.0.0",
    "@angular/compiler": "2.0.0",
    "@angular/core": "2.0.0",
    "@angular/forms": "2.0.0",
    "@angular/http": "2.0.0",
    "@angular/platform-browser": "2.0.0",
    "@angular/platform-browser-dynamic": "2.0.0",
    "@angular/router": "3.0.0",
    "@angular/upgrade": "2.0.0",
    "angular2-fontawesome": "^0.5.1",
    "angular2-in-memory-web-api": "0.0.20",
    "angular2-modal": "^2.0.0-beta.13",
    "body-parser": "~1.13.2",
    "bootstrap-datepicker": "^1.6.4",
    "bootstrap-timepicker": "^0.5.2",
    "cookie-parser": "~1.3.5",
    "debug": "~2.2.0",
    "es6-shim": "^0.35.1",    
    "gulp-concat": "^2.6.0",
    "js-yaml": "^3.4.3",
    "lodash": "^4.15.0",
    "morgan": "~1.6.1",
    "ng2-completer": "^0.1.10",
    "ng2-dnd": "2.0.1",
    "ng2-tooltip": "0.0.3",
    "serve-favicon": "~2.3.0",
    "express": "~4.13.1",
    "concurrently": "^2.0.0",
    "core-js": "^2.4.1",
    "del": "^2.2.0",
    "font-awesome": "^4.6.3",
    "gulp": "^3.9.1",
    "gulp-inline-ng2-template": "^3.0.1",
    "gulp-sourcemaps": "^1.6.0",
    "gulp-tslint": "^4.3.3",
    "gulp-typescript": "^2.12.0",
    "jade": "^1.11.0",
    "jadeify": "^4.4.0",
    "reflect-metadata": "^0.1.3",
    "rxjs": "5.0.0-beta.12",
    "systemjs": "0.19.39",
    "systemjs-builder": "^0.15.17",
    "systemjs-plugin-text": "0.0.9",
    "tslint": "^3.5.0",
    "typescript": "^2.0.2",
    "typings": "^1.3.2",
    "yargs": "^4.7.1",
    "zone.js": "^0.6.23"
  },
  "engines": {
    "node": ">=4.5.0",
    "npm": ">=3.10.6"
  }
}
  

Все файлы из zip извлекаются в процессе развертывания и попадают в папку wwwroot (я вижу это при использовании powershell с Kudu).

Насколько я понимаю, раздел «Движки» должен гарантировать, что веб-приложение Azure будет правильно настроено для node и npm. когда я проверяю версии через powershell в Kudu, они не соответствуют этой версии.

Есть ли способ автоматически предоставлять веб-приложение Azure и обеспечивать актуальность его версий node и npm?

UDPATE

Согласно предложению Гэри, я добавил .deployment и deploy.cmd, созданные с помощью azure-cli, в SC. Я могу подтвердить, что он был развернут на d:homesitewwwroot но, похоже, он больше ничего не делал. node и npm по-прежнему имеют одну и ту же версию, и node_modules не был создан. Не уверен, что msdeploy не запускает запуск. Я попытался сделать это в существующем веб-приложении, удалить его и создать совершенно новое.

Комментарии:

1. Похоже, что задача развертывания не обнаружила, что node.js проект, и по-прежнему рассматривается как .net-проект. Не могли бы вы попробовать добавить 2 сценария развертывания .deployment и deploy.cmd в ваш корневой каталог пакета, выполнив команду Azure-Cli azure site deploymentscript --node . См github.com/projectkudu/kudu/wiki/Custom-Deployment-Script за подробностями.

2. @GaryLiu-MSFT Я попробовал, но ничего не произошло. Я обновил вопрос, чтобы отразить это.

3. одна вещь, которую я заметил, когда возился с deploy.cmd, — это ссылка на путь d:home . где, поскольку весь мой код установлен в d:homesitewwwroot . не уверен, должен ли скрипт находиться в папке «home» или «wwwroot», чтобы он был активирован

4. Чтобы проверить узел, версию среды выполнения js, не могли бы вы попробовать использовать process.version в node.js сценарии. И node.js версия в KUDU env, контролируется WEBSITE_NODE_DEFAULT_VERSION настройками приложения .

5. Мне не удалось заставить msdeploy использовать процесс KUDU, похоже, он связан исключительно с GIT. Мне удалось заставить его работать: создайте запущенное веб-задание, которое вызывает deploy.cmd, который выполнит установку npm. Веб-задание может быть запущено с URL-адреса. Поэтому при развертывании файлов запускается webjob, и ваш сайт должен быть запущен