Použití CI/CD k nasazení webové aplikace v Pythonu do Azure App Service v Linuxu
Azure Pipelines
V tomto článku použijete Azure Pipelines kontinuální integraci a průběžné doručování (CI/CD) k nasazení webové aplikace v Pythonu do Azure App Service v Linuxu. Začnete tím, že kód aplikace z místního GitHub úložiště. Potom můžete zřídit cílovou App Service prostřednictvím Azure Portal. Nakonec vytvoříte kanál CI/CD Azure Pipelines, který automaticky sestaví kód a nasadí ho do App Service vždy, když dojde k potvrzení do úložiště.
Vytvoření úložiště pro kód aplikace
Pokud už máte webovou aplikaci v Pythonu, kterou můžete použít, ujistěte se, že je potvrzená do GitHub úložiště.
Poznámka
Pokud vaše aplikace používá Django a databázi SQLite, nebude pro tento názorný postup fungovat. Další informace najdete v části Důležité informace o rozhraní Django dále v tomto článku. Pokud vaše aplikace Django používá samostatnou databázi, můžete ji použít v tomto názorném postupu.
Pokud potřebujete, aby aplikace fungovala, můžete vytvořit fork a naklonovat úložiště na adrese https://github.com/Microsoft/python-sample-vscode-flask-tutorial . Kód pochází z kurzu Flask v Visual Studio Code.
Pokud chcete otestovat příklad aplikace místně, spusťte ze složky obsahující kód následující odpovídající příkazy pro váš operační systém:
# Mac/Linux
sudo apt-get install python3-venv # If needed
python3 -m venv .env
source .env/bin/activate
pip install -r requirements.txt
export set FLASK_APP=hello_app.webapp
python3 -m flask run
# Windows
py -3 -m venv .env
.env\scripts\activate
pip install -r requirements.txt
$env:FLASK_APP = "hello_app.webapp"
python -m flask run
Otevřete prohlížeč a přejděte na http://localhost:5000 a zobrazte aplikaci. Až budete hotovi, zavřete prohlížeč a zastavte server Flask stisknutím kláves CtrlC.
Zřízení cílové Azure App Service
Nejrychlejší způsob, jak vytvořit instanci App Service, je použít rozhraní příkazového řádku Azure (CLI) prostřednictvím interaktivního Azure Cloud Shell. V následujících krocích použijete příkaz az webapp up ke zřízení App Service a provedení prvního nasazení vaší aplikace.
Přihlaste se k webu Azure Portal na adrese https://portal.azure.com.
Otevřete Azure CLI výběrem tlačítka Cloud Shell na panelu nástrojů portálu:

V Cloud Shell v dolní části prohlížeče se zobrazí následující obrazovka. V rozevíracím seznamu vyberte Bash:

V Cloud Shell pomocí příkazu naklonovat
git cloneúložiště. Pro příklad aplikace použijte:git clone https://github.com/<your-alias>/python-sample-vscode-flask-tutorialNahraďte
<your-alias>názvem účtu úložiště, GitHub jste použili k forku úložiště.Tip
Pokud chcete vložení do Cloud Shell, použijte kombinaci kláves CtrlShift V nebo klikněte pravým tlačítkem a v místní nabídce vyberte Vložit.
Poznámka
Účet Cloud Shell zálohovaný účtem Azure Storage ve skupině prostředků s názvem cloud-shell-storage– your-region >. Tento účet úložiště obsahuje image systému souborů Cloud Shell, který ukládá klonované úložiště. Za toto úložiště jsou malé náklady. Účet úložiště můžete odstranit na konci tohoto článku společně s dalšími prostředky, které vytvoříte.
V Cloud Shell adresáře změňte na složku úložiště, která obsahuje vaši aplikaci v Pythonu, aby příkaz aplikaci rozpoznal
az webapp upjako Python.cd python-sample-vscode-flask-tutorialV Cloud Shell použijte k
az webapp upvytvoření App Service a počáteční nasazení aplikace.az webapp up -n <your-appservice>Změňte
<your-appservice>na název vaší služby App Service, který je v rámci Azure jedinečný. Obvykle se používá osobní název nebo název společnosti společně s identifikátorem aplikace, například<your-name>-flaskpipelines. Adresa URL aplikace se stane > .azurewebsites.net .appservice.Po dokončení příkazu se v okně zobrazí výstup JSON Cloud Shell.
Tip
Pokud u souboru.zipdojde k chybě Oprávnění se zamítla, možná jste se pokusili spustit příkaz ze složky, která neobsahuje aplikaci v Pythonu. Příkaz
az webapp upse pak pokusí vytvořit Windows služby App Service a selže.Pokud vaše aplikace používá vlastní spouštěcí příkaz, nastavte vlastnost az webapp config. Například aplikace python-sample-vscode-flask-tutorial obsahuje soubor startup.txt, který obsahuje konkrétní spouštěcí příkaz, takže vlastnost nastavíte na .
Z prvního řádku výstupu z předchozího příkazu zkopírujte název vaší skupiny prostředků, který se podobá vašemu _rg_Linux_
az webapp upaz webapp up.Zadejte následující příkaz s použitím názvu skupiny prostředků, názvu služby App Service ( ) a
<your-appservice>spouštěcího souboru nebo příkazu (startup.txt).az webapp config set -g <your-resource-group> -n <your-appservice> --startup-file <your-startup-file-or-command>Po dokončení příkazu se znovu zobrazí výstup JSON v Cloud Shell.
Pokud chcete zobrazit spuštěnou aplikaci, otevřete prohlížeč a přejděte http:// > .azurewebsites.net . Pokud se zobrazí obecná stránka, počkejte několik sekund, App Service se spustí, a aktualizujte stránku.
Poznámka
Podrobný popis konkrétních úloh prováděných příkazem najdete v části Zřízení App Service s jedním příkazem
az webapp upna konci tohoto článku.az webapp up
Vytvoření Azure DevOps projektu a připojení k Azure
Pokud chcete nasazení Azure App Service z Azure Pipelines, musíte mezi těmito dvěma službami vytvořit připojení služby.
V prohlížeči přejděte na dev.azure.com. Pokud ještě nemáte účet na Azure DevOps, vyberte Začít zdarma a získejte bezplatný účet. Pokud už účet máte, vyberte Přihlásit sea Azure DevOps .
Důležité
Pro zjednodušení připojení ke službě použijte stejnou e-mailovou Azure DevOps jako v Azure.
Po přihlášení se v prohlížeči zobrazí váš řídicí Azure DevOps na adrese URL název vaší organizace. > Účet Azure DevOps může patřit jedné nebo víceorganizacím, které jsou uvedené na levé straně řídicího panelu Azure DevOps počítače. Pokud je uvedeno více organizací, vyberte tu, kterou chcete použít pro tento názorný postup. Ve výchozím Azure DevOps vytvoří novou organizaci pomocí e-mailového aliasu, který jste použili k přihlášení.
Projekt je seskupení pro panely, úložiště, kanály a další aspekty Azure DevOps. Pokud vaše organizace žádné projekty nemá, zadejte název projektu Flask Pipelines v části Create a project to get started(Vytvořit projekt) a pak vyberte Create project (Vytvořit projekt).

Pokud už vaše organizace má projekty, vyberte na stránce organizace Nový projekt. V dialogovém okně Create new project (Vytvořit nový projekt) zadejte název projektu Flask Pipelinesa vyberte Create (Vytvořit).
Na stránce nového projektu vyberte Project v levém navigačním panelu.

Na stránce Project Nastavení vyberte Připojení služeb Pipelines,pak vyberte Nové připojení služby a pak v rozevíracím seznamu Azure Resource Manager připojení.

V dialogovém okně Azure Resource Manager připojení služby:
- Zadejte název připojení. Poznamenejte si název, který použijete později v kanálu.
- Jako Úroveň oboruvyberte Předplatné.
- V rozevíracím seznamu Předplatné App Service předplatné předplatného vašeho předplatného.
- V části Skupinaprostředků vyberte z rozevíracího seznamu vaši skupinu prostředků.
- Ujistěte se, že je vybraná možnost Povolit všem kanálům používat toto připojení, a pak vyberte OK.

Nové připojení se zobrazí v seznamu Připojení služeb a je připravené Azure Pipelines použít z projektu.
Poznámka
Pokud potřebujete použít předplatné Azure z jiného e-mailového účtu, postupujte podle pokynů v tématu Vytvoření připojení Azure Resource Manager služby s existujícím instančním objektem.
Vytvoření kanálu specifického pro Python pro nasazení do App Service
Na levé navigační stránce projektu vyberte Pipelines.

Vyberte Vytvořit kanál:
Na obrazovce Kde je váš kód vyberte GitHub. Může se zobrazit výzva k přihlášení do GitHub.

Na obrazovce Vybrat úložiště vyberte úložiště, které obsahuje vaši aplikaci, například fork příkladové aplikace.

Může se zobrazit výzva k GitHub hesla jako potvrzení a potom GitHub výzva k instalaci rozšíření Azure Pipelines:

Na této obrazovce se posuňte dolů do části Přístup k úložišti, zvolte, jestli se má rozšíření nainstalovat do všech úložišť nebo jenom do vybraných úložišť, a pak vyberte Schválit a nainstalovat:

Na obrazovce Configure your pipeline (Konfigurace kanálu) vyberte Python to Linux Web App on Azure (Webová aplikace z Pythonu do Linuxu v Azure).
Zobrazí se nový kanál. Po zobrazení výzvy vyberte předplatné Azure, ve kterém jste webovou aplikaci vytvořili.
- Výběr webové aplikace
- Vyberte Ověřit a nakonfigurovat.
Azure Pipelines vytvoří soubor azure-pipelines.yml, který definuje váš kanál CI/CD jako řadu fází ,úlohy a kroky ,kde každý krok obsahuje podrobnosti o různých úkolech a skriptech. Podívejte se na kanál a podívejte se, co dělá. Ujistěte se, že jsou všechny výchozí vstupy vhodné pro váš kód.
Vysvětlení kanálu YAML
Soubor YAML obsahuje následující klíčové prvky:
V horní části jsou potvrzení, která kanál aktivují, například
triggerpotvrzení vemainvětvi .Parametrizace
variablesšablony YAMLTip
Abyste se vyhnuli pevnému kódování konkrétních hodnot proměnných v souboru YAML, můžete místo toho definovat proměnné ve webovém rozhraní kanálu. Další informace najdete v tématu Proměnné – tajné kódy.
Parametr
stagesnahraďte názvem sestavy.- Sestavte
stage, který sestaví váš projekt, a fázi Nasazení, která ho nasadí do Azure jako webovou aplikaci pro Linux. - Nasazením
stagese také vytvoří prostředí s výchozím názvem, které je stejné jako webová aplikace. Můžete zvolit úpravu názvu prostředí.
- Sestavte
Každá fáze má prvek, který určuje jeden nebo více virtuálních počítačů, ve kterých
poolkanál spouštísteps. Ve výchozím nastavenípoolobsahuje element jenom jednu položku pro virtuální počítač s Ubuntu. Fond můžete použít ke spouštění testů ve více prostředích v rámci sestavení, například pomocí různých verzí Pythonu pro vytvoření balíčku.Element může obsahovat podřízený objekt, jako je , který spouští konkrétní úlohu definovanou v referenčních Azure Pipelines úlohy , a , která spouští libovolnou
stepstasksadustepsscriptpříkazů.První úloha ve fázi sestavení je UsePythonVersion, která určuje verzi Pythonu, která se má použít v agentovi sestavení. Přípona
@<n>označuje verzi úlohy. Označuje@0verzi Preview. Pak máme úlohu založenou na skriptu, která vytvoří virtuální prostředí a nainstaluje závislosti ze souboru (requirements.txt).steps: - task: UsePythonVersion@0 inputs: versionSpec: '$(pythonVersion)' displayName: 'Use Python $(pythonVersion)' - script: | python -m venv antenv source antenv/bin/activate python -m pip install --upgrade pip pip install setup pip install -r requirements.txt workingDirectory: $(projectRoot) displayName: "Install requirements"Další krok vytvoří .zip, který nasadí kroky ve fázi nasazení kanálu. Pokud chcete vytvořit.zip, přidejte na konec souboru YAML úlohu ArchiveFiles:
- task: ArchiveFiles@2 inputs: rootFolderOrFile: '$(Build.SourcesDirectory)' includeRootFolder: false archiveType: 'zip' archiveFile: '$(Build.ArtifactStagingDirectory)/Application$(Build.BuildId).zip' replaceExistingArchive: true verbose: # (no value); this input is optional - publish: $(Build.ArtifactStagingDirectory)/Application$(Build.BuildId).zip displayName: 'Upload package' artifact: dropV hodnotě
$()parametru použijete odkaz na proměnné. PředdefinovanáBuild.SourcesDirectoryproměnná obsahuje umístění v agentovi sestavení, kde kanál naklonoval kód aplikace. ParametrarchiveFileurčuje, kam searchiveFilesoubor. V tomto případěarchiveFileparametr používá integrovanou proměnnouBuild.ArtifactsStagingDirectory.Důležité
Při nasazování do Azure App Service nezapomeňte použít
includeRootFolder: false. Jinak se obsah souboru .zip do složky s jako"sources", která se replikuje na App Service. Kontejner App Service v Linuxu pak nemůže najít kód aplikace.Pak máme úlohu nahrát artefakty.
Ve fázi nasazení pomocí klíčového slova definujeme
deploymentúlohudeploymentcílí na prostředí. Při použití šablony se prostředí se stejným názvem jako webová aplikace vytvoří automaticky, pokud ještě neexistuje. Alternativně můžete předem vytvořit prostředí a zadatenvironmentNameV rámci úlohy nasazení je prvním úkolem UsePythonVersion, který určuje verzi Pythonu, která se má použít v agentovi sestavení.
Pak pomocí úlohy AzureWebApp nasadíme soubor .zip do souboru App Service, který jste identifikovali pomocí proměnných a na začátku souboru kanálu. Na konec souboru vložte následující kód:
jobs: - deployment: DeploymentJob pool: vmImage: $(vmImageName) environment: $(environmentName) strategy: runOnce: deploy: steps: - task: UsePythonVersion@0 inputs: versionSpec: '$(pythonVersion)' displayName: 'Use Python version' - task: AzureWebApp@1 displayName: 'Deploy Azure Web App : {{ webAppName }}' inputs: azureSubscription: $(azureServiceConnectionId) appName: $(webAppName) package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip # The following parameter is specific to the Flask example code. You may # or may not need a startup command for your app. startUpCommand: 'gunicorn --bind=0.0.0.0 --workers=4 startup:app'Zde zobrazený parametr je specifický pro příklad kódu
StartupCommandStartupCommandkterý definuje aplikaci v startup.py souboru. Ve výchozím Azure App Service vyhledá objekt aplikace Flask v souboru s názvem app.py nebo application.py. Pokud váš kód tento model nepodporuje, budete muset přizpůsobit spouštěcí příkaz. Aplikace Django nemusí přizpůsobení vůbec potřebovat. Další informace najdete v tématu Postup konfigurace Pythonu na Azure App Service – Přizpůsobení spouštěcího příkazu.Vzhledem k tomu, že úložiště python-vscode-flask-tutorial obsahuje stejný spouštěcí příkaz v souboru s názvemstartup.txt, můžete tento soubor zadat v parametru místo příkazu pomocí .
Spuštění kanálu
Teď jste připraveni to vyzkoušet!
V pravém horním rohu editoru vyberte Uložit, v automaticky otevíra jiném okně přidejte zprávu potvrzení a vyberte Uložit.
V editoru kanálu vyberte Spustit a v dialogovém okně Spustit kanál znovu vyberte Spustit. Azure Pipelines zařauje do fronty další spuštění kanálu, získá dostupného agenta sestavení a tento agent sestavení kanál spustí.
Dokončení kanálu trvá několik minut, zejména kroky nasazení. Vedle každého z kroků by se měla zobrazit zelená značka zaškrtnutí.
Pokud dojde k chybě, můžete se rychle vrátit do editoru YAML tak, že vyberete svislé tečky v pravém horním rohu a vyberete Upravit kanál:

Na stránce sestavení vyberte úlohu Webová aplikace Azure a zobrazte její výstup. Pokud chcete navštěvovat nasazený web, podržte stisknutou klávesu Ctrl a vyberte adresu URL App Service Url aplikace.
Pokud používáte příklad Flasku, měla by aplikace vypadat takto:

Důležité
Pokud vaše aplikace selže kvůli chybějící závislosti, váš soubor requirements.txt se během nasazování nezpracuje. K tomuto chování dochází v případě, že jste webovou aplikaci vytvořili přímo na portálu, a ne pomocí az webapp up příkazu , jak je znázorněno v tomto článku.
Příkaz az webapp up konkrétně nastaví akci sestavení na SCM_DO_BUILD_DURING_DEPLOYMENTtrue . Pokud jste službu App Service zřizli prostřednictvím portálu, tato akce se ale nenastaví automaticky.
Akci nastavíte pomocí následujících kroků:
- Otevřete Azure Portal,vyberte svou App Service a pak vyberte Konfigurace.
- Na kartě Nastavení aplikace vyberte Nové nastavení aplikace.
- V místní nabídce, která se zobrazí, nastavte Název na , nastavte Hodnotu na a vyberte OK.
- V horní části stránky Konfigurace vyberte Uložit.
- Opětovné spuštění kanálu Závislosti by se měly nainstalovat během nasazování.
Spuštění skriptu po nasazení
Skript po nasazení může například definovat proměnné prostředí očekávané kódem aplikace. Přidejte skript jako součást kódu aplikace a spusťte ho pomocí spouštěcího příkazu.
Abyste se vyhnuli pevnému kódování konkrétních hodnot proměnných v souboru YAML, můžete místo toho definovat proměnné ve webovém rozhraní kanálu a pak odkazovat na název proměnné ve skriptu. Další informace najdete v tématu Proměnné – tajné kódy.
Důležité informace pro Django
Jak jsme uvedli dříve v tomto článku, můžete Azure Pipelines nasazení aplikací Django do Azure App Service v Linuxu za předpokladu, že používáte samostatnou databázi. Databázi SQLite nemůžete použít, protože App Service soubor db.sqlite3, což brání čtení i zápisu. Toto chování nemá vliv na externí databázi.
Jak je popsáno v tématu Konfigurace aplikace v Pythonuv App Service – proces spuštění kontejneru , App Service v kódu aplikace automaticky vyhledá soubor wsgi.py, který obvykle obsahuje objekt aplikace. Pokud potřebujete spouštěcí příkaz libovolně přizpůsobit, použijte parametr v kroku souboru kanálu YAML, jak je StartupCommandAzureWebApp@1 popsáno v předchozí části.
Při použití rozhraní Django obvykle chcete migrovat datové modely pomocí nástroje po manage.py migrate nasazení kódu aplikace. K tomuto účelu startUpCommand můžete přidat skript po nasazení:
startUpCommand: python3.6 manage.py migrate
Spouštění testů na agentovi sestavení
V rámci procesu sestavení můžete chtít spustit testy na kódu aplikace. Testy běží na agentovi sestavení, takže pravděpodobně budete muset nejprve nainstalovat závislosti do virtuálního prostředí na počítači agenta sestavení. Po spuštění testů odstraňte virtuální prostředí před vytvořením souboru.zip pro nasazení. Tento proces ilustrují následující elementy skriptu. Umístěte je ArchiveFiles@2 před úlohu do ArchiveFiles@2 Další informace najdete v tématu Spouštění skriptů pro více platforem.
# The | symbol is a continuation character, indicating a multi-line script.
# A single-line script can immediately follow "- script:".
- script: |
python3.6 -m venv .env
source .env/bin/activate
pip3.6 install setuptools
pip3.6 install -r requirements.txt
# The displayName shows in the pipeline UI when a build runs
displayName: 'Install dependencies on build agent'
- script: |
# Put commands to run tests here
displayName: 'Run tests'
- script: |
echo Deleting .env
deactivate
rm -rf .env
displayName: 'Remove .env before zip'
Můžete také použít úlohu, jako je PublishTestResults@2, aby se výsledky testů objevily na obrazovce s výsledky kanálu. Další informace najdete v tématu Vytváření aplikací v Pythonu – Spouštění testů.
Zřízení App Service s jedním příkazem
Příkaz az webapp up použitý dříve v tomto článku je pohodlnou metodou pro zřízení App Service a počáteční nasazení aplikace v jednom kroku. Pokud chcete mít větší kontrolu nad procesem nasazení, můžete k provedení stejných úloh použít jediné příkazy. Můžete například chtít použít konkrétní název skupiny prostředků nebo vytvořit nový App Service v rámci existujícího App Service plánu.
Následující kroky provádějí ekvivalent az webapp up příkazu :
Vytvořte skupinu prostředků.
Skupina prostředků je kolekce souvisejících prostředků Azure. Vytvoření skupiny prostředků usnadňuje odstranění všech těchto prostředků najednou, když už je nepotřebujete. V Cloud Shell spuštěním následujícího příkazu vytvořte ve svém předplatném Azure skupinu prostředků. Nastavte umístění skupiny prostředků zadáním hodnoty
<your-region>. Výstup JSON se zobrazí v Cloud Shell po úspěšném dokončení příkazu.az group create -l <your-region> -n <your-resource-group>Vytvořte plán App Service.
Aplikace App Service běží uvnitř virtuálního počítače definovaného plánem App Service. Spuštěním následujícího příkazu vytvořte plán App Service a nahraďte vlastními hodnotami hodnoty a
<your-resource-group><your-appservice-plan>. Pro--is-linuxnasazení Pythonu se vyžaduje . Pokud chcete jiný cenový plán než výchozí plán F1 Free, použijteskuargument . Určuje--sku B1nižší cenovou úroveň výpočetních prostředků pro virtuální počítač. Plán můžete později snadno odstranit odstraněním skupiny prostředků.az appservice plan create -g <your-resource-group> -n <your-appservice-plan> --is-linux --sku B1Znovu uvidíte výstup JSON v okně Cloud Shell po úspěšném dokončení příkazu.
Vytvořte instanci App Service v plánu.
Spuštěním následujícího příkazu vytvořte instanci App Service v plánu a nahraďte názvem jedinečným v
<your-appservice>rámci Azure. Obvykle se používá osobní název nebo název společnosti společně s identifikátorem aplikace, například<your-name>-flaskpipelines. Příkaz selže, pokud se název už používá. Přiřazením App Service ke stejné skupině prostředků jako plán je snadné vyčistit všechny prostředky najednou.az webapp create -g <your-resource-group> -p <your-appservice-plan> -n <your-appservice> --runtime "Python|3.6"Poznámka
Pokud chcete nasadit kód současně s vytvořením služby App Service, můžete pomocí příkazu použít
--deployment-source-url--deployment-source-branchargumentyaz webapp createa . Další informace najdete v tématu az webapp create.Tip
Pokud se zobrazí chybová zpráva Plán (název) neexistuje a jste si jistí, že název plánu je správný, zkontrolujte, jestli je správná také skupina prostředků zadaná s argumentem a že plán, který identifikujete, je součástí
-gtéto skupiny prostředků. Pokud název skupiny prostředků překlepem napíšete, příkaz nenajde plán v této neexistující skupině prostředků a zobrazí tuto konkrétní chybu.Pokud vaše aplikace vyžaduje vlastní spouštěcí příkaz, použijte příkaz , jak je popsáno výše v části
az webapp config setaz webapp config set. Pokud například chcete přizpůsobit App Service pomocí skupiny prostředků, názvu aplikace a spouštěcího příkazu, spusťte:az webapp config set -g <your-resource-group> -n <your-appservice> --startup-file <your-startup-command-or-file>Výchozí App Service v tomto okamžiku obsahuje pouze výchozí kód aplikace. Teď můžete pomocí Azure Pipelines nasadit konkrétní kód aplikace.
Vyčištění prostředků
Pokud se chcete vyhnout průběžných poplatkům za všechny prostředky Azure, které jste v tomto názorném postupu vytvořili, jako je plán B1 App Service, odstraňte skupinu prostředků, která obsahuje App Service a plán App Service. Pokud chcete odstranit skupinu prostředků z Azure Portal, v levém navigačním panelu vyberte Skupiny prostředků. V seznamu skupin prostředků vyberte ... napravo od skupiny prostředků, kterou chcete odstranit, vyberte Odstranit skupinuprostředků a postupujte podle pokynů.
K odstranění skupin prostředků můžete použít také příkaz az group delete Cloud Shell příkazu .
Pokud chcete odstranit účet úložiště, který udržuje systém souborů pro Cloud Shell, za který se účtuje malý měsíční poplatek, odstraňte skupinu prostředků, která začíná na cloud-shell-storage-.