Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Azure DevOps-tjänster
Den här självstudien visar hur du använder Azure Pipelines för kontinuerlig integrering och kontinuerlig leverans (CI/CD) för att skapa och distribuera en Python-webbapp till Azure App Service i Linux. Din pipeline skapar och distribuerar automatiskt python-webbappen till App Service när det sker en incheckning till din appkodlagringsplats.
I den här handledningen kommer du att:
- Skapa en Python-webbapp och ladda upp den till Azure App Service.
- Anslut ditt Azure DevOps-projekt till Azure.
- Skapa en Azure Pipelines Python-specifik bygg- och distributionspipeline för din app.
- Kör pipelinen för att skapa, testa och distribuera till din Azure App Service-webbapp.
- Ange en utlösare för att köra pipelinen när du checkar in på lagringsplatsen.
Om du vill veta mer om Azure Pipelines-begrepp kan du titta på följande video:
Förutsättningar
| Produkt | Krav | 
|---|---|
| Azure DevOps | – Ett Azure DevOps-projekt. – En möjlighet att köra pipelines på Microsoft-hanterade agenter. Du kan antingen köpa ett parallellt jobb eller begära en kostnadsfri nivå. – Grundläggande kunskaper om YAML och Azure Pipelines. Mer information finns i Skapa din första pipeline. - Behörigheter: – Om du vill skapa en pipeline: du måste vara i gruppen Deltagare och gruppen måste ha behörigheten Skapa byggpipeline inställd på Tillåt. Medlemmar i gruppen Projektadministratörer kan hantera pipelines. – För att skapa tjänstanslutningar: Du måste ha rollen Administratör eller Skapare för tjänstanslutningar. | 
| GitHub (på engelska) | – Ett GitHub-konto . – En GitHub-tjänstanslutning för att auktorisera Azure Pipelines. | 
| Blått | En prenumeration på Azure. | 
| Produkt | Krav | 
|---|---|
| Azure DevOps | – Ett Azure DevOps-projekt. - En lokalt installerad agent. Information om hur du skapar en finns i Lokalt installerade agenter. – Grundläggande kunskaper om YAML och Azure Pipelines. Mer information finns i Skapa din första pipeline. - Behörigheter: – Om du vill skapa en pipeline: du måste vara i gruppen Deltagare och gruppen måste ha behörigheten Skapa byggpipeline inställd på Tillåt. Medlemmar i gruppen Projektadministratörer kan hantera pipelines. – För att skapa tjänstanslutningar: Du måste ha rollen Administratör eller Skapare för tjänstanslutningar. | 
| GitHub (på engelska) | – Ett GitHub-konto . – En GitHub-tjänstanslutning för att auktorisera Azure Pipelines. | 
| Blått | En prenumeration på Azure. | 
Konfigurera en lokalt installerad agent
Nedladdning av Python-versioner stöds inte på lokala byggagenter. Om du vill använda en egen lokalt installerad agent måste du konfigurera agenten så att den kör Python.
För att undvika kompatibilitetsproblem matchar du Python-versionen med körningsversionen i din Azure App Services-webbapp, 3.11 i det här fallet. Du måste förinstallera Python-versionen. Använd det fullständiga installationsprogrammet för att hämta en pip-kompatibel version av Python.
Den önskade Python-versionen måste läggas till i verktygscacheminnet på den lokalt installerade agenten så att pipelineaktiviteten kan använda den. Normalt finns verktygscachen under _work/_tool-katalogen för agenten. Du kan också åsidosätta sökvägen med miljövariabeln AGENT_TOOLSDIRECTORY. Under verktygskatalogen skapar du följande katalogstruktur baserat på din Python-version:
$AGENT_TOOLSDIRECTORY/
    Python/
        {version number}/
            {platform}/
                {tool files}
            {platform}.complete
Versionsnumret bör följa formatet 1.2.3. Plattformen ska antingen vara x86 eller x64. Verktygsfilerna ska vara de uppackade Python-versionsfilerna. 
              {platform}.complete Ska vara en 0-byte-fil som ser ut som x86.complete eller x64.complete som bara betyder att verktyget är korrekt installerat i cacheminnet.
Om du till exempel vill använda Python 3.11 på en 64-bitars Windows-dator skapar du följande katalogstruktur:
$AGENT_TOOLSDIRECTORY/
    Python/
        3.11.4/
            x64/
                {python files}
            x64.complete
Om den dator som är värd för din agent redan har den Python-version som du vill använda kan du kopiera filerna till verktygscacheminnet. Om du inte har Python-versionen kan du ladda ned den från Python-webbplatsen.
Förbereda exempelappen
- Förgrena exempellagringsplatsen till https://github.com/Microsoft/python-sample-vscode-flask-tutorial ditt GitHub-konto. 
- Klona din förgrening till den lokala datorn med hjälp - git clone <your-forked-repository-url>.gitav .
- Gå till din lokala klon med hjälp - cd python-sample-vscode-flask-tutorialav och skapa och kör appen lokalt för att se till att den fungerar.- 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
- Om du vill testa appen går du till http://localhost:5000 i ett webbläsarfönster och kontrollerar att du ser rubriken Visual Studio Flask-självstudie. 
- Stäng webbläsarfönstret och stoppa Flask-servern med ctrl+C. 
Skapa och distribuera App Service-webbappen
Skapa din Azure App Service-webbapp med hjälp av Cloud Shell i Azure-portalen. Om du vill använda Cloud Shell loggar du in på Azure-portalen och väljer knappen Cloud Shell i verktygsfältet.
              
               
              
              
            
Cloud Shell visas längst ned i webbläsaren. Kontrollera att Bash är valt som miljö i den nedrullningsbara menyn. Du kan maximera Cloud Shell-fönstret för att ge dig själv mer utrymme.
              
               
              
              
            
Dricks
Om du vill klistra in i Cloud Shell använder du Ctrl+Skift+V eller högerklickar och väljer Klistra in på snabbmenyn.
Skapa och distribuera webbappen
- I Cloud Shell klonar du din förgrenade lagringsplats till Azure med följande kommando och ersätter - <your-forked-repository-url>med URL:en för din förgrenade lagringsplats.- git clone <your-forked-repository-url>
- Ändra katalog till den klonade lagringsplatsens mapp. - cd python-sample-vscode-flask-tutorial
- Kör kommandot az webapp up för att etablera App Service-webbappen och göra den första distributionen. Använd parametern - --name <your-web-app-name>för att tilldela ett namn som är unikt i Azure, till exempel ett personligt namn eller ett företagsnamn tillsammans med en appidentifierare, till exempel- --name <your-name>-flaskpipelines. Om du kör- az webapp uputan parametrar tilldelas ett slumpmässigt genererat webbappnamn som är unikt i Azure.- az webapp up --name <your-web-app-name>
Kommandot az webapp up identifierar appen som en Python-app och vidtar följande åtgärder:
- Skapar en standardresursgrupp.
- Skapar en standardplan för App Service.
- 
              Skapar en webbapp med det tilldelade namnet. Appen URLär<your-web-app-name>.azurewebsites.net.
- Distribuerar alla filer från den aktuella arbetskatalogen till ett ZIP-arkiv med versionsautomation aktiverat.
- Cachelagrar parametrarna lokalt i .azure/config-filen så att du inte behöver ange dem igen när du distribuerar från projektmappen med az webapp upeller andraaz webappkommandon. Kommandona använder de cachelagrade värdena automatiskt som standard.
Du kan åsidosätta standardåtgärderna med dina egna värden med hjälp av kommandoparametrarna. För mer information, se az webapp up.
Kommandot az webapp up genererar följande JSON-utdata för exempelwebbappen:
{
  "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>
}
Registrera värdena URL, resourcegroupoch som runtime_version ska användas senare i den här självstudien.
Ange startkommandot
              Python-sample-vscode-flask-tutorial-appen har en startup.txt fil som innehåller det specifika startkommandot för webbappen. Ange konfigurationsegenskapen för webbappen startup-file genom att startup.txt ange följande kommando med hjälp av resursgruppen och webbappens namn.
az webapp config set --resource-group <your-resource-group> --name <your-web-app-name> --startup-file startup.txt
När kommandot har slutförts visar JSON-utdata alla konfigurationsinställningar för webbappen.
Om du vill se den körande appen, öppna en webbläsare och gå till den URL som visas i az webapp up kommandoutmatning. Om du ser en allmän sida väntar du några sekunder tills App Service startar och uppdaterar sedan sidan. Kontrollera att du ser rubriken Visual Studio Flask-självstudie.
Ansluta ditt Azure DevOps-projekt till din Azure-prenumeration
Om du vill använda Azure Pipelines för att distribuera till din Azure App Service-webbapp måste du ansluta ditt Azure DevOps-projekt till dina Azure-resurser.
Skapa ett huvudnamn för tjänsten
Ett huvudnamn för tjänsten är en identitet som skapats för program, värdbaserade tjänster och automatiserade verktyg för åtkomst till Azure-resurser. Den här åtkomsten är begränsad till de roller som tilldelats tjänstens huvudnamn, vilket ger dig kontroll över vilka resurser som kan nås på vilken nivå.
Om du vill skapa ett huvudnamn för tjänsten kör du följande kommando i Bash Cloud Shell. Ersätt <service-principal-name> med ett namn för tjänstens huvudnamn, <your-subscription-id> med ditt Azure-prenumerations-ID och <your-resource-group> med resursgruppen för webbappen.
az ad sp create-for-rbac --display-name <service-principal-name> --role contributor --scopes /subscriptions/<your-subscription-id>/resourceGroups/<your-resource-group>
Kommandot returnerar följande JSON-objekt:
{
  "appId": "<client GUID>",
  "displayName": "<service-principal-name">,
  "password": "<password-string>",
  "tenant": "<tenant GUID>"
  ...
}
Anteckna värdena appId, passwordoch som tenantId ska användas för att skapa en tjänstanslutning i nästa avsnitt.
Skapa en tjänstanslutning
En tjänstanslutning ger autentiserad åtkomst från Azure Pipelines till externa tjänster och fjärrtjänster. Om du vill distribuera till din Azure App Service-webbapp skapar du en tjänstanslutning till resursgruppen för din webbapp.
- På sidan Azure DevOps-projekt väljer du Projektinställningar. 
- I Projektinställningar väljer du Pipelines>Service-anslutningar. 
- På sidan Tjänstanslutningar väljer du Ny tjänstanslutning eller Skapa tjänstanslutning om den här tjänstanslutningen är den första i projektet.   
- På skärmen Ny tjänstanslutning väljer du Azure Resource Manager och sedan Nästa.   
- På skärmen Ny Azure-tjänstanslutning väljer du din identitetstyp. I det här exemplet används appregistrering (automatisk), vilket rekommenderas. Mer information om autentiseringsmetoder finns i Ansluta till Azure med hjälp av en Azure Resource Manager-tjänstanslutning. 
- För Autentiseringsuppgifter väljer du Arbetsbelastningsidentitetsfederation (automatisk). 
- Slutför följande fält: - Omfångsnivå: Välj Prenumeration.
- Prenumeration: Välj din Azure-prenumeration.
- Resursgrupp: Välj den resursgrupp som innehåller webbappen.
- Tjänstanslutningsnamn: Ange ett beskrivande namn för anslutningen.
- Bevilja åtkomstbehörigheter till alla pipelines: Markera den här kryssrutan om du vill bevilja åtkomst till alla pipelines i projektet.
 
- Välj Spara.   
- På sidan Azure DevOps-projekt väljer du Projektinställningar. 
- I Projektinställningar väljer du Pipelines>Service-anslutningar. 
- På sidan Tjänstanslutningar väljer du Ny tjänstanslutning eller Skapa tjänstanslutning om den här tjänstanslutningen är den första i projektet.   
- På skärmen Ny tjänstanslutning väljer du Azure Resource Manager och sedan Nästa.   
- Välj Tjänstens huvudnamn (manuell) och välj sedan Nästa.   
- På skärmen Ny Azure-tjänstanslutning fyller du i följande fält: - Miljö: Välj Azure Cloud.
- Omfångsnivå: Välj Prenumeration.
- Prenumerations-ID: Ange ditt Azure-prenumerations-ID.
- Prenumerationsnamn: Ange ditt Azure-prenumerationsnamn.
 
- I avsnittet Autentisering fyller du i följande fält: - 
              Tjänstens huvudnamns-ID: Ange det appIdvärde som returneras avaz ad sp create-for-rbackommandot.
- Autentiseringsuppgifter: Välj tjänstens huvudnyckel.
- 
              Tjänstens huvudnyckel: Ange det passwordvärde som returneras avaz ad sp create-for-rbackommandot.
- 
              Klientorganisations-ID: Ange det tenantvärde som returneras avaz ad sp create-for-rbackommandot.
- Välj Verifiera för att verifiera anslutningen.
 
- 
              Tjänstens huvudnamns-ID: Ange det 
- I avsnittet Information under Tjänstanslutningsnamn anger du ett namn för tjänstanslutningen. 
- Markera kryssrutan för Bevilja åtkomstbehörigheter till alla pipelines. 
- Välj Verifiera och spara.   
Den nya anslutningen visas i listan Tjänstanslutningar och är redo att användas i din pipeline.
Skapa en pipeline
Skapa en pipeline för att skapa och distribuera din Python-webbapp till Azure App Service.
- På den vänstra navigeringsmenyn för projektet väljer du Pipelines. 
- På sidan Pipelines väljer du Ny pipeline eller Skapa pipeline om den här pipelinen är den första i projektet.   
- På skärmen Var är din kod väljer du GitHub. Du kan uppmanas att logga in på GitHub.   
- På skärmen Välj en lagringsplats väljer du din förgrenade exempellagringsplats. GitHub kan uppmana dig att ange ditt GitHub-lösenord igen eller att installera GitHub-appen Azure Pipelines . Följ anvisningarna på skärmen för att installera appen. Mer information finns i GitHub-appautentisering.   
- På sidan Konfigurera din pipeline väljer du Python till Linux-webbapp i Azure. 
- På nästa skärm väljer du din Azure-prenumeration och väljer Fortsätt. 
- På nästa skärm väljer du din Azure-webbapp och väljer Verifiera och konfigurera. 
Azure Pipelines skapar en azure-pipelines.yml-fil och visar den i YAML-pipelineredigeraren.
- På den vänstra navigeringsmenyn för projektet väljer du Pipelines. 
- På sidan Pipelines väljer du Ny pipeline eller Skapa pipeline om den här pipelinen är den första i projektet.   
- På sidan Var är din kod väljer du GitHub Enterprise Server. Du kan uppmanas att logga in på GitHub.   
- På fliken Välj en lagringsplats väljer du din förgrenade exempellagringsplats. GitHub kan uppmana dig att ange ditt GitHub-lösenord igen eller installera GitHub-tillägget eller appen Azure Pipelines . Följ anvisningarna på skärmen för att installera appen. Mer information finns i Åtkomst till GitHub-lagringsplatser.   
- På sidan Konfigurera pipeline väljer du Startpipeline. 
- På sidan Granska yaml-pipelinen ersätter du innehållet i filen starter azure-pipelines.yml med följande YAML-pipelinefil. I YAML-filen: - <your-service-connection-name>Ersätt platshållarna och- <your-web-app-name>med dina egna värden.
- Ersätt - <your-pool-name>med namnet på den agentpool som du vill använda och ersätt- <your-python-version>med den version av Python som körs på din agent. Den här versionen ska matcha- runtime_versionfrån JSON-utdata för- az webapp upkommandot.
 
YAML-pipelinefil
På sidan Granska yaml-pipelinen tittar du på pipelinen för att se vad den gör. Kontrollera att alla standardindata är lämpliga för din kod. Mer information om YAML-filschemat för pipeline finns i YAML-schemareferensen.
I följande fullständiga exempel definierar YAML-pipelinefilen din CI/CD-pipeline som en serie steg, jobb och steg, där varje steg innehåller information om olika uppgifter och skript. Den genererade YAML-koden fyller automatiskt platshållarna med värden för din app och anslutning.
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'
Variabler
Avsnittet variables i början av YAML-filen definierar följande variabler:
| Variabel | Beskrivning | 
|---|---|
| azureServiceConnectionId | ID för Azure Resource Manager-tjänstanslutningen. | 
| webAppName | Namnet på App Service-webbappen. | 
| vmImageName | Namnet på det operativsystem som ska användas för byggagenten. | 
| environmentName | Namnet på den miljö som ska distribueras till, som skapas automatiskt när distributionsjobbet körs. | 
| projectRoot | Rotmappen som innehåller appkoden. | 
| pythonVersion | Den version av Python som ska användas på bygg- och distributionsagenterna. | 
| Variabel | Beskrivning | 
|---|---|
| azureServiceConnectionId | ID för Azure Resource Manager-tjänstanslutningen. | 
| webAppName | Namnet på App Service-webbappen. | 
| environmentName | Namnet på den miljö som ska distribueras till, som skapas automatiskt när distributionsjobbet körs. | 
| projectRoot | Mappen som innehåller appkoden. Värdet är en automatisk systemvariabel. | 
| pythonVersion | Den version av Python som ska användas på bygg- och distributionsagenterna. | 
Bygg- och distributionssteg
Pipelinen består av bygg- och distributionssteg.
Byggfas
Byggsteget innehåller ett enda jobb som körs på det operativsystem som definierats i variabeln vmImageName , i det här fallet ubuntu-latest.
  - job: BuildJob
    pool:
      vmImage: $(vmImageName)
Byggsteget innehåller ett enda jobb som körs på en agent i parametern poolname som identifieras.
Du kan ange agentfunktionerna med nyckelordet demands . Anger till exempel demands: python att agenten måste ha Python installerat. Om du vill ange en lokalt installerad agent efter namn kan du använda demands: Agent.Name -equals <agent-name>.
  - job: BuildJob
    pool:
      name: <your-pool-name>
      demands: python
Jobbet innehåller flera steg:
- Först väljer uppgiften UsePythonVersion den version av Python som ska användas, enligt definitionen i variabeln - pythonVersion.- - task: UsePythonVersion@0 inputs: versionSpec: '$(pythonVersion)' displayName: 'Use Python $(pythonVersion)'
- Nästa steg använder ett skript som skapar en virtuell Python-miljö och installerar appens beroenden från - requirements.txt. Parametern- workingDirectoryanger platsen för appkoden.- - 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"
- Uppgiften ArchiveFiles skapar ett ZIP-arkiv som innehåller den byggda webbappen. - - task: ArchiveFiles@2 displayName: 'Archive files' inputs: rootFolderOrFile: '$(projectRoot)' includeRootFolder: false archiveType: zip archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip replaceExistingArchive: true- Parametrarna anges på följande sätt: - Parameter - Beskrivning - rootFolderOrFile- Platsen för appkoden. - includeRootFolder- Om rotmappen ska inkluderas i filen.zip . Ange till - false. Om värdet- trueär inställt på placeras innehållet i .zip-filen i en mapp med namnet s och uppgiften kan inte hitta appkoden.- archiveType- Vilken typ av arkiv som ska skapas. Ange till - zip.- archiveFile- Platsen för .zip-filen som ska skapas. - replaceExistingArchive- Anger om du vill ersätta ett befintligt arkiv om filen redan finns. Ange till - true.
- Filen - .zipladdas sedan upp till pipelinen som en artefakt med namnet- drop. Distributionssteget använder .zip-filen för att distribuera appen.- - upload: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip displayName: 'Upload package' artifact: drop- Parametern uploadanger platsen och namnet på den .zip fil som ska laddas upp.
- Parametern artifactanger namnet på den skapade artefakten tilldrop.
 
- Parametern 
Implementeringsfas
Distributionssteget körs om byggfasen har slutförts. Nyckelorden dependsOn och condition definierar det här beteendet.
  dependsOn: Build
  condition: succeeded()
Distributionssteget innehåller ett enda distributionsjobb som konfigurerats på följande sätt.
  - deployment: DeploymentJob
    pool:
      vmImage: $(vmImageName)
    environment: $(environmentName)
- Nyckelordet - deploymentanger att jobbet är ett distributionsjobb som riktar sig till en miljö som ska distribueras till.- environmentSkapas automatiskt i projektet när jobbet körs.
- Parametern - poolanger distributionsagentpoolen och använder standardagentpoolen om en- nameinte har angetts. Agenten körs på operativsystemet som definierats i variabeln- vmImageName, i det här fallet- ubuntu-latest.
  - deployment: DeploymentJob
    pool:
      name: <your-pool-name>
    environment: $(environmentName)
- Nyckelordet - deploymentanger att jobbet är ett distributionsjobb som riktar sig till en miljö som ska distribueras till.- environmentSkapas automatiskt i projektet när jobbet körs.
- Parametern - poolanger distributionsagentpoolen och måste innehålla en agent med funktionen för att köra Python-versionen som anges i pipelinen.
Nyckelordet strategy definierar distributionsstrategin.
  strategy:
    runOnce:
      deploy:
        steps:
- Nyckelordet runOnceanger att distributionsjobbet körs en gång.
- Nyckelordet deployanger vilken somstepsska köras i distributionsjobbet.
I steps det här steget kör du följande uppgifter:
- UsePythonVersion@0 väljer vilken version av Python som ska användas, samma som i byggfasen.
- 
              AzureWebApp@1 distribuerar webbappen dropoch ZIP-artefakten.
- task: AzureWebApp@1
    displayName: 'Deploy Azure Web App : <your-web-app-name>'
  inputs:
    azureSubscription: $(azureServiceConnectionId)
    appName: $(webAppName)
    package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip
- Parametern azureSubscriptioninnehåller deazureServiceConnectionIdsom anges i pipelinevariablerna.
- 
              appNameInnehåller värdet för variabelnwebAppName.
- 
              packageAnger namnet och platsen för den.zip fil som ska distribueras.
Eftersom python-vscode-flask-tutorial-lagringsplatsen innehåller appstartkommandot i en fil med namnet startup.txtkan du ange kommandot för appstart genom att lägga till parametern : startUpCommand: 'startup.txt'.
Köra pipelinen
Nu är du redo att prova pipelinen.
- I pipelineredigeraren väljer du Spara och kör. 
- På skärmen Spara och kör lägger du till ett incheckningsmeddelande om du vill och väljer sedan Spara och kör. - Du kan se pipelinekörningen genom att välja Faser eller Jobb på pipelinesidan Sammanfattning . Varje jobb och fas visar en grön bockmarkering när det har slutförts. Om fel uppstår visas de i sammanfattningen eller i jobbstegen.   - Du kan snabbt återgå till YAML-redigeraren genom att välja de lodräta punkterna längst upp till höger på sidan Sammanfattning och välja Redigera pipeline.   
- I distributionsjobbet väljer du aktiviteten Distribuera Azure Web App för att visa dess utdata.   
- I utdata väljer du URL:en efter App Service-programmets URL. Appen bör visas på följande sätt:   
Kommentar
Om en appdistribution misslyckas på grund av ett beroende som saknas bearbetas inte requirements.txt-filen  under distributionen. Det här problemet kan inträffa om du skapar webbappen direkt i portalen i stället för att az webapp up använda kommandot .
Kommandot az webapp up anger specifikt byggåtgärden SCM_DO_BUILD_DURING_DEPLOYMENT till true. Om du etablerar en apptjänst via portalen anges inte den här åtgärden automatiskt.
Så här anger du den här åtgärden:
- På portalsidan för webbappen väljer du Konfiguration på den vänstra navigeringsmenyn.
- På fliken Programinställningar väljer du Ny programinställning.
- I popup-fönstret som visas anger du Namn till SCM_DO_BUILD_DURING_DEPLOYMENT, anger Värde tilltrueoch väljer OK.
- Välj Spara överst på sidan Konfiguration .
- Kör pipelinen igen. Beroendena bör nu installeras under distributionen.
Utlös en pipelinekörning
Den här pipelinen är inställd på att köras när en ändring checkar in på kodlagringsplatsen. Om du vill utlösa en pipelinekörning checkar du in en ändring på lagringsplatsen. Du kan till exempel lägga till en ny funktion i appen eller uppdatera appens beroenden.
- Gå till GitHub-lagringsplatsen för din app.
- Gör en ändring i koden, till exempel ändra appens rubrik.
- Genomför ändringen.
- Gå till din pipeline och kontrollera att en ny körning har skapats och körs.
- När körningen är klar kontrollerar du att ändringen har distribuerats till webbappen.
- I Azure-portalen går du till webbappen och väljer Distributionscenter på den vänstra navigeringsmenyn.
- Välj fliken Loggar och kontrollera att den nya distributionen visas.
Distribuera Django-appar till App Service
Du kan använda Azure Pipelines för att distribuera Django-appar till App Service i Linux om du använder en separat databas. Du kan inte använda en SQLite-databas eftersom App Service låser filen db.sqlite3 , vilket förhindrar både läsningar och skrivningar. Det här beteendet påverkar inte externa databaser.
Som förklaras i processen för containerstart letar App Service automatiskt efter en wsgi.py fil i din appkod, som vanligtvis innehåller appobjektet. Om du vill anpassa startkommandot använder du parametern startUpCommand i steget i AzureWebApp@1 YAML-pipelinefilen.
När du använder Django vill du vanligtvis migrera datamodellerna med hjälp av manage.py migrate när du har distribuerat appkoden. Du kan lägga till startUpCommand med ett skript efter distributionen för det här ändamålet. Här är startUpCommand till exempel egenskapen i den AzureWebApp@1 uppgiften.
  - 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'
Köra tester på byggagenten
Som en del av byggprocessen kanske du vill köra tester på din appkod. Tester körs på byggagenten, så du måste installera dina beroenden i en virtuell miljö på byggagenten. När testerna har körts tar du bort den virtuella testmiljön innan du skapar .zip-filen för distribution.
Följande skriptelement illustrerar den här processen. Placera dem före uppgiften ArchiveFiles@2 i filen azure-pipelines.yml. Mer information finns i Köra plattformsoberoende skript.
# 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'
Du kan också använda en uppgift som PublishTestResults@2 för att publicera testresultaten i pipelinen. Mer information finns i Kör tester.
Rensa resurser
Om du är klar med de Azure-resurser som du skapade i den här självstudien tar du bort dem för att undvika ytterligare avgifter.
- Ta bort Det Azure DevOps-projekt som du skapade. Om du tar bort projektet tas pipeline- och tjänstanslutningen bort.
- Ta bort den Azure-resursgrupp som innehåller App Service och App Service-planen. I Azure-portalen går du till resursgruppen, väljer Ta bort resursgrupp och följer anvisningarna.
- Ta bort azure-lagringskontot som underhåller Cloud Shell-filsystemet. Stäng Cloud Shell och leta sedan reda på resursgruppen som börjar med cloud-shell-storage-. Välj Ta bort resursgrupp och följ anvisningarna.