Eine Geschichte über das Ausprobieren eines (Golang +) Python-Monorepo mit Bazel

Dieser Artikel ist der dritte Tag von OpenSaaS Studio Adventskalender 2019.

Einführung

Ersteres ist eine Mono-Repo-Konfiguration mit Bazel in Golang- und Python-Microservices. Ich habe mich gefragt, ob Python mit dem Mono-Repo gemischt werden kann, wenn ich Bazel verwende, das mehrere Sprachen unterstützt, aber es war schwierig, also werde ich einen schwierigen Punkt hinterlassen.

Annahme

Motivation

Verstopfter Punkt

Sowohl Python 2 als auch 3 sind erforderlich

Ich habe nur Python3-Serien im Dienst verwendet, aber ich brauchte Python2-Serien, um das erstellte Image zu pushen. Da ich Container-Registrierung als Image-Registrierung des Containers verwendet habe, benötigt Bazel das Google Cloud SDK, um das Image zu pushen, und es ist damit verknüpft. Ich denke, dass Python2-System in Form einer Fortsetzung benötigt wurde. Beschreibung des Google Cloud SDK

Neuere Versionen von macOS enthalten die entsprechende Version von Python, die für das Google Cloud SDK erforderlich ist. Das Cloud SDK erfordert Python 2 mit einer Versionsnummer von Python 2.7.9 oder höher. Wenn Sie einen zusätzlichen Python-Interpreter installieren, darf dieser die Installation des Google Cloud SDK nicht beeinträchtigen.

Was ist passiert

Bazel hat einen Mechanismus, mit dem Sie den Python-Interpreter angeben können, der beim Erstellen verwendet werden soll, also habe ich diesen verwendet.

Die Interpreterdefinition und Builddefinition sehen folgendermaßen aus.

load("@rules_python//python:defs.bzl", "py_runtime_pair")

py_runtime(
    name = "py2_local_bin_runtime",
    interpreter_path = "/usr/local/bin/python2",
    python_version = "PY2",
)

py_runtime(
    name = "py3_6_local_bin_runtime",
    interpreter_path = "/usr/local/bin/python3.6",
    python_version = "PY3",
)

py_runtime_pair(
    name = "py_local_bin_runtime_pair",
    py2_runtime = ":py2_local_bin_runtime",
    py3_runtime = ":py3_6_local_bin_runtime",
)

toolchain(
    name = "py_mac_toolchain",
    exec_compatible_with = [
        "@bazel_tools//platforms:osx",
        "@bazel_tools//platforms:x86_64",
    ],
    toolchain = "py_local_bin_runtime_pair",
    toolchain_type = "@rules_python//python:toolchain_type",
)
register_toolchains(
    "//:py_mac_toolchain",
    "//:py_linux_toolchain",
)
py_binary(
    name = "mysite",
    srcs = ["manage.py"],
    deps = [
        "//mysite/mysite:py_default_library",
        "//mysite/polls:py_default_library",
    ],
    main = "manage.py",
    python_version = "PY3",
)

Ich kann keine Bibliothek bekommen, die Python3 unterstützt

Bei Verwendung von Bazel Rules for Python wird beim Herunterladen der Bibliothek anscheinend der dem Befehl "python" zugeordnete "pip" ausgeführt. Wie ich oben geschrieben habe, war die Standardeinstellung "Python" 2 Serien, sodass ich die Bibliothek der Python 3-Serie herunterladen konnte. Der Code lautet hier

Was ist passiert

Geändert in python-> python3.6, sodass 3 Serien durch Gabeln verwendet werden können .. Als ich jedoch die neueste Version überprüfte, war sie standardmäßig Pip3-kompatibel, sodass jetzt möglicherweise kein Problem mehr besteht.

Leiden unter dem Einstiegspunkt des erstellten Bildes

Bazel hat eine Standardregel (py3_image) zum Erstellen eines Python3 Docker-Images. Als ich es in Kombination mit Python: 3.6-slim erstellt habe, konnte das erstellte Image nicht gestartet werden. Die Build-Definition sieht folgendermaßen aus

container_pull(
    name = "py3_base",
    registry = "index.docker.io",
    repository = "library/python",
    tag = "3.6-slim",
)
py3_image(
    name = "mysite_image",
    srcs = ["manage.py"],
    deps = [
        "//mysite/mysite:py_default_library",
        "//mysite/polls:py_default_library",
    ],
    main = "manage.py",
    base = "@py3_base//image",
)

Eigentlich ist der Einstiegspunkt des von py3_image erstellten Bildes standardmäßig / usr / bin / python, aber in Python: 3.6-slim ist der Python-Befehl nicht in diesem Pfad festgelegt und kann nicht gestartet werden. tat. Der Code lautet hier

Was ist passiert

Ich habe dieses Bild verwendet, weil es normalerweise mit python: 3.6 begann. (Es wird davon ausgegangen, dass die Bildoptimierung bei Bedarf später durchgeführt wird.)

Die Python-Version ist für jeden Dienst unterschiedlich

Es gab drei Python-Dienste, und die von mir verwendeten Python-Versionen unterschieden sich alle von 3.5, 3.6 und 3.7. Die oben beschriebene Methode zur Verwendung des Python-Interpreters kann nur das 2. und 3. System trennen, sodass dieser Mechanismus nicht damit umgehen kann.

Was ist passiert

Ich habe beschlossen, alle im Dienst verwendeten Python-Versionen auf 3.6 zu verschieben. Die Überprüfung hat bisher lange gedauert, und ich dachte, dass eine komplizierte Konfiguration des Builds von der ursprünglichen Richtlinie abweichen würde. Daher habe ich beschlossen, die Anzahl der zu verwaltenden Dinge zu reduzieren. Wenn Sie mit mehreren Versionen von Python3 koexistieren möchten, können Sie möglicherweise WORKSPACE trennen und für jede Version den erforderlichen Python-Interpreter angeben. (unbestätigt)

├── service_for_python3.6
│   └── WORKSPACE <-Python3 hier.Richten Sie 6 Dolmetscher ein
├── service_for_python3.7
│   └── WORKSPACE <-Python3 hier.Setze 7 Dolmetscher
└── WORKSPACE

Der Import von "__init __. Py" ist unterbrochen

(Wahrscheinlich) Das gleiche Ereignis wie dieses Problem ist in der Bibliothek der Google-Cloud-XXX-Serie aufgetreten. Es scheint, dass das Problem durch die unterschiedliche Verzeichnisstruktur beim Installieren der Bibliothek mit "pip install" und beim Erstellen mit Bazel verursacht wurde.

Was ist passiert

Es gibt auch einen Kommentar in der Ausgabe, der jetzt durch Angabe des Attributs "Legacy_create_init" ausgeführt werden kann.

Docker-Image und Build-Umgebungsplattform sind unterschiedlich

Ich verwende Tensorflow-GPU für einige Dienste und konnte die Bibliothek nicht herunterladen, da die Build-Umgebung keine GPU hatte.

Was ist passiert

Es ist ungelöst. Es ist schon eine Weile her, seit ich mit der Überprüfung begonnen habe, also habe ich sie hier aufgerundet. Bazel kann dies möglicherweise verarbeiten, indem eine der GPU zugeordnete Plattform angegeben wird (sofern vorhanden) oder indem dieser Dienst auf einer Buildfarm mit der GPU erstellt wird.

Zusammenfassung

Recommended Posts

Eine Geschichte über das Ausprobieren eines (Golang +) Python-Monorepo mit Bazel
Die Geschichte, mit Python eine Hanon-ähnliche Partitur zu machen
Eine Geschichte über einen Amateur, der mit Python (Kivy) einen Blockbruch macht ②
Eine Geschichte über einen Amateur, der mit Python (Kivy) einen Blockbruch macht ①
Eine Geschichte über den Versuch, private Variablen in Python zu implementieren.
Eine Geschichte über einen Python-Anfänger, der mit dem No-Modul'http.server 'feststeckt.
Eine Geschichte über das Hinzufügen einer REST-API zu einem mit Python erstellten Daemon
Eine Geschichte über maschinelles Lernen mit Kyasuket
Eine Geschichte über die Entwicklung eines weichen Typs mit Firestore + Python + OpenAPI + Typescript
[Hinweis] Eine Geschichte über den Versuch, eine Klassenmethode mit zwei Unterbalken in der Python 3-Serie zu überschreiben.
Eine Geschichte über den Versuch, mehrere Python-Versionen auszuführen (Mac Edition)
Eine Geschichte über Python Pop und Append
[Python3] Eine Geschichte, die bei der Zeitzonenkonvertierung steckt
Eine Geschichte über den Umgang mit Binärdaten in Python
Eine Geschichte über die Implementierung eines Anmeldebildschirms mit Django
Eine Geschichte über das Ausführen von Python auf PHP auf Heroku
Eine Geschichte über das Ändern von Python und das Hinzufügen von Funktionen
Geschichte der Verwendung von Resonas Software-Token mit 1Password
Eine Geschichte über die Vorhersage des Wechselkurses mit Deep Learning
Die Geschichte, wie theano mit TSUBAME 2.0 verwaltet wurde
Ein Memo zum Erstellen einer Django (Python) -Anwendung mit Docker
Eine Geschichte darüber, wie Windows 10-Benutzer eine Umgebung für die Verwendung von OpenCV3 mit Python 3.5 erstellt haben
Eine Geschichte über einen Python-Anfänger, der versucht, Google-Suchergebnisse mithilfe der API abzurufen
Eine Geschichte über den Versuch, Linter mitten in einem Python (Flask) -Projekt vorzustellen
Stolpern Geschichte mit Python-Array
Memorandum über Korrelation [Python]
Machen Sie eine Lotterie mit Python
Ein Memorandum über den Python-Mock
Erstellen Sie ein Verzeichnis mit Python
Ein Hinweis zu [Python] __debug__
Ein Hinweis zum Aufrufen der Facebook-API mit dem Python SDK
Eine Geschichte darüber, wie man einen relativen Pfad in Python angibt.
Eine Geschichte über den Wettbewerb mit einem Freund in Othello AI Preparation
[Python] Hinweise beim Versuch, Numpy mit Cython zu verwenden
Eine Geschichte über die Installation von matplotlib mit pip mit einem Fehler
Eine Geschichte über den Umgang mit dem CORS-Problem
Eine Geschichte über das zufällige Erstellen eines kurzen Songs mit Sudachi Py
Maschinelles Lernen Eine Geschichte über Menschen, die mit GBDT in GBDT in Python nicht vertraut sind
[Django] Eine Geschichte über das Feststecken in einem Sumpf beim Versuch, einen Reißverschluss mit einem Formular zu validieren [TDD]
[Python, Selenium, PhantomJS] Eine Geschichte beim Scrapen einer Website mit fauler Last
[Python] Was ist eine with-Anweisung?
Löse ABC163 A ~ C mit Python
Python-Grafikhandbuch mit Matplotlib.
Eine erfrischende Geschichte über Slice in Python
Eine Geschichte über den Versuch, einen Chot zu automatisieren, wenn Sie selbst kochen
Lassen Sie uns eine GUI mit Python erstellen.
Python: Ein Hinweis zu Klasse 1 "Abstract"
Eine launische Geschichte über Slice in Python
Erstellen Sie eine virtuelle Umgebung mit Python!
Ich habe mit Python eine Lotterie gemacht.
Die Geschichte, einen Standardtreiber für db mit Python zu erstellen.
Erstellen einer virtuellen Umgebung mit Python 3
Löse ABC168 A ~ C mit Python
Erstellen Sie ein Empfehlungssystem mit Python
[Kleine Geschichte] Holen Sie sich mit Python einen Zeitstempel
Generieren Sie eine vorsignierte URL mit golang
[Python] Generiere ein Passwort mit Slackbot
Löse ABC162 A ~ C mit Python
Löse ABC167 A ~ C mit Python
Löse ABC158 A ~ C mit Python