Delen via


CI/CD gebruiken met GitHub Actions om een Python-web-app te implementeren in Azure-app Service op Linux

Gebruik het Ci/CD-platform (continue integratie en continue levering) van GitHub Actions om een Python-web-app te implementeren in Azure-app Service op Linux. Uw GitHub Actions-werkstroom bouwt automatisch de code en implementeert deze in de App Service wanneer er een doorvoering naar de opslagplaats is. U kunt andere automatisering toevoegen in uw GitHub Actions-werkstroom, zoals testscripts, beveiligingscontroles en implementatie met meerdere fasen.

Een opslagplaats voor uw app-code maken

Als u al een Python-web-app hebt om te gebruiken, controleert u of deze is doorgevoerd in een GitHub-opslagplaats.

Als u een app nodig hebt om mee te werken, kunt u de opslagplaats splitsen en klonen op https://github.com/Microsoft/python-sample-vscode-flask-tutorial. De code is afkomstig uit de zelfstudie Flask in Visual Studio Code.

Notitie

Als uw app Django en een SQLite-database gebruikt, werkt deze niet voor deze zelfstudie. Als uw Django-app een afzonderlijke database zoals PostgreSQL gebruikt, kunt u deze gebruiken met deze zelfstudie. Zie overwegingen voor Django verderop in dit artikel voor meer informatie over Django.

De doel-Azure-app-service maken

De snelste manier om een App Service-exemplaar te maken, is door de Azure-opdrachtregelinterface (CLI) te gebruiken via de interactieve Azure Cloud Shell. De Cloud Shell bevat Git en Azure CLI. In de volgende stappen gebruikt u az webapp om zowel de App Service te maken als de eerste implementatie van uw app uit te voeren.

Stap 1. Meld u aan bij de Azure Portal op https://portal.azure.com.

Stap 2. Open de Azure CLI door het Cloud Shell-pictogram op de portalwerkbalk te selecteren.

Screenshot showing how to open Azure Cloud Shell in Azure portal.

Stap 3. Selecteer Bash in de Cloud Shell in de vervolgkeuzelijst.

Screenshot showing an Azure Cloud Shell Bash shell in Azure portal.

Stap 4. Kloon uw opslagplaats in Cloud Shell met behulp van git-kloon. Als u bijvoorbeeld de Flask-voorbeeld-app gebruikt, is de opdracht:

git clone https://github.com/<github-user>/python-sample-vscode-flask-tutorial.git

Vervang <github-gebruiker> door de naam van het GitHub-account waar u de opslagplaats hebt gesplitst. Als u een andere app-opslagplaats gebruikt, gaat u in deze opslagplaats GitHub Actions instellen.

Notitie

Cloud Shell wordt ondersteund door een Azure Storage-account in een resourcegroep met de naam cloud-shell-storage-your-region><. Dat opslagaccount bevat een afbeelding van het bestandssysteem van Cloud Shell, waarin de gekloonde opslagplaats wordt opgeslagen. Er zijn kleine kosten voor deze opslag. U kunt het opslagaccount aan het einde van dit artikel verwijderen, samen met andere resources die u maakt.

Tip

Als u in Cloud Shell wilt plakken, gebruikt u Ctrl+Shift+V of klikt u met de rechtermuisknop en selecteert u Plakken in het contextmenu.

Stap 5. Wijzig in Cloud Shell de map in de opslagplaatsmap met uw Python-app, zodat de opdracht az webapp up de app herkent als Python. Bijvoorbeeld voor de Flask-voorbeeld-app:

cd python-sample-vscode-flask-tutorial

Stap 6. Gebruik az webapp up in Cloud Shell om een App Service te maken en uw app in eerste instantie te implementeren.

az webapp up --name <app-service-name> --runtime "PYTHON:3.9"

Geef een App Service-naam op die uniek is in Azure. De naam moet 3 tot 60 tekens lang zijn en mag alleen letters, cijfers en afbreekstreepjes bevatten. De naam moet beginnen met een letter en eindigen op een letter of cijfer.

Hiermee az webapp list-runtimes haalt u een lijst met beschikbare runtimes op. Gebruik de PYTHON|X.Y indeling, waar X.Y is de Python-versie.

U kunt ook de locatie van de App Service opgeven met de --location parameter. Gebruik de az account list-locations --output table opdracht om een lijst met beschikbare locaties op te halen.

Stap 7. Als uw app een aangepaste opstartopdracht gebruikt, gebruikt u de az webapp config die opdracht. Als uw app geen aangepaste opstartopdracht heeft, kunt u deze stap overslaan.

De app python-sample-vscode-flask-tutorial bevat bijvoorbeeld een bestand met de naam startup.txt dat een opstartopdracht bevat die u als volgt kunt gebruiken:

az webapp config set \
  --resource-group <resource-group-name> \
  --name <app-service-name> \
  --startup-file startup.txt

U vindt de naam van de resourcegroep in de uitvoer van de vorige az webapp up opdracht. De naam van de resourcegroep begint met <azure-account-name>_rg_.

Stap 8. Als u de actieve app wilt zien, opent u een browser en gaat u naar http:// app-service-name.azurewebsites.net>.<

Als u een algemene pagina ziet, wacht u enkele seconden totdat de App Service is gestart en vernieuwt u de pagina. Als u de algemene pagina blijft zien, controleert u of u de juiste map hebt geïmplementeerd. Als u bijvoorbeeld de Flask-voorbeeld-app gebruikt, is de map python-sample-vscode-flask-tutorial. Controleer ook voor de Flask-voorbeeld-app of u de opstartopdracht juist hebt ingesteld.

Continue implementatie instellen in App Service

In de onderstaande stappen stelt u continue implementatie (CD) in, wat betekent dat er een nieuwe code-implementatie plaatsvindt wanneer een werkstroom wordt geactiveerd. De trigger in deze zelfstudie is elke wijziging in de hoofdbranch van uw opslagplaats, zoals met een pull-aanvraag (PR).

Stap 1. Voeg GitHub Action toe met de opdracht az webapp deployment github-actions add .

az webapp deployment github-actions add \
  --repo "<github-user>/<github-repo>" \
  --resource-group <resource-group-name> \
  --branch <branch-name> \
  --name <app-service-name> \
  --login-with-github

De --login-with-github parameter maakt gebruik van een interactieve methode om een persoonlijk toegangstoken op te halen. Volg de aanwijzingen om de verificatie te voltooien.

Als er een bestaand werkstroombestand is dat conflicteert met de naam die App Service gebruikt, wordt u gevraagd of u wilt overschrijven. Gebruik de --force parameter om te overschrijven zonder te vragen.

Wat de opdracht toevoegen doet:

  • Hiermee maakt u een nieuw werkstroombestand: .github/workflows/<workflow-name.yml> in uw opslagplaats. De naam van het bestand bevat de naam van uw App Service.
  • Haalt een publicatieprofiel op met geheimen voor uw App Service en voegt dit toe als een GitHub-actiegeheim. De naam van het geheim begint met AZUREAPPSERVICE_PUBLISHPROFILE_. Naar dit geheim wordt verwezen in het werkstroombestand.

Stap 2. Haal de details van een implementatieconfiguratie voor broncodebeheer op met de opdracht az webapp deployment source show .

az webapp deployment source show \
  --name <app-service-name> \
  --resource-group <resource-group-name>

Bevestig in de uitvoer van de opdracht de waarden voor de repoUrl en branch eigenschappen. Deze waarden moeten overeenkomen met de waarden die u in de vorige stap hebt opgegeven.

Uitleg van GitHub-werkstroom en acties

Een werkstroom wordt gedefinieerd door een YAML-bestand (.yml) in het pad /.github/workflows/ in uw opslagplaats. Dit YAML-bestand bevat de verschillende stappen en parameters waaruit de werkstroom bestaat, een geautomatiseerd proces dat is gekoppeld aan een GitHub-opslagplaats. U kunt elk project bouwen, testen, verpakken, vrijgeven en implementeren op GitHub met een werkstroom.

Elke werkstroom bestaat uit een of meer taken. Elke taak is op zijn beurt een reeks stappen. En tot slot is elke stap een shellscript of een actie.

In termen van de werkstroom die is ingesteld met uw Python-code voor implementatie in App Service, heeft de werkstroom de volgende acties:

Actie Beschrijving
Checkout Bekijk de opslagplaats op een runner, een GitHub Actions-agent.
setup-python Installeer Python op de runner.
appservice-build Bouw de web-app.
webapps-deploy Implementeer de web-app met behulp van een publicatieprofielreferentie om te verifiëren in Azure. De referentie wordt opgeslagen in een GitHub-geheim.

De werkstroomsjabloon die wordt gebruikt om de werkstroom te maken, is Azure/actions-workflow-samples.

De werkstroom wordt geactiveerd bij pushgebeurtenissen naar de opgegeven vertakking. De gebeurtenis en vertakking worden gedefinieerd aan het begin van het werkstroombestand. In het volgende codefragment ziet u bijvoorbeeld dat de werkstroom wordt geactiveerd bij pushgebeurtenissen naar de hoofdbranch :

on:
  push:
    branches:
    - main

Geautoriseerde OAuth-apps

Wanneer u continue implementatie instelt, autoriseert u Azure-app Service als een geautoriseerde OAuth-app voor uw GitHub-account. App Service gebruikt de geautoriseerde toegang om een GitHub-actie YML-bestand te maken in .github/workflows/<workflow-name.yml>. U kunt uw geautoriseerde apps zien en machtigingen intrekken onder uw GitHub-accounts Instellingen, onder Integraties/toepassingen.

Screenshot showing how to view authorized OAuth Apps for a GitHub account.

Profielgeheim publiceren in werkstroom

In het werkstroombestand .github/workflows/<workflow-name.yml> dat is toegevoegd aan de opslagplaats, ziet u een tijdelijke aanduiding voor het publiceren van profielreferenties die nodig zijn voor de implementatietaak van de werkstroom. De publicatieprofielgegevens worden versleuteld opgeslagen in de opslagplaats Instellingen, onder Beveiliging/acties.

Screenshot showing how to view action secrets in GitHub.

In dit artikel wordt de GitHub-actie geverifieerd met een referentie voor een publicatieprofiel. Er zijn andere manieren om te verifiëren, zoals met een service-principal of OpenID-Verbinding maken. Zie Implementeren in App Service met behulp van GitHub Actions voor meer informatie.

De werkstroom uitvoeren

Nu gaat u de werkstroom testen door een wijziging aan te brengen in de opslagplaats.

Stap 1. Ga naar de fork van de voorbeeldopslagplaats (of de opslagplaats die u hebt gebruikt) en selecteer de vertakking die u hebt ingesteld als onderdeel van de trigger.

Screenshot showing how to go to the repo and branch where the GitHub Actions workflow is defined.

Stap 2. Breng een kleine wijziging aan.

Als u bijvoorbeeld de VS Code Flask-zelfstudie hebt gebruikt, kunt u

  • Ga naar het /hello-app/templates/home.html-bestand van de triggerbranch.
  • Selecteer Bewerken en voeg de tekst Opnieuw implementeren toe.

Stap 3. Voer de wijziging rechtstreeks door naar de vertakking waarin u werkt.

  • Selecteer in de rechterbovenhoek van de pagina die u bewerkt de knop Wijzigingen doorvoeren... . Het venster Wijzigingen doorvoeren wordt geopend. Wijzig desgewenst het doorvoerbericht in het venster Doorvoerwijzigingen en selecteer vervolgens de knop Wijzigingen doorvoeren.
  • Met de doorvoering wordt de GitHub Actions-werkstroom gestart.

U kunt de werkstroom ook handmatig starten.

Stap 1. Ga naar het tabblad Acties van de opslagplaats die is ingesteld voor continue implementatie.

Stap 2. Selecteer de werkstroom in de lijst met werkstromen en selecteer vervolgens Werkstroom uitvoeren.

Problemen met een mislukte werkstroom oplossen

Als u de status van een werkstroom wilt controleren, gaat u naar het tabblad Acties van de opslagplaats. Wanneer u inzoomt op het werkstroombestand dat in deze zelfstudie is gemaakt, ziet u twee taken 'build' en 'deploy'. Voor een mislukte taak bekijkt u de uitvoer van taaktaken voor een indicatie van de fout. Enkele veelvoorkomende problemen zijn:

  • Als de app mislukt vanwege een ontbrekende afhankelijkheid, is uw bestand requirements.txt niet verwerkt tijdens de implementatie. Dit gedrag treedt op als u de web-app rechtstreeks in de portal hebt gemaakt in plaats van de az webapp up opdracht te gebruiken, zoals wordt weergegeven in dit artikel.

  • Als u de app-service hebt ingericht via de portal, is de buildactie SCM_DO_BUILD_DURING_DEPLOYMENT instelling mogelijk niet ingesteld. Deze instelling moet zijn ingesteld op true. Met az webapp up de opdracht wordt de build-actie automatisch ingesteld.

  • Als u een foutbericht ziet met de time-out voor TLS-handshake, voert u de werkstroom handmatig uit door automatische implementatie activeren te selecteren op het tabblad Acties van de opslagplaats om te zien of de time-out een tijdelijk probleem is.

  • Als u continue implementatie instelt voor de container-app, zoals wordt weergegeven in deze zelfstudie, wordt het werkstroombestand (.github/workflows/<workflow-name.yml>) in eerste instantie automatisch voor u gemaakt. Als u deze hebt gewijzigd, verwijdert u de wijzigingen om te zien of deze de fout veroorzaken.

Een script na de implementatie uitvoeren

Een script na de implementatie kan bijvoorbeeld omgevingsvariabelen definiëren die worden verwacht door de app-code. Voeg het script toe als onderdeel van de app-code en voer het uit met behulp van de opstartopdracht.

Als u hardcoderingsvariabelewaarden in uw YML-bestand van uw werkstroom wilt voorkomen, kunt u deze in plaats daarvan in de GitHub-webinterface raadplegen en vervolgens verwijzen naar de naam van de variabele in het script. U kunt versleutelde geheimen maken voor een opslagplaats of voor een omgeving (accountopslagplaats). Zie Versleutelde geheimen in GitHub Docs voor meer informatie.

Overwegingen voor Django

Zoals eerder in dit artikel is vermeld, kunt u GitHub Actions gebruiken om Django-apps te implementeren in Azure-app Service op Linux, als u een afzonderlijke database gebruikt. U kunt geen SQLite-database gebruiken, omdat App Service het bestand db.sqlite3 vergrendelt, waardoor zowel lees- als schrijfbewerkingen worden voorkomen. Dit gedrag heeft geen invloed op een externe database.

Zoals beschreven in het artikel Python-app configureren in App Service - Container opstarten, zoekt App Service automatisch naar een wsgi.py-bestand in uw app-code, dat meestal het app-object bevat. Wanneer u de opdracht hebt gebruikt om de webapp config set opstartopdracht in te stellen, hebt u de --startup-file parameter gebruikt om het bestand op te geven dat het app-object bevat. De webapp config set opdracht is niet beschikbaar in de webapps-deploy-actie. In plaats daarvan kunt u de startup-command parameter gebruiken om de opstartopdracht op te geven. In het volgende codefragment ziet u bijvoorbeeld hoe u de opstartopdracht opgeeft in het werkstroombestand:

startup-command: startup.txt

Wanneer u Django gebruikt, wilt u doorgaans de gegevensmodellen migreren met behulp van python manage.py migrate de opdracht nadat u de app-code hebt geïmplementeerd. U kunt de migratieopdracht uitvoeren in een script na de implementatie.

Verbinding verbreken met GitHub Actions

Als u de verbinding met GitHub Actions van uw App Service verbreekt, kunt u de implementatie van de app opnieuw configureren. U kunt kiezen wat er gebeurt met uw werkstroombestand nadat u de verbinding hebt verbroken, ongeacht of u het bestand wilt opslaan of verwijderen.

Verbreek de verbinding met GitHub Actions met Azure CLI az webapp deployment github-actions remove command.

az webapp deployment github-actions remove \
  --repo "<github-user>/<github-repo>" \
  --resource-group <resource-group-name> \
  --branch <branch-name> \
  --name <app-service-name> \
  --login-with-github

Resources opschonen

Verwijder de resourcegroep die de App Service en het App Service-plan bevat om te voorkomen dat er kosten in rekening worden gebracht voor de Azure-resources die in deze zelfstudie zijn gemaakt.

Overal waar de Azure CLI is geïnstalleerd, inclusief de Azure Cloud Shell, kunt u de opdracht az group delete gebruiken om de resourcegroep te verwijderen.

az group delete --name <resource-group-name>

Als u het opslagaccount wilt verwijderen dat het bestandssysteem voor Cloud Shell onderhoudt, waarvoor een kleine maandelijkse kosten in rekening worden gebracht, verwijdert u de resourcegroep die begint met cloud-shell-storage. Als u de enige gebruiker van de groep bent, is het veilig om de resourcegroep te verwijderen. Als er andere gebruikers zijn, kunt u een opslagaccount in de resourcegroep verwijderen.

Als u de Azure-resourcegroep hebt verwijderd, kunt u ook de volgende wijzigingen aanbrengen in het GitHub-account en de opslagplaats die is verbonden voor continue implementatie:

  • Verwijder in de opslagplaats het .github/workflows/<workflow-name.yml-bestand>.
  • Verwijder in de opslagplaatsinstellingen de AZUREAPPSERVICE_PUBLISHPROFILE_ geheime sleutel die voor de werkstroom is gemaakt.
  • Verwijder in de GitHub-accountinstellingen Azure-app Service als een geautoriseerde OAuth-app voor uw GitHub-account.