Udostępnij za pośrednictwem


Tworzenie i wdrażanie aplikacji internetowej w języku Python w usłudze aplikacja systemu Azure Przy użyciu usługi Azure Pipelines

Azure DevOps Services

Usługa Azure Pipelines umożliwia ciągłą integrację i ciągłe dostarczanie (CI/CD), aby utworzyć i wdrożyć aplikację internetową w języku Python w usłudze aplikacja systemu Azure w systemie Linux. Potok automatycznie kompiluje i wdraża aplikację internetową w języku Python w usłudze App Service po każdym zatwierdzeniu w repozytorium.

W tym artykule omówiono sposób wykonywania następujących zadań:

  • utworzysz aplikację internetową w usłudze Azure App Service;
  • Tworzenie projektu w usłudze Azure DevOps.
  • Połącz projekt DevOps z platformą Azure.
  • Tworzenie potoku specyficznego dla języka Python.
  • Uruchom potok, aby skompilować i wdrożyć aplikację w aplikacji internetowej w usłudze App Service.

Wymagania wstępne

Tworzenie repozytorium dla kodu aplikacji

Rozwidlenie przykładowego repozytorium na https://github.com/Microsoft/python-sample-vscode-flask-tutorial koncie usługi GitHub.

Na hoście lokalnym sklonuj repozytorium GitHub. Użyj następującego polecenia, zastępując <repository-url> ciąg adresem URL rozwidlenia repozytorium.

git clone <repository-url>

Testowanie aplikacji lokalnie

Skompiluj i uruchom aplikację lokalnie, aby upewnić się, że działa.

  1. Przejdź do sklonowanego folderu repozytorium.

    cd python-sample-vscode-flask-tutorial
    
  2. Skompiluj i uruchom aplikację

    python -m venv .env
    source .env/bin/activate
    pip install --upgrade pip
    pip install -r ./requirements.txt
    export set FLASK_APP=hello_app.webapp
    python3 -m flask run
    
  3. Aby wyświetlić aplikację, otwórz okno przeglądarki i przejdź do http://localhost:5000strony . Sprawdź, czy zostanie wyświetlony tytuł Visual Studio Flask Tutorial.

  4. Po zakończeniu zamknij okno przeglądarki i zatrzymaj serwer Flask za pomocą Ctrl+C.

Otwieranie usługi Cloud Shell

  1. Zaloguj się do witryny Azure Portal pod adresem https://portal.azure.com.

  2. Otwórz interfejs wiersza polecenia platformy Azure, wybierając przycisk Cloud Shell na pasku narzędzi portalu.

    Zrzut ekranu przedstawiający przycisk usługi Azure Cloud Shell na pasku narzędzi witryny Azure Portal.

  3. W dolnej części przeglądarki zostanie wyświetlona usługa Cloud Shell. Wybierz pozycję Bash z menu rozwijanego.

    Zrzut ekranu przedstawiający usługę Azure Cloud Shell.

  4. Aby zapewnić więcej miejsca do pracy, wybierz przycisk Maksymalizuj.

Tworzenie aplikacji internetowej usługi aplikacja systemu Azure Service

Utwórz aplikację internetową usługi aplikacja systemu Azure Service z poziomu usługi Cloud Shell w witrynie Azure Portal.

Napiwek

Aby wkleić do usługi Cloud Shell, użyj Ctrl+Shift+V lub kliknij prawym przyciskiem myszy i wybierz polecenie Wklej z menu kontekstowego.

  1. Sklonuj repozytorium za pomocą następującego polecenia, zastępując <repository-url> ciąg adresem URL rozwidlenia repozytorium.

    git clone <repository-url>
    
  2. Zmień katalog na sklonowany folder repozytorium, aby az webapp up polecenie rozpoznawało aplikację jako aplikację w języku Python.

    cd python-sample-vscode-flask-tutorial
    
  3. Użyj polecenia az webapp up, aby aprowizować usługę App Service i wykonać pierwsze wdrożenie aplikacji. Zastąp <your-web-app-name> ciąg nazwą unikatową na platformie Azure. Zazwyczaj używasz osobistej lub firmowej nazwy wraz z identyfikatorem aplikacji, takim jak <your-name>-flaskpipelines. Adres URL aplikacji staje się your-appservice.azurewebsites.net>.<

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

    Dane wyjściowe JSON polecenia az webapp up pokazują:

    {
      "URL": <your-web-app-url>,
      "appserviceplan": <your-app-service-plan-name>,
      "location": <your-azure-location>,
      "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>
    }
    

    Zanotuj URL runtime_version wartości i . Użyj polecenia runtime_version w pliku YAML potoku. Jest URL to adres URL aplikacji internetowej. Możesz jej użyć, aby sprawdzić, czy aplikacja jest uruchomiona.

    Uwaga

    Polecenie az webapp up wykonuje następujące akcje:

    • Utwórz domyślną grupę zasobów.

    • Utwórz domyślny plan usługi App Service.

    • Utwórz aplikację o określonej nazwie.

    • Zip wdróż wszystkie pliki z bieżącego katalogu roboczego z włączoną automatyzacją kompilacji.

    • Buforuj parametry lokalnie w pliku .azure/config , aby nie trzeba było ich ponownie określać podczas wdrażania później za pomocą az webapp up polecenia lub innych az webapp poleceń z folderu projektu. Buforowane wartości są domyślnie używane automatycznie.

    Możesz zastąpić domyślną akcję własnymi wartościami przy użyciu parametrów polecenia. Aby uzyskać więcej informacji, zobacz az webapp up.

  4. Aplikacja python-sample-vscode-flask-tutorial zawiera plik startup.txt zawierający określone polecenie uruchamiania aplikacji internetowej. Ustaw właściwość konfiguracji aplikacji startup-file internetowej na startup.txt.

    1. Z danych wyjściowych az webapp up polecenia skopiuj resourcegroup wartość .

    2. Wprowadź następujące polecenie przy użyciu grupy zasobów i nazwy aplikacji.

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

    Po zakończeniu polecenia zostanie wyświetlone dane wyjściowe JSON zawierające wszystkie ustawienia konfiguracji aplikacji internetowej.

  5. Aby wyświetlić uruchomioną aplikację, otwórz przeglądarkę i przejdź do URL elementu wyświetlanego w danych wyjściowych az webapp up polecenia. Jeśli zostanie wyświetlona strona ogólna, zaczekaj kilka sekund na uruchomienie usługi App Service, a następnie odśwież stronę. Sprawdź, czy zostanie wyświetlony tytuł Visual Studio Flask Tutorial.

Tworzenie projektu usługi Azure DevOps

Utwórz nowy projekt usługi Azure DevOps.

  1. W przeglądarce przejdź do dev.azure.com i zaloguj się.
  2. Wybierz organizację.
  3. Utwórz nowy projekt, wybierając pozycję Nowy projekt lub Utwórz projekt , tworząc pierwszy projekt w organizacji.
  4. Wprowadź nazwę projektu.
  5. Wybierz widoczność projektu.
  6. Wybierz pozycję Utwórz.
  1. W przeglądarce przejdź do serwera Usługi Azure DevOps.
  2. Wybierz kolekcję.
  3. Utwórz nowy projekt, wybierając pozycję Nowy projekt lub Utwórz projekt , tworząc pierwszy projekt w kolekcji.
  4. Wprowadź nazwę projektu.
  5. Wybierz widoczność projektu.
  6. Wybierz pozycję Utwórz.

Tworzenie jednostki usługi

Jednostka usługi jest tożsamością utworzoną do użycia z aplikacjami, usługami hostowanymi i zautomatyzowanymi narzędziami w celu uzyskiwania dostępu do zasobów platformy Azure. Ten dostęp jest ograniczony do ról przypisanych do jednostki usługi, zapewniając kontrolę nad tym, do których zasobów można uzyskiwać dostęp i na jakim poziomie.

Aby utworzyć jednostkę usługi, przejdź do usługi Cloud Shell (bash) i uruchom następujące polecenie. Zastąp <service-principal-name> ciąg nazwą jednostki usługi, <your-subscription-id> identyfikatorem subskrypcji i <your-resource-group> grupą zasobów aplikacji internetowej.

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

Polecenie zwraca obiekt JSON podobny do następującego przykładu:

{
  "clientId": "<client GUID>",
  "clientSecret": "<string-value>",
  "subscriptionId": "<subscription GUID>",
  "tenantId": "<tenant GUID>",
  ...
}

Zanotuj clientIdwartości , clientSecret, subscriptionIdi tenantId . Te wartości są potrzebne do utworzenia połączenia z usługą w następnej sekcji.

Tworzenie połączenia z usługą

Połączenie usługi umożliwia utworzenie połączenia w celu zapewnienia uwierzytelnionego dostępu z usługi Azure Pipelines do usług zewnętrznych i zdalnych. Aby wdrożyć aplikację internetową usługi aplikacja systemu Azure Service, utwórz połączenie usługi z grupą zasobów zawierającą aplikację internetową.

  1. Na stronie projektu wybierz pozycję Ustawienia projektu.

    Zrzut ekranu przedstawiający przycisk ustawień projektu na pulpicie nawigacyjnym projektu.

  2. Wybierz pozycję Połączenia z usługą w sekcji Potoki w menu.

  3. Wybierz pozycję Utwórz połączenie z usługą.

  4. Wybierz pozycję Azure Resource Manager i wybierz pozycję Dalej.

    Zrzut ekranu przedstawiający wybór połączenia usługi Azure Resource Manager.

  5. Wybierz metodę uwierzytelniania i wybierz pozycję Dalej.

  6. W oknie dialogowym Nowe połączenie z usługą platformy Azure wprowadź informacje specyficzne dla wybranej metody uwierzytelniania. Aby uzyskać więcej informacji na temat metod uwierzytelniania, zobacz Nawiązywanie połączenia z platformą Azure przy użyciu połączenia usługi Azure Resource Manager.

    Jeśli na przykład używasz federacji tożsamości obciążenia (automatycznej) lub metody uwierzytelniania jednostki usługi (automatycznej), wprowadź wymagane informacje.

    Zrzut ekranu przedstawiający okno dialogowe Nowe połączenie z usługą.

    Pole Opis
    Poziom zakresu Wybierz subskrypcję.
    Subskrypcja Nazwa subskrypcji platformy Azure.
    Grupa zasobów: Nazwa grupy zasobów zawierającej aplikację internetową.
    Nazwa połączenia z usługą Opisowa nazwa połączenia.
    Udzielanie uprawnień dostępu do wszystkich potoków Wybierz tę opcję, aby udzielić dostępu do wszystkich potoków.
  7. Wybierz pozycję Zapisz.

Nowe połączenie zostanie wyświetlone na liście Połączenia usługi i jest gotowe do użycia w usłudze Azure Pipeline.

  1. Na stronie projektu wybierz pozycję Ustawienia projektu.

    Zrzut ekranu przedstawiający przycisk ustawień projektu na pulpicie nawigacyjnym projektu.

  2. Wybierz pozycję Połączenia z usługą w sekcji Potoki w menu.

  3. Wybierz pozycję Utwórz połączenie z usługą.

  4. Wybierz pozycję Azure Resource Manager i wybierz pozycję Dalej.

    Zrzut ekranu przedstawiający wybór połączenia usługi Azure Resource Manager.

  5. W obszarze Nowe połączenie z usługą platformy Azure wybierz pozycję Jednostka usługi (ręcznie) i wybierz pozycję Dalej

  6. W następnym oknie dialogowym wypełnij wymagane informacje.

    Zrzut ekranu przedstawiający okno dialogowe nowego połączenia z usługą.

    Pole Opis
    Środowisko Wybierz opcję Azure Cloud.
    Poziom zakresu Wybierz subskrypcję.
    Identyfikator subskrypcji Identyfikator subskrypcji.
    Nazwa subskrypcji Nazwa subskrypcji platformy Azure.
    Identyfikator jednostki usługi appId Wartość z obiektu JSON zwróconego az ad sp create-for-rbac przez polecenie .
    Klucz jednostki usługi password Wartość z obiektu JSON zwróconego az ad sp create-for-rbac przez polecenie .
    Identyfikator dzierżawy tenant Wartość z obiektu JSON zwróconego az ad sp create-for-rbac przez polecenie .
  7. Wybierz pozycję Weryfikuj , aby zweryfikować połączenie.

  8. Wprowadź nazwę połączenia z usługą.

  9. Upewnij się, że wybrano opcję Udziel uprawnień dostępu do wszystkich potoków .

  10. Wybierz pozycję Weryfikuj i zapisz.

Nowe połączenie zostanie wyświetlone na liście Połączenia usługi i jest gotowe do użycia przez usługę Azure Pipelines z projektu.

Konfigurowanie własnego agenta

Jeśli używasz własnego własnego agenta, musisz skonfigurować agenta do uruchamiania języka Python. Pobieranie wersji języka Python nie jest obsługiwane w przypadku własnych agentów. Musisz wstępnie instalować wersję języka Python. Użyj pełnego instalatora, aby uzyskać wersję języka Python zgodną z programem.

Aby uniknąć niezgodnych problemów, należy dopasować wersję języka Python do wersji środowiska uruchomieniowego w aplikacji internetowej aplikacja systemu Azure Services. Wersja środowiska uruchomieniowego jest wyświetlana w danych wyjściowych az webapp up JSON polecenia .

Wymagana wersja języka Python musi zostać dodana do pamięci podręcznej narzędzi na własnym agencie, aby można było z niego korzystać. Zwykle pamięć podręczna narzędzia znajduje się w katalogu _work/_tool agenta; alternatywnie można zastąpić ścieżkę zmienną środowiskową AGENT_TOOLSDIRECTORY. W katalogu tools utwórz następującą strukturę katalogów na podstawie wersji języka Python:

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

Numer wersji powinien być zgodny z formatem 1.2.3. Platforma powinna być x86 lub x64. Pliki narzędzi powinny być rozpakowanym plikiem wersji języka Python. Powinien {platform}.complete to być plik 0-bajtowy, który wygląda x86.complete lub x64.complete po prostu oznacza, że narzędzie jest poprawnie zainstalowane w pamięci podręcznej.

Jeśli na przykład używasz języka Python 3.11 na 64-bitowej maszynie z systemem Windows, struktura katalogów będzie wyglądać następująco:

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

Jeśli masz już wersję języka Python, której chcesz użyć na maszynie hostującego agenta, możesz skopiować pliki do pamięci podręcznej narzędzi. Jeśli nie masz wersji języka Python, możesz pobrać ją z witryny internetowej języka Python.

Tworzenie potoku

Utwórz potok, aby skompilować i wdrożyć aplikację internetową w języku Python w usłudze aplikacja systemu Azure Service. Aby zrozumieć pojęcia dotyczące potoku, zobacz:

  1. W menu nawigacji po lewej stronie wybierz pozycję Potoki.

    Zrzut ekranu przedstawiający wybór potoków na pulpicie nawigacyjnym projektu.

  2. Wybierz pozycję Utwórz potok.

    Zrzut ekranu przedstawiający przycisk nowego potoku na liście potoków.

  3. W oknie dialogowym Where is your code (Gdzie to twój kod) wybierz pozycję GitHub. Może zostać wyświetlony monit o zalogowanie się do usługi GitHub.

    Zrzut ekranu przedstawiający wybieranie usługi GitHub jako lokalizacji kodu.

  4. Na ekranie Wybieranie repozytorium wybierz rozwidlenie przykładowego repozytorium.

    Zrzut ekranu przedstawiający wybór repozytorium.

  5. Może zostać wyświetlony monit o ponowne wprowadzenie hasła usługi GitHub jako potwierdzenie.

  6. Jeśli rozszerzenie usługi Azure Pipelines nie jest zainstalowane w usłudze GitHub, usługa GitHub wyświetli monit o zainstalowanie rozszerzenia usługi Azure Pipelines .

    Zainstaluj rozszerzenie usługi Azure Pipelines w usłudze GitHub.

    Na tej stronie przewiń w dół do sekcji Dostęp do repozytorium, wybierz, czy zainstalować rozszerzenie we wszystkich repozytoriach, czy tylko wybrane, a następnie wybierz pozycję Zatwierdź i zainstaluj.

    Zrzut ekranu przedstawiający zatwierdzanie i instalowanie rozszerzenia usługi Azure Pipelines w usłudze GitHub.

  7. W oknie dialogowym Konfigurowanie potoku wybierz pozycję Python do aplikacji internetowej systemu Linux na platformie Azure.

  8. Wybierz subskrypcję platformy Azure i wybierz pozycję Kontynuuj.

  9. Jeśli używasz nazwy użytkownika i hasła do uwierzytelniania, zostanie otwarta przeglądarka w celu zalogowania się do konta Microsoft.

  10. Wybierz nazwę aplikacji internetowej z listy rozwijanej, a następnie wybierz pozycję Weryfikuj i skonfiguruj.

Usługa Azure Pipelines tworzy plik azure-pipelines.yml i wyświetla go w edytorze potoków YAML. Plik potoku definiuje potok ciągłej integracji/ciągłego wdrażania jako serię etapów, zadań i kroków, gdzie każdy krok zawiera szczegółowe informacje dotyczące różnych zadań i skryptów. Przyjrzyj się potokowi, aby zobaczyć, co robi. Upewnij się, że wszystkie domyślne dane wejściowe są odpowiednie dla kodu.

  1. W menu nawigacji wybierz pozycję Potoki.

    Zrzut ekranu przedstawiający wybór potoków na pulpicie nawigacyjnym projektu.

  2. Wybierz pozycję Utwórz potok.

    Zrzut ekranu przedstawiający przycisk Nowy potok.

  3. W oknie dialogowym Gdzie znajduje się kod wybierz pozycję GitHub Enterprise Server. Może zostać wyświetlony monit o zalogowanie się do usługi GitHub.

    Zrzut ekranu przedstawiający wybieranie usługi GitHub jako lokalizacji kodu.

  4. Na karcie Wybierz repozytorium wybierz rozwidlenie przykładowego repozytorium.

    Zrzut ekranu przedstawiający wybór repozytorium.

  5. Może zostać wyświetlony monit o ponowne wprowadzenie hasła usługi GitHub jako potwierdzenie.

  6. Jeśli rozszerzenie usługi Azure Pipelines nie jest zainstalowane w usłudze GitHub, usługa GitHub wyświetli monit o zainstalowanie rozszerzenia usługi Azure Pipelines .

    Zrzut ekranu przedstawiający rozszerzenie usługi Azure Pipelines w witrynie GitHub.

    Na tej stronie przewiń w dół do sekcji Dostęp do repozytorium, wybierz, czy zainstalować rozszerzenie we wszystkich repozytoriach, czy tylko wybrane, a następnie wybierz pozycję Zatwierdź i zainstaluj.

    Zrzut ekranu przedstawiający zatwierdzanie i instalowanie rozszerzenia usługi Azure Pipelines w usłudze GitHub.

  7. W oknie dialogowym Konfigurowanie potoku wybierz pozycję Potok startowy.

  8. Zastąp zawartość pliku azure-pipelines.yml następującym kodem.

    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'
    
    
  9. Zastąp następujące symbole zastępcze własnymi wartościami:

    Symbol zastępczy Opis
    <your-service-connection-name> Nazwa utworzonego połączenia usługi.
    <your-web-app-name> Nazwa aplikacji internetowej usługi aplikacja systemu Azure Service.
    <your-pool-name> Nazwa puli agentów, której chcesz użyć.
    <your-python-version> Wersja języka Python uruchomiona na agencie. Dobrym pomysłem jest dopasowanie tej wersji do wersji języka Python uruchomionej w aplikacji internetowej. Wersja aplikacji internetowej jest wyświetlana w danych wyjściowych az webapp up JSON polecenia .

Plik potoku YAML

W poniższym wyjaśnieniu opisano plik potoku YAML. Aby dowiedzieć się więcej o schemacie pliku YAML potoku, zobacz dokumentacja schematu YAML.

Pełny przykładowy plik YAML potoku jest pokazany poniżej:

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 setup
        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

Zmienne

Sekcja variables zawiera następujące zmienne:

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.
projectRoot: $(System.DefaultWorkingDirectory)

# Python version: 3.11. Change this to match the Python runtime version running on your web app.
pythonVersion: '3.11'

Zmienna Opis
azureServiceConnectionId Identyfikator lub nazwa połączenia usługi Azure Resource Manager.
webAppName Nazwa aplikacji internetowej usługi aplikacja systemu Azure Service.
vmImageName Nazwa systemu operacyjnego do użycia dla agenta kompilacji.
environmentName Nazwa środowiska używanego na etapie wdrażania. Środowisko jest tworzone automatycznie po uruchomieniu zadania etapu.
projectRoot Folder główny zawierający kod aplikacji.
pythonVersion Wersja języka Python do użycia na agentach kompilacji i wdrażania.

Sekcja variables zawiera następujące zmienne:

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

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

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

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

# Python version: 3.11. Change this to the version that is running on your agent and web app.
pythonVersion: '3.11'
Zmienna Opis
azureServiceConnectionId Nazwa połączenia usługi Azure Resource Manager.
webAppName Nazwa danej aplikacji internetowej.
environmentName Nazwa środowiska używanego na etapie wdrażania.
projectRoot Folder zawierający kod aplikacji. Wartość jest zmienną systemową automatyczną.
pythonVersion Wersja języka Python do użycia na agentach kompilacji i wdrażania.

Etap kompilacji

Etap kompilacji zawiera jedno zadanie uruchamiane w systemie operacyjnym zdefiniowanym w zmiennej vmImageName.

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

Etap kompilacji zawiera jedno zadanie uruchamiane na agencie w puli zidentyfikowanej przez parametr name. Możesz określić możliwości agenta za pomocą słowa kluczowego demands . Na przykład określa, demands: python że agent musi mieć zainstalowany język Python. Aby określić własnego agenta według nazwy, możesz użyć słowa kluczowego demands: Agent.Name -equals <agent-name> .

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

Zadanie zawiera wiele kroków:

  1. Zadanie UsePythonVersion wybiera wersję języka Python do użycia. Wersja jest zdefiniowana w zmiennej pythonVersion .

       - task: UsePythonVersion@0
          inputs:
            versionSpec: '$(pythonVersion)'
            displayName: 'Use Python $(pythonVersion)'
    
  2. W tym kroku użyto skryptu do utworzenia wirtualnego środowiska języka Python i zainstalowania zależności aplikacji zawartych w parametrze requirements.txt The workingDirectory określa lokalizację kodu aplikacji.

      - 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"
    
  3. Zadanie ArchiveFiles tworzy archiwum .zip zawierające aplikację internetową. Plik .zip jest przekazywany do potoku jako artefakt o nazwie drop. Plik .zip jest używany na etapie wdrażania w celu wdrożenia aplikacji w aplikacji internetowej.

       - 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
    
    Parametr Opis
    rootFolderOrFile Lokalizacja kodu aplikacji.
    includeRootFolder Wskazuje, czy folder główny ma być uwzględniony w pliku .zip . Ustaw ten parametr na false wartość w przeciwnym razie zawartość pliku .zip jest umieszczana w folderze o nazwie s, a kontener App Service dla systemu Linux nie może odnaleźć kodu aplikacji.
    archiveType Typ archiwum do utworzenia. Ustaw wartość zip.
    archiveFile Lokalizacja pliku .zip do utworzenia.
    replaceExistingArchive Wskazuje, czy zastąpić istniejące archiwum, jeśli plik już istnieje. Ustaw wartość true.
    upload Lokalizacja pliku .zip do przekazania.
    artifact Nazwa artefaktu do utworzenia.

Etap wdrażania

Etap wdrażania jest uruchamiany, jeśli etap kompilacji zakończy się pomyślnie. Następujące słowa kluczowe definiują to zachowanie:

  dependsOn: Build
  condition: succeeded()

Etap wdrażania zawiera jedno zadanie wdrożenia skonfigurowane przy użyciu następujących słów kluczowych:

  - deployment: DeploymentJob
    pool:
      vmImage: $(vmImageName)
    environment: $(environmentName)
Słowo kluczowe Opis
deployment Wskazuje, że zadanie jest zadaniem wdrożenia przeznaczonym dla środowiska.
pool Określa pulę agentów wdrażania. Domyślna pula agentów, jeśli nazwa nie jest określona. Słowo vmImage kluczowe identyfikuje system operacyjny obrazu maszyny wirtualnej agenta
environment Określa środowisko do wdrożenia. Środowisko jest tworzone automatycznie w projekcie po uruchomieniu zadania.
  - deployment: DeploymentJob
    pool:
      name: <your-pool-name>
    environment: $(environmentName)
Słowo kluczowe Opis
deployment Wskazuje, że zadanie jest zadaniem wdrożenia przeznaczonym dla środowiska.
pool Określa pulę agentów do użycia na potrzeby wdrożenia. Ta pula musi zawierać agenta z możliwością uruchamiania wersji języka Python określonej w potoku.
environment Określa środowisko do wdrożenia. Środowisko jest tworzone automatycznie w projekcie po uruchomieniu zadania.

Słowo strategy kluczowe służy do definiowania strategii wdrażania. Słowo runOnce kluczowe określa, że zadanie wdrożenia jest uruchamiane raz. Słowo deploy kluczowe określa kroki do uruchomienia w zadaniu wdrażania.

  strategy:
    runOnce:
      deploy:
        steps:

Element steps w potoku to:

  1. Użyj zadania UsePythonVersion, aby określić wersję języka Python do użycia w agencie. Wersja jest zdefiniowana w zmiennej pythonVersion .

     - task: UsePythonVersion@0
       inputs:
         versionSpec: '$(pythonVersion)'
       displayName: 'Use Python version'
    
  2. Wdróż aplikację internetową przy użyciu AzureWebApp@1. To zadanie wdraża artefakt drop potoku w aplikacji internetowej.

    - 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 Opis
    azureSubscription Identyfikator połączenia usługi Azure Resource Manager lub nazwa do użycia.
    appName Nazwa danej aplikacji internetowej.
    package Lokalizacja pliku .zip do wdrożenia.

    Ponadto, ponieważ repozytorium python-vscode-flask-tutorial zawiera to samo polecenie uruchamiania w pliku o nazwie startup.txt, możesz określić ten plik, dodając parametr : startUpCommand: 'startup.txt'.

Element steps w potoku to:

  1. Użyj zadania UsePythonVersion, aby określić wersję języka Python do użycia w agencie. Wersja jest zdefiniowana w zmiennej pythonVersion .

     - task: UsePythonVersion@0
       inputs:
         versionSpec: '$(pythonVersion)'
       displayName: 'Use Python version'
    
  2. Wdróż aplikację internetową przy użyciu AzureWebApp@1. To zadanie wdraża artefakt drop potoku w aplikacji internetowej.

    - 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 Opis
    azureSubscription Identyfikator połączenia usługi Azure Resource Manager lub nazwa do użycia.
    appName Nazwa danej aplikacji internetowej.
    package Lokalizacja pliku .zip do wdrożenia.

    Ponadto, ponieważ repozytorium python-vscode-flask-tutorial zawiera to samo polecenie uruchamiania w pliku o nazwie startup.txt, możesz określić ten plik, dodając parametr : startUpCommand: 'startup.txt'.

      - task: AzureWebApp@1
         displayName: 'Deploy Azure Web App : $(webAppName)'
         inputs:
           azureSubscription: $(azureServiceConnectionId)
           appName: $(webAppName)
           package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip
           startUpCommand: 'startup.txt'
    
    Parametr Opis
    azureSubscription Identyfikator połączenia usługi Azure Resource Manager lub nazwa do użycia.
    appName Nazwa danej aplikacji internetowej.
    package Lokalizacja pliku .zip do wdrożenia.
    startUpCommand Polecenie do uruchomienia po wdrożeniu aplikacji. Przykładowa aplikacja używa metody startup.txt.

Uruchamianie potoku

Teraz możesz ją wypróbować!

  1. W edytorze wybierz pozycję Zapisz i uruchom.

  2. W oknie dialogowym Zapisywanie i uruchamianie dodaj komunikat zatwierdzenia, a następnie wybierz pozycję Zapisz i uruchom.

    Potok można obserwować podczas jego uruchamiania, wybierając pozycję Etapy lub Zadania w podsumowaniu przebiegu potoku.

    Zrzut ekranu przedstawiający sekcję etapów podsumowania przebiegu potoku.

    Obok każdego etapu znajdują się zielone znaczniki wyboru i zadanie, które zakończy się pomyślnie. Jeśli wystąpią błędy, są one wyświetlane w podsumowaniu lub w krokach zadania.

    Zrzut ekranu przedstawiający kroki etapu potoku.

    Możesz szybko wrócić do edytora YAML, wybierając pionowe kropki w prawym górnym rogu strony Podsumowanie i wybierając pozycję Edytuj potok:

    Zrzut ekranu przedstawiający edytowanie komentarza potoku z raportu kompilacji.

  3. W zadaniu wdrażania wybierz zadanie Deploy Azure Web App (Wdróż aplikację internetową platformy Azure), aby wyświetlić dane wyjściowe. Aby przejść do wdrożonej witryny, przytrzymaj naciśnięty Ctrl i wybierz adres URL po App Service Application URL.

    Jeśli używasz przykładowej aplikacji, aplikacja powinna być wyświetlana w następujący sposób:

    Zrzut ekranu przedstawiający widok przykładowej aplikacji uruchomionej w usłudze App Service.

Ważne

Jeśli aplikacja nie powiedzie się z powodu braku zależności, plik requirements.txt nie został przetworzony podczas wdrażania. To zachowanie występuje, jeśli aplikacja internetowa została utworzona bezpośrednio w portalu, a nie przy użyciu az webapp up polecenia, jak pokazano w tym artykule.

Polecenie az webapp up w szczególności ustawia akcję SCM_DO_BUILD_DURING_DEPLOYMENT kompilacji na truewartość . Jeśli usługa app service została aprowizowana za pośrednictwem portalu, ta akcja nie zostanie automatycznie ustawiona.

Następujące kroki umożliwiają ustawienie akcji:

  1. Otwórz witrynę Azure Portal, wybierz usługę App Service, a następnie wybierz pozycję Konfiguracja.
  2. Na karcie Ustawienia aplikacji wybierz pozycję Nowe ustawienie aplikacji.
  3. W wyświetlonym oknie podręcznym ustaw wartość Name na , ustaw wartość Value na true, a następnie wybierz przycisk OK.SCM_DO_BUILD_DURING_DEPLOYMENT
  4. Wybierz pozycję Zapisz w górnej części strony Konfiguracja .
  5. Ponowne uruchamianie potoku. Zależności powinny być instalowane podczas wdrażania.

Wyzwalanie uruchomienia potoku

Aby wyzwolić uruchomienie potoku, zatwierdź zmianę w repozytorium. Możesz na przykład dodać nową funkcję do aplikacji lub zaktualizować zależności aplikacji.

  1. Przejdź do repozytorium GitHub.
  2. Wprowadź zmianę w kodzie, taką jak zmiana tytułu aplikacji.
  3. Zatwierdź zmianę w repozytorium.
  4. Przejdź do potoku i sprawdź, czy został utworzony nowy przebieg.
  5. Po zakończeniu przebiegu sprawdź, czy nowa kompilacja zostanie wdrożona w aplikacji internetowej.
    1. W witrynie Azure Portal przejdź do aplikacji internetowej.
    2. Wybierz pozycję Centrum wdrażania i wybierz kartę Dzienniki .
    3. Sprawdź, czy nowe wdrożenie znajduje się na liście.

Zagadnienia dotyczące platformy Django

Usługa Azure Pipelines umożliwia wdrażanie aplikacji Django w usłudze aplikacja systemu Azure Service w systemie Linux, jeśli używasz oddzielnej bazy danych. Nie można użyć bazy danych SQLite, ponieważ usługa App Service blokuje plik db.sqlite3 , uniemożliwiając odczyty i zapisy. To zachowanie nie ma wpływu na zewnętrzną bazę danych.

Zgodnie z opisem w temacie Konfigurowanie aplikacji języka Python w usłudze App Service — proces uruchamiania kontenera usługa App Service automatycznie wyszukuje plik wsgi.py w kodzie aplikacji, który zazwyczaj zawiera obiekt aplikacji. Jeśli chcesz dostosować polecenie uruchamiania w jakikolwiek sposób, użyj startUpCommand parametru w AzureWebApp@1 kroku pliku potoku YAML, zgodnie z opisem w poprzedniej sekcji.

W przypadku korzystania z platformy Django zazwyczaj chcesz przeprowadzić migrację modeli danych przy użyciu polecenia manage.py migrate po wdrożeniu kodu aplikacji. W tym celu można dodać startUpCommand skrypt po wdrożeniu. Na przykład oto startUpCommand właściwość w zadaniu 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'

Uruchamianie testów na agencie kompilacji

W ramach procesu kompilacji możesz chcieć uruchomić testy w kodzie aplikacji. Testy są uruchamiane na agencie kompilacji, więc należy zainstalować zależności w środowisku wirtualnym na agencie kompilacji. Po uruchomieniu testów usuń środowisko wirtualne przed utworzeniem pliku .zip na potrzeby wdrożenia. Poniższe elementy skryptu ilustrują ten proces. Umieść je przed ArchiveFiles@2 zadaniem w pliku azure-pipelines.yml . Aby uzyskać więcej informacji, zobacz Uruchamianie skryptów międzyplatformowych.

# 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'

Możesz również użyć zadania, takiego jak PublishTestResults@2 , aby opublikować wyniki testu w potoku. Aby uzyskać więcej informacji, zobacz Tworzenie aplikacji języka Python — uruchamianie testów.

Czyszczenie zasobów

Aby uniknąć naliczania opłat w zasobach platformy Azure utworzonych w tym samouczku:

  • Usuń utworzony projekt. Usunięcie projektu powoduje usunięcie potoku i połączenia z usługą.

  • Usuń grupę zasobów platformy Azure zawierającą usługę App Service i plan usługi App Service. W witrynie Azure Portal przejdź do grupy zasobów, wybierz pozycję Usuń grupę zasobów i postępuj zgodnie z monitami.

  • Usuń konto magazynu, które obsługuje system plików dla usługi Cloud Shell. Zamknij usługę Cloud Shell, a następnie przejdź do grupy zasobów rozpoczynającej się od cloud-shell-storage-, wybierz pozycję Usuń grupę zasobów i postępuj zgodnie z monitami.

Następne kroki