Mein Problem ist genau wie Wie installiere ich interne Anforderungen für Python Heroku-Projekte? und Wie passt man pips Anforderung.txt in Heroku bei der Bereitstellung an? . Nämlich, Ich habe einen privaten Repo, von dem ich eine Python-Abhängigkeit in meiner Heroku-App installieren muss . Die kanonische Antwort , die von Herokus eigenen Kenneth Reitz , soll etwas wie
setzen %Vor% in Ihrer requirements.txt
-Datei.
Meine Sicherheitsanforderungen verhindern, dass mein Passwort in einem Repo gespeichert wird. Ich möchte die Abhängigkeit auch nicht in das Repo meiner App einfügen, sie sind separate Softwareteile und müssen separat sein Repos.) Der einzige Ort, an dem ich mein Passwort (oder vorzugsweise ein GitHub OAuth-Token oder einen Deployment-Schlüssel) an Heroku weitergeben kann, ist eine Umgebungsvariable wie
%Vor% Ich könnte eine benutzerdefinierte .profile
im Repo meiner App verwenden, aber dann würde ich meine Abhängigkeit herunterladen und installieren, sobald ein Prozess (Web, Worker usw.) neu gestartet wird.
Damit bleibt ein benutzerdefiniertes Buildpack und das Heroku Labs-Addon übrig, das mein heroku config
freilegt. Umgebung vor dem Kompilieren des Buildpacks. Ich habe versucht einen auf Buildpack Multi . Die Idee ist, Buildpack Multi ist das primäre Buildpack, und mit der .buildpacks
-Datei im Repo meiner App, lädt es zuerst das normale Heroku Python-Buildpack herunter, dann mein eigenes.
Das Problem besteht auch, nachdem Buildpack Multi das Python-Buildpack, das Python Binary und Pip-Paket sind nicht sichtbar zu meinem Buildpack, sobald Buildpack Multi läuft. Daher schlägt das benutzerdefinierte Buildpack einfach fehl. (In meinen Tests wurde die Umgebungsvariable GITHUB_OAUTH_TOKEN
korrekt den Buildpacks ausgesetzt.)
Das Einzige, was ich noch ausprobieren kann, ist, meine eigene Fork des Python-Buildpacks zu erstellen, das meine Abhängigkeit installiert, wenn es alles von requirements.txt
installiert, oder sogar requirements.txt
direkt neu schreibt. Beide scheinen wirklich schwere Lösungen für das zu sein, was ich für ein sehr häufiges Problem halte.
Mein benutzerdefiniertes Buildpack (oben verlinkt) lädt nun meine Closed-Source-Abhängigkeit ("foo") herunter und speichert sie in dem Herstellerverzeichnis, das das geos buildpack verwendet. Ich habe in meiner App die Abhängigkeiten, die foo selbst hat, in die requirements.txt
meiner App eingegeben. Daher installiert Pip die Abhängigkeiten von foo über die requirements.txt
meiner App und das Buildpack fügt die fionierte Kopie von foo in die PYTHONPATH
der App-Umgebung ein (so dass foo's setup.py install
niemals läuft).
Das größte Problem bei diesem Ansatz ist die Kopplung meines (zugegebenermaßen schlecht geschriebenen) Buildpacks mit meiner App. Das zweite Problem ist, dass die requirements.txt
der App foo einfach als Abhängigkeit auflisten soll und die Abhängigkeiten von foo an foo bestimmen soll. Schließlich gibt es keinen guten Weg, mich selbst in sechs Monaten zu geben, wenn ich vergesse, wie ich all das gemacht habe, eine Fehlermeldung, wenn ich vergessen habe, meine GITHUB_OAUTH_TOKEN Umgebungsvariable zu setzen (oder noch weniger nützliches Fehlerfeedback herzustellen wäre Token läuft ab und die Umgebungsvariable existiert noch, ist aber nicht mehr gültig).
Was (wahrscheinlich offensichtlich) fehlt mir? Wie hast du dieses Problem in deinen Apps gelöst? Irgendwelche Vorschläge, um mein Build Pack zum Laufen zu bringen, oder hoffentlich eine noch einfachere Lösung?
Ich habe ein Buildpack erstellt, um dieses Problem mit einem benutzerdefinierten ssh-Schlüssel zu lösen, der als Umgebungsvariable gespeichert ist. Da das Buildpack technologieunabhängig ist, kann es zum Herunterladen von Abhängigkeiten mit jedem Tool wie Compiler für PHP, Bundler für Ruby, Npm für Javascript usw. verwendet werden: Ссылка
Fügen Sie das Buildpack zu Ihrer App hinzu:
%Vor%Erstellen Sie einen neuen SSH-Schlüssel (nehmen wir an, Sie nennen ihn deploy_key)
Fügen Sie den öffentlichen Schlüssel Ihrem privaten Repository-Konto hinzu. Zum Beispiel:
Kodieren Sie den privaten Schlüssel als base64-Zeichenfolge und fügen Sie ihn als CUSTOM_SSH_KEY
-Umgebungsvariable der heroku-App hinzu.
Erstellen Sie eine kommagetrennte Liste der Hosts, für die der ssh-Schlüssel verwendet werden soll, und fügen Sie sie als CUSTOM_SSH_KEY_HOSTS
-Umgebungsvariable der heroku-App hinzu.