Blog

Kontinuierliche Bereitstellung von Python-Eiern mit VSTS auf Azure

Aktualisiert Oktober 21, 2025
5 Minuten

In diesem Blog erfahren Sie, wie Sie eine grundlegende Continuous Deployment (CD)-Pipeline für Python-Code mit Visual Studio Team Services (VSTS) auf Azure erstellen. Der Aufbau einer vollständigen CI/CD-Pipeline auf VSTS ist eine kleine Herausforderung, da Python auf dem Azure-Stack (noch) kein Bürger ersten Ranges ist. Daher konzentrieren wir uns darauf, ein Python-Ei aus einem Repository zu erstellen und dieses Ei auf einer Dateifreigabe abzulegen.

Unser Anwendungsfall sieht folgendermaßen aus:

Unser Python-Code wird in einem Git-Repository in VSTS gehostet und für mehrere Maschinen in der Azure Cloud freigegeben.

Neue Commits auf dem Master-Zweig im Git-Repository lösen einen Prozess aus, der ein Python-Ei erstellt und auf einer Dateifreigabe veröffentlicht. Das Python-Ei ist ein nicht kompiliertes, gepacktes Python-Modul, das systemunabhängig ist.

Die Dateifreigabe wird auf einem Rechner mit JupyterHub, der für die Entwicklung verwendet wird, und einem mit Airflow, der für unsere Aufträge verwendet wird, gemountet. Neue Eier werden in der virtuellen Umgebung auf beiden Rechnern installiert, so dass jeder Zugriff auf unseren neuesten und besten Code hat.

Das Repository

Wir beginnen mit einem Repository namens example-project:

Beispiel_Projekt/
├── Beispielprojekt/       Python-Paket mit Quellcode.
│ └── __init__.py    Machen Sie den Ordner zu einem Paket.
  └── process.py    Beispielmodul.
├──  tests/  Tests für Ihr Python-Paket.
 └── test_process.py  Tests für process.py.
├── README.md  README mit Informationen zum Projekt.
├── setup.py  Installieren und verteilen Sie Ihr Modul.

└── vsts_build.bat  Windows Build-Skript.

Die Datei setup.py gibt an, wie Sie Ihr Python-Paket installieren und ein Ei daraus erstellen:

# setup.py

importieren os
von setuptools importieren Einrichtung, Pakete_finden

def lesen(fname):
    return öffnen Sie(os.Pfad.beitreten(os.Pfad.Verzeichnisname(__Datei__), fname)).lesen()

Einrichtung(
    Name="Beispielprojekt",
    Beschreibung="Beispielprojekt".,
    Autor="Henk Griffioen",
    long_description=lesen('README.md'),
    Pakete=Pakete_finden(),
)

Normalerweise können Sie mit find_packages() angeben, welche Ordner ein- oder ausgeschlossen werden sollen. Der Hosted VS2017-Agent verfügt jedoch über eine Version von setuptools, die dabei Probleme mit Untermodulen zu haben scheint.

vsts_build.bat baut das Ei auf und ist recht einfach:

:: vsts_build.bat

@echo aus
echo Ausführung eines Builds auf "%AGENT_NAME%" mit der ID: %AGENT_ID%.

:: Dekommentieren Sie die folgenden Zeilen, um einige Informationen über den Agenten zu erhalten:
:: @dir %AGENT_WORKFOLDER%
:: @dir %AGENT_BUILDDIRECTORY%
:: @dir %BUILD_SOURCESDIRECTORY%
:: @dir C:Python27
:: @dir C:

:: Bauen Sie das Ei.
C:Python27python.exe -W ignore setup.py bdist_egg

Dieses einfache Powershell-Skript verwendet Python 2.7 ( shame), um das Ei zu bauen. Python 3.6 ist auch auf dem Hosted VS2017 Agent verfügbar.

Stellen Sie sicher, dass Sie das Ei mit python setup.py bdist_egg auf Ihrem eigenen Rechner erstellen können.

Erstellen & freigeben

Nun, da unser Repository eingerichtet ist, können wir die Build- und Release-Pipeline erstellen. Wir gehen davon aus, dass Sie bereits eine Agenten-Warteschlange mit dem Hosted VS2017-Agenten haben. Anstatt zwei Schritte für den Build und die Freigabe durchzuführen, erstellen wir das Ei in einem Schritt und legen es auf einem Fileshare ab.

Gehen Sie in VSTS zu 'Build & Release' -> 'Builds' -> '+ New'. Beginnen Sie mit einem leeren Prozess, geben Sie ihm einen schönen Namen und wählen Sie die Warteschlange mit dem Hosted VS2017 Agent.

Die erste Aufgabe besteht darin, die Quellen zu besorgen. Wählen Sie Ihr Repository unter 'Dieses Projekt' und den Master-Zweig.

Die nächste Aufgabe baut das Ei und ruft unser vsts_build.bat auf. Fügen Sie ein 'Batch-Skript' hinzu und verweisen Sie mit dem 'Pfad' auf das vsts_build.bat im Repository.

Fügen Sie die Aufgabe 'Run Inline Azure Powershell' hinzu (möglicherweise müssen Sie danach suchen), so dass früher eingesetzte Eier gelöscht werden. Fügen Sie unter 'Script to the run` hinzu:

Param(
  [string]$SecretKey
)

$Kontext  = New-AzureStorageContext -StorageAccountName "" -StorageAccountKey "$SecretKey"

Remove-AzureStorageFile -ShareName "" -Path "/example_project-v0.0.0-py2.7.egg" -Context  $Kontext

Der Schlüssel des Speicherkontos ist ein Parameter für dieses Skript. Stellen Sie daher unter 'Argument' Folgendes ein: -SecretKey "$(SecretKey)". Aktivieren Sie unter 'Steuerungsoptionen' Continue on Error, damit Ihre Pipeline nicht fehlschlägt, wenn auf der Dateifreigabe kein Ei zum Entfernen vorhanden ist.

Nun, da wir unser Artefakt erstellt haben, können wir es veröffentlichen. Wählen Sie die Aufgabe 'Build-Artefakte veröffentlichen' und konfigurieren Sie sie.

Wir schummeln ein wenig und fügen das Hochladen des Eies in unseren Build-Prozess ein (am besten ist es, einen separaten Releaste-Schritt zu erstellen). Erstellen Sie eine neue Aufgabe vom Typ 'Azure Storage Upload'. Diese Aufgabe ist in VSTS nicht standardmäßig verfügbar, Sie können sie kostenlos über den VSTS Marketplace installieren. Nach der Installation konfigurieren Sie Folgendes:

  • Quelle: $(Build.SourcesDirectory)/dist
  • Datei: *.egg
  • Zielort: https://.file.core.windows.net//
  • Schlüssel: $(SecretKey)

Der endgültige Build-Prozess sollte in etwa so aussehen:

Auf der Registerkarte 'Variablen' fügen Sie eine Variable namens SecretKey mit dem Schlüssel für das Speicherkonto hinzu. Dieser Schlüssel gewährt vollen Zugriff auf das Blob-Speicherkonto (es ist besser, einen kurzfristigen SAS-Token zu generieren). Auf der Registerkarte 'Auslöser' können Sie festlegen, wann die Erstellung beginnen soll. Aktivieren Sie die kontinuierliche Integration basierend auf neuem Code im Master-Zweig.

Klicken Sie auf 'Speichern & in die Warteschlange stellen', um Ihre Pipeline zu speichern. Jedes Mal, wenn ein neuer Git-Commit nach Master gepusht wird, wird ein neues Ei auf die Dateifreigabe gelegt!

Fazit

Wir haben eine einfache Pipeline erstellt, um neuen Python-Code auf einer Dateifreigabe bereitzustellen. Dieser Code ist eine Ei-Distribution des Python-Moduls. Wenn Sie eine anspruchsvollere Pipeline erstellen möchten, müssen Sie auf Ressourcen zurückgreifen, die VSTS & Azure standardmäßig nicht zur Verfügung stehen, und zum Beispiel Ihren eigenen Agenten hosten oder Ihren eigenen Jenkins-Server verwenden.


Vielen Dank an Erik Kooijman von Delta-N und Marco Lormans von Xebia für die vielen VSTS-Tipps!

Contact

Let’s discuss how we can support your journey.