Sdílet prostřednictvím


Použití Azure Pipelines k sestavení a nasazení webové aplikace v Pythonu do služby Azure App Service

Služby Azure DevOps

V tomto kurzu se dozvíte, jak pomocí Služby Azure Pipelines pro kontinuální integraci a průběžné doručování (CI/CD) sestavit a nasadit webovou aplikaci v Pythonu do služby Azure App Service v Linuxu. Kanál automaticky sestaví a nasadí vaši webovou aplikaci v Pythonu do služby App Service, kdykoli dojde k potvrzení do úložiště kódu aplikace.

V tomto kurzu se naučíte:

  • Vytvořte webovou aplikaci v Pythonu a nahrajte ji do služby Azure App Service.
  • Připojte svůj projekt Azure DevOps k Azure.
  • Vytvořte kanál sestavení a nasazení specifický pro Azure Pipelines pro vaši aplikaci.
  • Spuštěním kanálu sestavte, otestujte a nasaďte do webové aplikace Azure App Service.
  • Nastavte trigger pro spuštění kanálu při každém potvrzení do úložiště.

Další informace o konceptech Služby Azure Pipelines najdete v následujícím videu:

Požadavky

produkt Požadavky
Azure DevOps – projekt Azure DevOps.
– Možnost spouštět potrubí na Microsoftem hostovaných agentech. Můžete si buď koupit paralelní úlohu, nebo požádat o bezplatnou úroveň.
– Základní znalost YAML a Azure Pipelines. Další informace viz Vytvoření první pipeline.
- Oprávnění:
     – Chcete-li vytvořit pipeline: Musíte být ve skupině Přispěvatelé a skupina musí mít oprávnění k vytvoření build pipeline nastavena na hodnotu Povolit. Členové skupiny Správci projektů můžou spravovat kanály.
    - Chcete-li vytvořit připojení služeb: Musíte mít roli Správce nebo Tvůrce pro připojení služeb .
GitHub – účet GitHubu.
připojení ke službě GitHub k autorizaci Azure Pipelines.
Azurový Předplatné služby Azure.
produkt Požadavky
Azure DevOps – projekt Azure DevOps.
- Samostatně hostovaný agent. Chcete-li ho vytvořit, podívejte se na agenty hostované na vlastním serveru.
– Základní znalost YAML a Azure Pipelines. Další informace viz Vytvoření první pipeline.
- Oprávnění:
    – Chcete-li vytvořit pipeline: Musíte být ve skupině Přispěvatelé a skupina musí mít oprávnění k vytvoření build pipeline nastavena na hodnotu Povolit. Členové skupiny Správci projektů můžou spravovat kanály.
    - Chcete-li vytvořit připojení služeb: Musíte mít roli Správce nebo Tvůrce pro připojení služeb .
GitHub – účet GitHubu.
připojení ke službě GitHub k autorizaci Azure Pipelines.
Azurový Předplatné služby Azure.

Konfigurace samohostovaného agenta

Stahování verzí Pythonu není podporováno u agentů sestavení v místním prostředí. Pokud chcete použít vlastního agenta v místním prostředí, musíte nakonfigurovat agenta pro spuštění Pythonu.

Pokud se chcete vyhnout problémům s kompatibilitou, v tomto případě se shodujte s verzí modulu runtime ve webové aplikaci 3.11 Azure App Services. Musíte předinstalovat verzi Pythonu. Pomocí úplného instalačního programu získejte verzi Pythonu kompatibilní s pipem.

Požadovaná verze Pythonu se musí přidat do mezipaměti nástrojů v místním agentu, aby ji úloha kanálu mohl používat. Mezipaměť nástrojů se obvykle nachází pod adresářem _work/_tool agenta. Alternativně můžete cestu přepsat proměnnou AGENT_TOOLSDIRECTORYprostředí . V adresáři nástrojů vytvořte následující adresářovou strukturu založenou na vaší verzi Pythonu:

$AGENT_TOOLSDIRECTORY/
    Python/
        {version number}/
            {platform}/
                {tool files}
            {platform}.complete

Číslo verze by mělo odpovídat formátu 1.2.3. Platforma by měla být x86 nebo x64. Soubory nástrojů by měly být rozbalené soubory verzí Pythonu. Měl by to být nula bajtový soubor, který vypadá jako {platform}.complete nebo x86.complete a to znamená, že je nástroj správně nainstalován ve vyrovnávací paměti.

Pokud chcete například použít Python 3.11 na 64bitovém počítači s Windows, vytvořte následující adresářovou strukturu:

$AGENT_TOOLSDIRECTORY/
    Python/
        3.11.4/
            x64/
                {python files}
            x64.complete

Pokud už počítač hostující agenta má verzi Pythonu, kterou chcete použít, můžete soubory zkopírovat do mezipaměti nástroje. Pokud nemáte verzi Pythonu, můžete si ji stáhnout z webu Pythonu.

Příprava ukázkové aplikace

  1. Rozvětvěte ukázkové úložiště na https://github.com/Microsoft/python-sample-vscode-flask-tutorial ve svém účtu na GitHubu.

  2. Naklonujte fork do místního počítače pomocí .git clone <your-forked-repository-url>.git

  3. Přejděte na místní klon pomocí a cd python-sample-vscode-flask-tutorialsestavte a spusťte aplikaci místně, abyste měli jistotu, že funguje.

    python -m venv .env
    source .env/Scripts/activate
    pip install --upgrade pip
    pip install -r ./requirements.txt
    export FLASK_APP=hello_app.webapp
    flask run
    
  4. Pokud chcete aplikaci otestovat, přejděte do http://localhost:5000 okna prohlížeče a ověřte, že se zobrazí název Visual Studio Flask Tutorial.

  5. Zavřete okno prohlížeče a pomocí kláves Ctrl+C zastavte server Flask.

Vytvoření a nasazení webové aplikace App Service

Vytvořte webovou aplikaci Azure App Service pomocí Cloud Shellu na webu Azure Portal. Pokud chcete použít Cloud Shell, přihlaste se k webu Azure Portal a vyberte na panelu nástrojů tlačítko Cloud Shell.

Snímek obrazovky s tlačítkem Azure Cloud Shell na panelu nástrojů webu Azure Portal

Cloud Shell se zobrazí v dolní části prohlížeče. Ujistěte se, že je Bash vybraný jako prostředí v rozevírací nabídce. Okno Cloud Shellu můžete maximalizovat, abyste získali více místa.

Snímek obrazovky Azure Cloud Shellu

Návod

Pokud chcete vložit do Cloud Shellu, použijte kombinaci kláves Ctrl+Shift+V nebo klikněte pravým tlačítkem myši a v místní nabídce vyberte Vložit .

Vytvoření a nasazení webové aplikace

  1. V Cloud Shellu naklonujte forkované úložiště do Azure následujícím příkazem a nahraďte <your-forked-repository-url> adresou URL vašeho forku úložiště.

    git clone <your-forked-repository-url>
    
  2. Změňte adresář na naklonovanou složku úložiště.

    cd python-sample-vscode-flask-tutorial
    
  3. Spuštěním příkazu az webapp up zřiďte webovou aplikaci App Service a proveďte první nasazení. Pomocí parametru --name <your-web-app-name> přiřaďte název, který je jedinečný v Rámci Azure, například osobní název nebo název společnosti spolu s identifikátorem aplikace, například --name <your-name>-flaskpipelines. Spuštění az webapp up bez parametrů přiřazuje náhodně vygenerovaný název webové aplikace, který je v Azure jedinečný.

    az webapp up --name <your-web-app-name>
    

Příkaz az webapp up rozpozná aplikaci jako aplikaci v Pythonu a provede následující akce:

  1. Vytvoří výchozí skupinu prostředků.
  2. Vytvoří výchozí plán služby App Service.
  3. Vytvoří webovou aplikaci s přiřazeným názvem. Aplikace URL je <your-web-app-name>.azurewebsites.net.
  4. Nasadí všechny soubory z aktuálního pracovního adresáře do archivu ZIP s povolenou automatizací sestavení.
  5. Ukládá parametry do mezipaměti místně v souboru .azure/config , takže je nemusíte při nasazování ze složky projektu zadávat znovu pomocí az webapp up jiných az webapp příkazů. Příkazy ve výchozím nastavení používají hodnoty uložené v mezipaměti automaticky.

Výchozí akce můžete přepsat vlastními hodnotami pomocí parametrů příkazu. Další informace najdete v az webapp up.

Příkaz az webapp up vytvoří následující výstup JSON pro ukázkovou webovou aplikaci:

{
  "URL": <your-web-app-url>,
  "appserviceplan": <your-app-service-plan-name>,
  "location": <your-azure-region>,
  "name": <your-web-app-name>,
  "os": "Linux",
  "resourcegroup": <your-resource-group>,
  "runtime_version": "python|3.11",
  "runtime_version_detected": "-",
  "sku": <sku>,
  "src_path": <repository-source-path>
}

Poznamenejte si URLhodnoty a hodnoty resourcegroup, runtime_version které se mají použít později v tomto kurzu.

Nastavení spouštěcího příkazu

Aplikace python-sample-vscode-flask-tutorial obsahuje startup.txt soubor, který obsahuje konkrétní spouštěcí příkaz pro webovou aplikaci. Nastavte vlastnost startup-file konfigurace webové aplikace startup.txt tak, že zadáte následující příkaz a použijete názvy skupin prostředků a webových aplikací.

az webapp config set --resource-group <your-resource-group> --name <your-web-app-name> --startup-file startup.txt

Po dokončení příkazu se ve výstupu JSON zobrazí všechna nastavení konfigurace vaší webové aplikace.

Pokud chcete zobrazit spuštěnou aplikaci, otevřete prohlížeč a přejděte na URL ve výstupu příkazu. Pokud se zobrazí obecná stránka, počkejte několik sekund, než se služba App Service spustí, a pak stránku aktualizujte. Ověřte, že se zobrazí název Visual Studio Flask Tutorial.

Připojení projektu Azure DevOps k předplatnému Azure

Pokud chcete k nasazení do webové aplikace Azure App Service použít Azure Pipelines, musíte svůj projekt Azure DevOps připojit k prostředkům Azure.

Vytvoření principálu služby

Instanční objekt je identita vytvořená pro aplikace, hostované služby a automatizované nástroje pro přístup k prostředkům Azure. Tento přístup je omezený na role přiřazené k instančnímu objektu a poskytuje vám kontrolu nad tím, ke kterým prostředkům je možné přistupovat na jaké úrovni.

Pokud chcete vytvořit instanční objekt, spusťte v Prostředí Bash Cloud Shell následující příkaz. Nahraďte <service-principal-name> názvem vašeho instančního objektu, <your-subscription-id> ID předplatného Azure a <your-resource-group> skupinou prostředků pro webovou aplikaci.

az ad sp create-for-rbac --display-name <service-principal-name> --role contributor --scopes /subscriptions/<your-subscription-id>/resourceGroups/<your-resource-group>

Příkaz vrátí následující objekt JSON:

{
  "appId": "<client GUID>",
  "displayName": "<service-principal-name">,
  "password": "<password-string>",
  "tenant": "<tenant GUID>"
  ...
}

Poznamenejte appIdsi hodnoty a passwordhodnoty, tenantId které se mají použít k vytvoření připojení služby v další části.

Vytvořte připojení služby

Připojení služby poskytuje ověřený přístup ze služby Azure Pipelines k externím a vzdáleným službám. Pokud chcete nasadit do webové aplikace Azure App Service, vytvořte připojení služby ke skupině prostředků vaší webové aplikace.

  1. Na stránce projektu Azure DevOps vyberte Nastavení projektu.

  2. V nastavení projektu vybertepřipojení služby> Service.

  3. Na stránce Připojení služby vyberte Nové připojení služby nebo Vytvořit připojení služby , pokud je toto připojení služby první v projektu.

    Snímek obrazovky s výběrem připojení služby Pipeline Service v nastavení projektu

  4. Na obrazovce Připojení k nové službě vyberte Azure Resource Manager a pak vyberte Další.

    Snímek obrazovky s výběrem připojení ke službě Azure Resource Manager

  5. Na obrazovce Připojení k nové službě Azure vyberte typ identity. V tomto příkladu se používá registrace aplikace (automatická), která se doporučuje. Další informace o metodách ověřování najdete v tématu Připojení k Azure pomocí připojení služby Azure Resource Manager.

  6. U přihlašovacích údajů vyberte Federaci identit úloh (automaticky).

  7. Vyplňte následující pole:

    • Úroveň oboru: Vyberte předplatné.
    • Předplatné: Vyberte své předplatné Azure.
    • Skupina prostředků: Vyberte skupinu prostředků, která obsahuje vaši webovou aplikaci.
    • Název připojení služby: Zadejte popisný název připojení.
    • Udělte přístupová oprávnění všem kanálům: Toto políčko zaškrtněte, pokud chcete udělit přístup ke všem kanálům v projektu.
  8. Zvolte Uložit.

    Snímek obrazovky s dialogovým oknem Nové připojení ke službě Azure

  1. Na stránce projektu Azure DevOps vyberte Nastavení projektu.

  2. V nastavení projektu vybertepřipojení služby> Service.

  3. Na stránce Připojení služby vyberte Nové připojení služby nebo Vytvořit připojení služby , pokud je toto připojení služby první v projektu.

    Snímek obrazovky s tlačítkem nastavení projektu na řídicím panelu projektu

  4. Na obrazovce Připojení k nové službě vyberte Azure Resource Manager a pak vyberte Další.

    Snímek obrazovky znázorňující výběr Azure Resource Manageru

  5. Vyberte Instanční objekt (ruční) a pak vyberte Další.

    Snímek obrazovky znázorňující výběr metody ověřování instančního objektu (ruční)

  6. Na obrazovce Připojení k nové službě Azure vyplňte následující pole:

    • Prostředí: Vyberte Azure Cloud.
    • Úroveň oboru: Vyberte předplatné.
    • ID předplatného: Zadejte ID předplatného Azure.
    • Název předplatného: Zadejte název předplatného Azure.
  7. V části Ověřování vyplňte následující pole:

    • ID instančníhoappId objektu: Zadejte hodnotu vrácenou příkazemaz ad sp create-for-rbac.
    • Přihlašovací údaje: Vyberte klíč instančního objektu.
    • Klíč instančníhopassword objektu: Zadejte hodnotu vrácenou příkazemaz ad sp create-for-rbac.
    • ID tenanta: Zadejte tenant hodnotu vrácenou příkazem az ad sp create-for-rbac .
    • Výběrem možnosti Ověřit ověřte připojení.
  8. V části Podrobnosti v části Název připojení služby zadejte název připojení služby.

  9. Zaškrtněte políčko Udělovat přístupová oprávnění všem kanálům.

  10. Vyberte Ověřit a uložit.

    Snímek obrazovky s horní částí obrazovky pro připojení k nové službě

Nové připojení se zobrazí v seznamu připojení služby a je připravené k použití ve vašem kanálu.

Vytvořit potrubí

Vytvořte kanál pro sestavení a nasazení webové aplikace v Pythonu do služby Aplikace Azure Service.

  1. V levé navigační nabídce projektu vyberte Kanály.

  2. Na stránce Pipelines (Kanály ) vyberte New pipeline (Nový kanál) nebo Create pipeline (Vytvořit kanál , pokud je tento kanál v projektu prvním kanálem).

    Snímek obrazovky s tlačítkem nový kanál v seznamu kanálů

  3. Na obrazovce Kde je váš kód , vyberte GitHub. Může se zobrazit výzva k přihlášení k GitHubu.

    Snímek obrazovky s výběrem GitHubu jako umístění kódu

  4. Na obrazovce Vybrat úložiště vyberte svůj forkovaný ukázkový úložiště. GitHub vás může vyzvat k opětovnému zadání hesla GitHubu nebo k instalaci aplikace Azure Pipelines Na GitHubu. Nainstalujte aplikaci podle pokynů na obrazovce. Další informace najdete v tématu Ověřování aplikací GitHubu.

    Snímek obrazovky s výběrem úložiště

  5. Na stránce Konfigurace kanálu vyberte Python do linuxové webové aplikace v Azure.

  6. Na další obrazovce vyberte své předplatné Azure a vyberte Pokračovat.

  7. Na další obrazovce vyberte webovou aplikaci Azure a vyberte Ověřit a nakonfigurovat.

Azure Pipelines vytvoří soubor azure-pipelines.yml a zobrazí ho v editoru kanálů YAML.

  1. V levé navigační nabídce projektu vyberte Kanály.

  2. Na stránce Pipelines (Kanály ) vyberte New pipeline (Nový kanál) nebo Create pipeline (Vytvořit kanál , pokud je tento kanál v projektu prvním kanálem).

    Snímek obrazovky s tlačítkem nový kanál v seznamu kanálů

  3. Na stránce Kde je kód , vyberte GitHub Enterprise Server. Může se zobrazit výzva k přihlášení k GitHubu.

    Snímek obrazovky s výběrem GitHubu jako umístění kódu

  4. Na kartě Vybrat úložiště vyberte forkované ukázkové úložiště. GitHub vás může vyzvat, abyste znovu zadali heslo GitHubu nebo nainstalovali rozšíření Nebo aplikaci Azure Pipelines na GitHubu. Nainstalujte aplikaci podle pokynů na obrazovce. Další informace najdete v tématu Přístup k úložištím GitHub.

    Snímek obrazovky s výběrem úložiště

  5. Na stránce Konfigurace kanálu vyberte Počáteční kanál.

  6. Na stránce Kontrola kanálu YAML nahraďte obsah úvodního azure-pipelines.yml souboru následujícím souborem kanálu YAML. V souboru YAML:

    • <your-service-connection-name> Nahraďte zástupné <your-web-app-name> symboly vlastními hodnotami.

    • Nahraďte <your-pool-name> názvem fondu agentů, který chcete použít, a nahraďte <your-python-version> verzí Pythonu spuštěnou ve vašem agentu. Tato verze by se měla shodovat s výstupem runtime_versionaz webapp up JSON příkazu.

Soubor potrubí YAML

Na stránce Kontrola kanálu YAML se podívejte 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. Informace o schématu souboru YAML kanálu najdete v referenčních informacích ke schématu YAML.

Následující úplný příklad souboru kanálu YAML definuje kanál CI/CD jako řadu fází, úloh a kroků, kde každý krok obsahuje podrobnosti o různých úlohách a skriptech. Vygenerovaný kód YAML automaticky naplní zástupné symboly hodnotami pro vaši aplikaci a připojení.

trigger:
- main

variables:
  # Azure Resource Manager connection created during pipeline creation
  azureServiceConnectionId: '<GUID>'

  # Web app name
  webAppName: '<your-webapp-name>'

  # Agent VM image name
  vmImageName: 'ubuntu-latest'

  # Environment name
  environmentName: '<your-webapp-name>'

  # Project root folder. Point to the folder containing manage.py file.
  projectRoot: $(System.DefaultWorkingDirectory)

  pythonVersion: '3.11'

stages:
- stage: Build
  displayName: Build stage
  jobs:
  - job: BuildJob
    pool:
      vmImage: $(vmImageName)
    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 setuptools
        pip install -r requirements.txt
      workingDirectory: $(projectRoot)
      displayName: "Install requirements"

    - task: ArchiveFiles@2
      displayName: 'Archive files'
      inputs:
        rootFolderOrFile: '$(projectRoot)'
        includeRootFolder: false
        archiveType: zip
        archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
        replaceExistingArchive: true

    - upload: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
      displayName: 'Upload package'
      artifact: drop

- stage: Deploy
  displayName: 'Deploy Web App'
  dependsOn: Build
  condition: succeeded()
  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
trigger:
- main

variables:
  # Azure Resource Manager connection created during pipeline creation
  azureServiceConnectionId: '<your-service-connection-name>'

  # Web app name
  webAppName: '<your-web-app-name>'

  # Environment name
  environmentName: '<your-web-app-name>'

  # Project root folder. 
  projectRoot: $(System.DefaultWorkingDirectory)

  # Python version: 
  pythonVersion: '<your-python-version>'

stages:
- stage: Build
  displayName: Build stage
  jobs:
  - job: BuildJob
pool:
      name: '<your-pool-name>'
      demands: python
    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 -r requirements.txt
      workingDirectory: $(projectRoot)
      displayName: "Install requirements"

    - task: ArchiveFiles@2
      displayName: 'Archive files'
      inputs:
        rootFolderOrFile: '$(projectRoot)'
        includeRootFolder: false
        archiveType: zip
        archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
        replaceExistingArchive: true

    - task: PublishBuildArtifacts@1
      inputs:
        PathtoPublish: '$(Build.ArtifactStagingDirectory)'
        ArtifactName: 'drop'
        publishLocation: 'Container'

- stage: Deploy
  displayName: 'Deploy Web App'
  dependsOn: Build
  condition: succeeded()
  jobs:
  - deployment: DeploymentJob
    pool:
      name: '<your-pool-name'
    environment: $(environmentName)
    strategy:
      runOnce:
        deploy:
          steps:

          - task: UsePythonVersion@0
            inputs:
              versionSpec: '$(pythonVersion)'
            displayName: 'Use Python version'

          - task: AzureWebApp@1
            displayName: 'Deploy Azure Web App : <your-web-app-name>'
            inputs:
              azureSubscription: $(azureServiceConnectionId)
              appName: $(webAppName)
              package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip
              startUpCommand: 'startup.txt'

Proměnné

Oddíl variables na začátku souboru YAML definuje následující proměnné:

Proměnná Popis
azureServiceConnectionId ID připojení služby Azure Resource Manager.
webAppName Název webové aplikace App Service
vmImageName Název operačního systému, který má být použit pro agenta sestavování.
environmentName Název prostředí, do kterého se má nasadit, se automaticky vytvoří při spuštění úlohy nasazení.
projectRoot Kořenová složka obsahující kód aplikace.
pythonVersion Verze Pythonu, kterou mají používat agenty pro sestavení a nasazení.
Proměnná Popis
azureServiceConnectionId ID připojení služby Azure Resource Manager.
webAppName Název webové aplikace App Service
environmentName Název prostředí, do kterého se má nasadit, se automaticky vytvoří při spuštění úlohy nasazení.
projectRoot Složka obsahující kód aplikace. Hodnota je automatická systémová proměnná.
pythonVersion Verze Pythonu, kterou mají používat agenty pro sestavení a nasazení.

Fáze sestavení a nasazení

Kanál se skládá z fází sestavení a nasazení.

Fáze vytváření

Fáze sestavení obsahuje jednu úlohu, která běží v operačním systému definovaném vmImageName v proměnné, v tomto případě ubuntu-latest.

  - job: BuildJob
    pool:
      vmImage: $(vmImageName)

Fáze sestavení obsahuje jednu úlohu, která běží na agentu pool v identifikovaném parametrem name .

Funkce agenta můžete zadat pomocí klíčového demands slova. Určuje například, demands: python že agent musí mít nainstalovaný Python. Pokud chcete zadat agenta v místním prostředí podle názvu, můžete použít demands: Agent.Name -equals <agent-name>.

  - job: BuildJob
    pool:
      name: <your-pool-name>
      demands: python

Úloha obsahuje několik kroků:

  1. Nejprve úloha UsePythonVersion vybere verzi Pythonu, která se má použít, jak je definována pythonVersion v proměnné.

       - task: UsePythonVersion@0
          inputs:
            versionSpec: '$(pythonVersion)'
            displayName: 'Use Python $(pythonVersion)'
    
  2. V dalším kroku se používá skript, který vytvoří virtuální prostředí Pythonu a nainstaluje závislosti aplikace z requirements.txt. Parametr workingDirectory určuje umístění kódu aplikace.

       - script: |
            python -m venv antenv
            source antenv/bin/activate
            python -m pip install --upgrade pip
            pip install setuptools
            pip install  -r ./requirements.txt
          workingDirectory: $(projectRoot)
          displayName: "Install requirements"
    
  3. Úloha ArchiveFiles vytvoří archiv ZIP, který obsahuje vytvořenou webovou aplikaci.

        - task: ArchiveFiles@2
          displayName: 'Archive files'
          inputs:
            rootFolderOrFile: '$(projectRoot)'
            includeRootFolder: false
            archiveType: zip
            archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
            replaceExistingArchive: true
    

    Parametry jsou nastaveny takto:

    Parametr Popis
    rootFolderOrFile Umístění kódu aplikace.
    includeRootFolder Zda zahrnout kořenovou složku do souboru.zip . Nastavte na false. Pokud je nastavená hodnota true, obsah souboru .zip se vloží do složky s názvem s a úloha nemůže najít kód aplikace.
    archiveType Typ archivu, který chcete vytvořit. Nastavte na zip.
    archiveFile Umístění souboru .zip , který se má vytvořit.
    replaceExistingArchive Určuje, zda se má nahradit existující archiv, pokud soubor již existuje. Nastavte na true.
  4. Soubor .zip se pak nahraje do kanálu jako artefakt s názvem drop. Fáze nasazení používá k nasazení aplikace soubor .zip .

        - upload: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
          displayName: 'Upload package'
          artifact: drop
    
    • Parametr upload nastaví umístění a název souboru.zip k nahrání.
    • Parametr artifact nastaví název vytvořeného artefaktu na drop.

Fáze nasazení

Fáze nasazení se spustí, pokud se fáze sestavení úspěšně dokončí. Toto dependsOn chování definují klíčová slova.condition

  dependsOn: Build
  condition: succeeded()

Fáze nasazení obsahuje jednu úlohu nasazení nakonfigurovanou následujícím způsobem.

  - deployment: DeploymentJob
    pool:
      vmImage: $(vmImageName)
    environment: $(environmentName)
  • Klíčové deployment slovo označuje, že úloha je úloha, která cílí na prostředí , do kterého se má nasadit. Při environment spuštění úlohy se ve vašem projektu automaticky vytvoří.

  • Parametr pool určuje fond agentů nasazení a používá výchozí fond agentů, pokud name není zadaný. Agent běží v operačním systému definovaném vmImageName v proměnné, v tomto případě ubuntu-latest.

  - deployment: DeploymentJob
    pool:
      name: <your-pool-name>
    environment: $(environmentName)
  • Klíčové deployment slovo označuje, že úloha je úloha, která cílí na prostředí , do kterého se má nasadit. Při environment spuštění úlohy se ve vašem projektu automaticky vytvoří.

  • Parametr pool určuje fond agentů nasazení a musí obsahovat agenta s možností spuštění verze Pythonu zadané v kanálu.

Klíčové strategy slovo definuje strategii nasazení.

  strategy:
    runOnce:
      deploy:
        steps:
  • Klíčové slovo runOnce určuje, že se úloha nasazení spustí pouze jednou.
  • Klíčové deploy slovo určuje steps spuštění v úloze nasazení.

V steps této fázi spusťte následující úlohy:

  1. UsePythonVersion@0 vybere verzi Pythonu, která se má použít, stejně jako ve fázi sestavení.
  2. AzureWebApp@1 nasadí webovou aplikaci a drop artefakt ZIP.
- task: AzureWebApp@1
    displayName: 'Deploy Azure Web App : <your-web-app-name>'
  inputs:
    azureSubscription: $(azureServiceConnectionId)
    appName: $(webAppName)
    package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip
  • Parametr azureSubscription obsahuje azureServiceConnectionId zadané proměnné kanálu.
  • Obsahuje appName hodnotu webAppName proměnné.
  • Určuje package název a umístění souboru.zip , který se má nasadit.

Vzhledem k tomu, že úložiště python-vscode-flask-tutorial obsahuje spouštěcí příkaz aplikace v souboru s názvem startup.txt, můžete zadat spouštěcí příkaz aplikace přidáním parametru: startUpCommand: 'startup.txt'.

Spustit potrubí

Teď můžete kanál vyzkoušet.

  1. V editoru kanálů vyberte Uložit a spustit.

  2. Na obrazovce Uložit a spustit přidejte v případě potřeby zprávu potvrzení a pak vyberte Uložit a spustit.

    Spuštění kanálu můžete sledovat výběrem dílčích fází nebo úloh na stránce Souhrn kanálu. Každá úloha a fáze zobrazí při úspěšném dokončení zelenou značku zaškrtnutí. Pokud dojde k chybám, zobrazí se v souhrnu nebo v krocích úlohy.

    Snímek obrazovky části s přehledem stadií spuštění kanálu

    Do editoru YAML se můžete rychle vrátit tak, že vyberete svislé tečky v pravém horním rohu na stránce Souhrn a vyberete Upravit kanál.

    Snímek obrazovky komentáře z editačního procesu ze sestavy sestavení.

  3. V úloze nasazení vyberte úlohu Deploy Azure Web App (Nasadit webovou aplikaci Azure) a zobrazte její výstup.

    Snímek obrazovky kroků fáze procesu

  4. Ve výstupu vyberte adresu URL za adresou URL aplikace služby App Service. Aplikace by se měla zobrazit takto:

    Snímek obrazovky s zobrazením ukázkové aplikace spuštěné ve službě App Service

Poznámka:

Pokud nasazení aplikace selže kvůli chybějící závislosti, souborrequirements.txt se během nasazování nezpracoval. K tomuto problému může dojít v případě, že webovou aplikaci vytvoříte přímo na portálu az webapp up , a ne pomocí příkazu.

Příkaz az webapp up nastaví konkrétně akci sestavení SCM_DO_BUILD_DURING_DEPLOYMENT na true. Pokud zřídíte službu App Service prostřednictvím portálu, tato akce se nenastaví automaticky.

Nastavení této akce:

  1. Na stránce portálu vaší webové aplikace vyberte v levé navigační nabídce možnost Konfigurace .
  2. Na kartě Nastavení aplikace vyberte Nové nastavení aplikace.
  3. V místní nabídce, která se zobrazí, nastavte Název na SCM_DO_BUILD_DURING_DEPLOYMENT, nastavte Hodnotu na true a vyberte OK.
  4. V horní části stránky Konfigurace vyberte Uložit.
  5. Opětovné spuštění kanálu Závislosti by se teď měly nainstalovat během nasazení.

Aktivace spuštění kanálu

Tento kanál se nastaví tak, aby se spustil při každé kontrole změn v úložišti kódu. Pro spuštění pipeline proveďte změnu v úložišti. Můžete například do aplikace přidat novou funkci nebo aktualizovat závislosti aplikace.

  1. Přejděte do úložiště GitHub pro vaši aplikaci.
  2. Změňte kód, například změňte název aplikace.
  3. Potvrďte změnu.
  4. Přejděte do kanálu a ověřte, že je vytvořené a spuštěné nové spuštění.
  5. Po dokončení spuštění ověřte, že se změna nasadila do vaší webové aplikace.
  6. Na webu Azure Portal přejděte do webové aplikace a v levé navigační nabídce vyberte Deployment Center .
  7. Vyberte kartu Protokoly a ověřte, že je uvedené nové nasazení.

Nasazení aplikací Django do služby App Service

Pokud používáte samostatnou databázi, můžete pomocí Azure Pipelines nasadit aplikace Django do služby App Service v Linuxu. Databázi SQLite nemůžete použít, protože App Service uzamkne soubor db.sqlite3 , což brání čtení i zápisu. Toto chování nemá vliv na externí databáze.

Jak je vysvětleno v procesu spuštění kontejneru, App Service automaticky hledá soubor wsgi.py v kódu aplikace, který obvykle obsahuje objekt aplikace. Pokud chcete přizpůsobit spouštěcí příkaz, použijte startUpCommand parametr v AzureWebApp@1 kroku souboru kanálu YAML.

Když používáte Django, obvykle chcete migrovat datové modely pomocí manage.py migrate po nasazení kódu aplikace. Můžete přidat skript po nasazení startUpCommand k tomuto účelu. Tady je například startUpCommand vlastnost v úloze AzureWebApp@1.

  - task: AzureWebApp@1
      displayName: 'Deploy Azure Web App : $(webAppName)'
      inputs:
        azureSubscription: $(azureServiceConnectionId)
        appName: $(webAppName)
        package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip
        startUpCommand: 'python manage.py migrate'

Spouštění testů na agentu sestavení

V rámci procesu sestavení můžete chtít spouštět testy kódu aplikace. Testy běží na agentu sestavení, takže je potřeba nainstalovat závislosti do virtuálního prostředí na agenta sestavení. Po spuštění testů odstraňte testovací virtuální prostředí před vytvořením souboru.zip pro nasazení.

Tento proces ilustrují následující prvky skriptu. Umístěte je do souboru ArchiveFiles@2 před úkol . Další informace najdete v tématu Spouštění skriptů pro různé platformy.

# The | symbol is a continuation character, indicating a multi-line script.
# A single-line script can immediately follow "- script:".
- script: |
    python -m venv .env
    source .env/bin/activate
    pip install setuptools
    pip 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'

K publikování výsledků testu do vaší pipeline můžete použít také úlohu, jako je PublishTestResults@2. Další informace naleznete v tématu Spouštění testů.

Vyčištění prostředků

Pokud jste dokončili prostředky Azure, které jste vytvořili v tomto kurzu, odstraňte je, abyste se vyhnuli dalším poplatkům.

  • Odstraňte projekt Azure DevOps, který jste vytvořili. Odstraněním projektu se odstraní datový tok a připojení služby.
  • Odstraňte skupinu prostředků Azure, která obsahuje službu App Service a plán služby App Service. Na webu Azure Portal přejděte do skupiny prostředků, vyberte Odstranit skupinu prostředků a postupujte podle pokynů.
  • Odstraňte účet úložiště Azure, který udržuje systém souborů Cloud Shellu. Zavřete Cloud Shell a vyhledejte skupinu prostředků, která začíná cloud-shell-storage-. Vyberte Odstranit skupinu prostředků a postupujte podle pokynů.