Pohodlný deployment aplikací do Azure App Service

Podívejme se dnes na způsoby, jakými můžete ručně i automaticky provést deployment aplikace do App Service, nejpopulárnější platformní služby v Azure. Uvidíte jednoduchou instalaci z Visual Studio, Eclipsu, deployment přes FTP, Git, GitHub, Visual Studio Team Services, DropBox i doručení ve formě Docker kontejneru.

Nechť existuje servisní plán

Pro dnešní ukázku jsem si připravil App Service Plan ve variantě Standard, ale zmíněné deployment metody jsou k dispozici i u nižších variant.

Visual Studio

Azure je otevřený mnoha platformám, jazykům a způsobům nasazování aplikací, ale začneme jak se sluší a patří v Microsoft ekosystému. Konkrétně ve vývojovém prostředí Visual Studio, oblíbeném zejména pro .NET aplikace, ale dnes často pro Javascript a Node.js i další jazyky. Vytvořím si prázdnou webovou aplikaci v moderním .NET Core, tedy v open source multi-platformním přenositelném prostředí.

Pojďme teď jednoduše prázdnou aplikaci publikovat v Azure.

Použiji můj existující servisní plán (to jsou worker nody, tedy sada alokovaných zdrojů pro skupinu mých aplikací) a nechám vytvořit novou resource group.

Po kliknutí na tlačítko Create stačí jen čekat.

Po chvilce je hotovo. Vaše aplikace běží a můžete se na ni podívat.

V Azure se vytvořila příslušná Web App.

Můžeme si stránku změnit.

Klikněte znovu na publish.

Po chvilce je nová verze aplikace nasazena.

Jednoduché, že?

FTP

Klasickou možností je provést deployment nakopírováním potřebných souborů přímo do serveru. Upřímně řečeno není to ideální - automatizace něčeho takového je méně přirozená a navíc se musíte postarat i o vytvoření například web.config souboru (pokud třeba provozujete Node.JS na IIS, který je pod kapotou, musíte tímto souborem serveru říct, jak s tím naložit). Ostatní metody jsou v tomto ohledu modernější a jednodušší. Nicméně i FTP se může někdy hodit.

Připravme si novou Web App v mém servisním plánu.

Vyzkoušíme si jednoduché nakopírování kódu přes FTP/SFTP. Je to jednoduchý protokol a nepodporuje moderní formy autetentizace (jako je třeba vícefaktorové ověření), proto nemůžeme použít svůj login do Azure, ale vytvoříme specifický FTP účet.

Na přehledové stránce pak najdeme příslušný FTP odkaz. Na ten nakopírujeme jednoduchou statickou HTML stránku:

<H1>Cha! Jede to.</H1>

Nakopírujeme soubor do wwwroot.

Statický web je připraven.

Lokální Git

Podívejme se teď na další metody, které jsou k dispozici díky výbornému nástroji Kudu, který je pod kapotou Azure App Services pro zajištění pokročilých forem deploymentu a troubleshootingu (projekt je open source a najdete ho zde: (https://github.com/projectkudu/kudu). První z možností je lokální Git. Vaše Web Site v Azure začne fungovat jako Git server proti kterému můžete vyvolat push vašeho kódu. Kudu zajistí nejen příjem nové verze kódu, ale i další potřebné operace jako je generování web.config či instalace dependencies. Vyzkoušejme si to.

Použiji primitivní Node.js aplikaci s dependencí na Express framework. Vypadá takhle:

var express = require('express')
var app = express()

app.get('/', function (req, res) {
  res.send('Hovoří Mr. Node')
})

app.set('port', process.env.PORT || 3000);

var server = app.listen(app.get('port'), function () {
    console.log('Express server posloucha na portu ' + server.address().port);
});

Soubor s popisem a dependencies (package.json) je také jednoduchý:

{
  "name": "nodejs-webik",
  "version": "0.0.1",
  "author": "Tomas",
  "scripts": {
    "start": "node index.js"
  },
  "dependencies": {
    "express": "^4.13.4"
  }
}

Vytvořil jsem další Web Appku. Nejprve se ujistěte, že máte nastaveno lokální jméno a heslo pro Git (je stejné jako pro FTP), zejména pokud jste přeskočili příklad s FTP.

Půjdeme do Deployment Options a zapneme lokální Git.

Od teď se vedle naší webové aplikace objevil náš vlastní Git server. Jeho URL najdeme na hlavní přehledové stránce:

V adresáři u mě na počítači, kde mám zmíněné dva soubory, provedu iniciaci Git a provedu commit těchto souborů.

PS > git init
Initialized empty Git repository in C:/Azure/Node.js/.git/
PS > git add -A
warning: LF will be replaced by CRLF in package.json.
The file will have its original line endings in your working directory.
PS > git commit -m "prvni verze"
[master (root-commit) 5cdfb25] prvni verze
 2 files changed, 23 insertions(+)
 create mode 100644 index.js
 create mode 100644 package.json

Teď stačí jen namířit na příslušný Git server naší Web App a provést push kódu. Podívejte se co všechno se děje (výpis jsem v části npm zkrátil).

PS > git remote add azure "https://tomaskubica@mujgitdeploy.scm.azurewebsit
es.net:443/mujgitdeploy.git"

PS > git push azure master
Counting objects: 4, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 587 bytes | 0 bytes/s, done.
Total 4 (delta 0), reused 0 (delta 0)
remote: Updating branch 'master'.
remote: Updating submodules.
remote: Preparing deployment for commit id '5cdfb25902'.
remote: Generating deployment script.
remote: Generating deployment script for node.js Web Site
remote: Generated deployment script files
remote: Running deployment command...
remote: Handling node.js deployment.
remote: KuduSync.NET from: 'D:\home\site\repository' to: 'D:\home\site\wwwroot'
remote: Deleting file: 'hostingstart.html'
remote: Copying file: 'index.js'
remote: Copying file: 'package.json'
remote: Using start-up script index.js from package.json.
remote: Generated web.config.
remote: The package.json file does not specify node.js engine version constraints.
remote: The node.js application will run with the default node.js version 6.9.1.
remote: Selected npm version 3.10.8
remote: ......
remote: nodejs-webik@0.0.1 D:\home\site\wwwroot
remote: npm WARN nodejs-webik@0.0.1 No description
remote: `-- express@4.15.3
...
remote:   `-- vary@1.1.1
remote:
remote: Finished successfully.
remote: Running post deployment command(s)...
remote: Deployment successful.
To https://mujgitdeploy.scm.azurewebsites.net:443/mujgitdeploy.git
 * [new branch]      master -> master

Co se tedy stalo? Web App přijala náš kód a Kudu automaticky vytvořilo deployment skripty pro node.js (na základě automatické detekce použitého jazyka aplikace) a nakopírovalo všechno potřebné do serveru. Následně došlo k vygenerování web.config a po načtení package.json zajistil Azure instalaci potřebných dependencies, v mém případě Express frameworku. Ověřte, že aplikace žije.

Můžeme teď provést drobnou modifikaci aplikace a následně znova použijte git push. Velmi rychle budete mít v cloudu novou verzi své aplikace.

PS > git add -A

PS > git commit -m "Pridan pan JS"
[master 8a949d6] Pridan pan JS
 1 file changed, 1 insertion(+), 1 deletion(-)

PS > git push azure master
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 325 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Updating branch 'master'.
remote: Updating submodules.
remote: Preparing deployment for commit id '8a949d661b'.
remote: Generating deployment script.
remote: Running deployment command...
remote: Handling node.js deployment.
remote: KuduSync.NET from: 'D:\home\site\repository' to: 'D:\home\site\wwwroot'
remote: Copying file: 'index.js'
remote: Using start-up script index.js from package.json.
remote: Generated web.config.
remote: The package.json file does not specify node.js engine version constraints.
remote: The node.js application will run with the default node.js version 6.9.1.
remote: Selected npm version 3.10.8
remote: npm WARN nodejs-webik@0.0.1 No description
remote: npm WARN nodejs-webik@0.0.1 No repository field.
remote: npm WARN nodejs-webik@0.0.1 No license field.
remote: Finished successfully.
remote: Running post deployment command(s)...
remote: Deployment successful.
To https://mujgitdeploy.scm.azurewebsites.net:443/mujgitdeploy.git
   5cdfb25..8a949d6  master -> master

Deployment Java aplikace z Eclipse

Podobně jako můžete provést deployment třeba .NET nebo Node.js aplikace z Visual Studio, tak pro nejoblíbenější vývojové prostředí Javistů existuje Azure plugin, který udělá prakticky to samé pro JSP. Plugin najdeme jednoduše. V GUI dáme vyhledat nový software na serveru http://dl.microsoft.com/eclipse.

Po instalaci vezmeme jednoduchou JSP aplikaci a provedeme deployment do Azure.

Po chvilce je vaše Java aplikace nahoře.

Při změně stačí jen znova kliknout na Deploy a nová verze je na světě.

Git ve Visual Studio Team Services

Sázení aplikace přímo z IDE, přes FTP nebo do lokálního Gitu je jednoduché a příjemné pro samostatného vývojáře či skupinku ať už v rámci malého projektu nebo pro jeho osobní zkušební nasazování v Dev prostředí (ostatně k řešení různých prostředí přes Deployment Sloty se na tomto blogu ještě dostaneme). Pro větší tým bude určitě bude daleko přirozenější a efektivnější využívat sofistikovanější version control řešení. Podporované jsou VSTS, GitHub, BitBucket nebo generický Git systém.

Vytvořím si nový projekt ve Visual Studio Team Services.

Naklonuji si projekt k sobě, přidám soubory naší Node.js a provedu git push.

Napojme teď naší Web App na tento projekt.

Sledujme co se děje - Azure pro nás sbírá změny z našeho projektu.

Po chvilce bude aplikace nahoře.

Proveďme teď změnu kódu, pro jednoduchost přímo z VSTS GUI.

Jakmile uděláme commit automaticky se spustí proces deploymentu v Azure.

Po chvilce máme rozchozenou novou verzi aplikace.

GitHub

Používáte pro svůj projekt GitHub? Ukažme si jeho integraci s Azure App Services. Vytvořil jsem repozitář a do něj přidal Node.JS aplikaci z předchozích ukázek.

V Azure vytvořím novou Web App a deployment namířím na tento repozitář a master branch.

Za malou chviličku bude deployment hotový a aplikace je nahoře.

Proveďme teď změnu kódu, pro ukázku přímo v GitHub GUI.

Provedeme commit do masteru, tím se spustí proces deploymentu této nové verze do Azure automaticky.

Co se děje v Deployment Options?

Nová verze aplikace je na světě.

Generický Git

Možná chcete pro svůj projekt použít obyčejný Git pro přístupy bez jakéhokoli loginu (public přístup), nepotřebujete automatické rozpoznání změn ani nic podobného. Jednoduše chcete na kliknutí naklonovat veřejný projekt do vaší Web App. Například tento kód v Pythonu (podporu Python musíte v Web App specificky zapnout na záložce Application settings)  https://github.com/Azure-Samples/app-service-web-python-get-started.git

Aplikace je nahoře. Počítejme ale s tím, že při změně kódu se nebude aktualizovat, jen se naklonovala. Pro kontinuální deployment zvolte integraci s VSTS, GitHub apod.

Deployment ze sdílny souborů

Pro vývojáře to může znít zvláštně - proč řešit deployment přes sdílnu souborů, když máme version control. Možná ale aplikaci nasazuje někdo, kdo není kovaný v Gitu a od dodavatele (nebo vývojového týmu) dostává jen archiv se všemi soubory. Pro něj může být zajímavé jednoduše archiv rozbalit ve svém počítači do adresáře v OneDrive nebo DropBoxu a v Azure ťuknout na tlačítko synchronizovat - tím se aplikace sama nainstaluje.

Připojme teď naší Web App právě sem.

Azure pro mě vytvořil adresář mujDropBoxDeploy a já do něj nakopíruji svoje Node.js soubory.

Dám synchronizovat svou aplikaci.

Aplikace se rychle nainstaluje.

Deployment Docker kontejneru

Docker je nová binárka, výborný způsob jak zapouzdřit a distribuovat aplikace včetně všech jejich dependencies. Místo zdrojových kódů můžete ve vývoji naplnit kontejnerový image a ten uložit teba v Azure Container Registry nebo do Docker Hub. Z těchto repozitářů pak lze kontejner nasadit v Azure App Service. Zatím je tato možnost dostupná pouze pro Linux worker nody, tedy pro Web Apps on Linux. Vyzkoušejme si to.

V době psaní tohoto článku není možné kombinovat Linux a Windows nody v jednom servisním plánu, uděláme si tedy Linuxový servisní plán.

Rovnou při vytváření Web App můžeme vyplnit kontejner. Můžete použít výše popsané metody, tedy nasazení ze zdrojového kódu, kdy Web App on Linux používá kontejnery jako hostitelská prostředí pro Node.js, Ruby apod. To už umíme. Druhou možností je ale použít svůj vlastní kontejner jako jednotku deploymentu. Nasaďme veřejně dostupný yeasy/simple-web kontejner.

Kontejner jede.

 

CI/CD pipeline

Kontinuální deployment do Dev/Test pro testování a podobné věci (Continuous Integration) a deployment do pre-prod a produkčních prostředí (Continuous Delivery/Deployment) vás při čtení určitě napadl. Jak celý proces orchestrovat v rámci CI/CD pipeline ve Visual Studio Team Services nebo třeba s použitím Jenkins? Dobré téma! Na to se podíváme někdy příště.

 

Dnes to bylo trochu delší. Možnosti deploymentu aplikací do Azure jsou skutečně široké. Jsou tu metody spočívající v nakopírování aplikaci tradičním FTP nebo modernějším OneDrive či DropBox, ale i vývojářsky smysluplnější lokální Git nebo deployment z IDE až po integrace umožňující plně automatizovaný kontinuální deployment jako jsou Visual Studio Team Services, GitHub nebo Bitbucket. To všechno vás dovede i na tvorbu kompletních CI/CD pipeline, k čemuž se na tomto blogu ještě vrátíme. Jednoduchý web? Komplexní projekt? .NET, Node, Java, Python, Ruby a tak podobně? Potřeba deploymentu Docker kontejneru? To všechno pro vás Azure App Service umí zajistit.



Předávání tajností do App Service (WebApp) přes Azure Key Vault AppService
Nakoukněme pod pokliču patchování u platformních služeb (PaaS) v Azure AppService
Co přinesl rok 2017 v Azure v aplikačních platformách AppService
CI/CD z .NET Core v Linux do Kubernetes v Azure s Visual Studio Team Services AzureDevOps
Bezpečný přístup z PaaS webu do databáze v IaaS nebo on-premises AppService