Heroku: Python-Abhängigkeiten in privaten Repos, ohne mein Passwort zu speichern

8

Das Problem

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%

Lösungsversuche

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.

Update: Aktueller Workaround

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).

Hilferuf

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?

    
wkschwartz 23.01.2014, 01:45
quelle

2 Antworten

0

Sie können einen Vorkompilierungsschritt als hier verwenden, um etwas wie M4 zu starten Ersetze deine Anforderungen.txt, um das Passwort von der Umgebungsvariable aus einzugeben.

    
John 20.04.2017 01:46
quelle
0

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: Ссылка

  1. Fügen Sie das Buildpack zu Ihrer App hinzu:

    %Vor%
  2. Erstellen Sie einen neuen SSH-Schlüssel (nehmen wir an, Sie nennen ihn deploy_key)

  3. Fügen Sie den öffentlichen Schlüssel Ihrem privaten Repository-Konto hinzu. Zum Beispiel:

  4. Kodieren Sie den privaten Schlüssel als base64-Zeichenfolge und fügen Sie ihn als CUSTOM_SSH_KEY -Umgebungsvariable der heroku-App hinzu.

  5. 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.

    %Vor%
  6. Stellen Sie Ihre App bereit und genießen Sie:)
Simon Soriano 16.05.2017 15:58
quelle

Tags und Links