#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-Cliazure 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, и ваш сайт должен быть запущен