Das Gulp-Snyk-Plugin entwickeln: ein Interview mit Doug Wade
Tim Kadlec
26. Januar 2017
0 Min. LesezeitDoug Wade ist Senior Front-End Engineer bei Indeed. Doug hat das großartige gulp-snyk-Pluginentwickelt, mit dem sich Snyk nahtlos in den Gulp-Build-Prozess integrieren lässt. Wir haben uns sehr gefreut, auf das Plugin zu stoßen, und wollten mit Doug darüber sprechen.

Warum haben Sie angefangen, Snyk zu verwenden?
Als ich letztes Jahr als Mentor beim Node Summit war, hatte ich die Gelegenheit, Guys großartigen Vortrag und seine Live-Demo anzusehen. Er zeigte, wie sich einige Sicherheitswarnungen mit minimatch ausnutzen lassen, die ich in meinen Projekten ignoriert hatte. Das war sowohl aufschlussreich als auch beängstigend.
Während der Happy Hour sprach ich mit Guy darüber, warum ich von nsp zu Snyk wechseln sollte. Er erzählte mir von (wie ich es nenne) Snyks „Killer-Feature“: snyk protect.
Lange Zeit störte es mich, .nsprcs auf Github zu veröffentlichen, damit meine Travis-Builds erfolgreich durchliefen. Bei Projekten wie React Server fühlte es sich an, als würde ich ein Manifest mit Sicherheitslücken veröffentlichen, das Angreifer zum Angriff auf Websites wie www.redfin.com nutzen könnten. Genau das wollte ich doch verhindern! Realistisch betrachtet ließ es sich aber nicht anders machen.
Zu Beginn der Geschichte von npm traf Isaac Z. Schlueter (Erfinder und CEO von npm) eine Entscheidung, die meiner Meinung nach entscheidend dafür war, dass die Zahl der verfügbaren npm-Pakete so stark anwuchs und der Einstieg in die Open-Source-Entwicklung mit npm so einfach wurde. Isaac wollte die aus Java bekannte Abhängigkeitshölle vermeiden und sorgte dafür, dass jede abhängige Komponente eine eigene, unabhängige Kopie ihrer deklarierten Abhängigkeiten erhält.
Das bedeutet: Als einzelner Entwickler, der Module für npm schreibt – wie ich es für viele meiner Open-Source-Module tue –, kann ich sehr schnell iterieren und meine Abhängigkeiten ändern und aktualisieren, ohne befürchten zu müssen, dass meine Kunden auf einer veralteten Version festsitzen, während sie auf einen konsistenten Abhängigkeitsbaum warten.
Der Nachteil: Für Anwendungsentwickler, die anfällige Abhängigkeiten aus ihrem Abhängigkeitsbaum entfernen müssen – so wie ich bei meiner Arbeit –, reicht es nicht aus, die direkten Abhängigkeiten zu aktualisieren. Sie müssen auch sicherstellen, dass jede Abhängigkeit auf die sichere Version aktualisiert wird. Nachdem mich ein Entwickler, den ich sehr schätze, scharf dafür kritisiert hatte, dass ich ein Issue und einen PR zur Aktualisierung einer anfälligen Abhängigkeit in einem Node-Foundation-Projekt eingereicht hatte, war mir klar: Die nsp-Methode mit nsprc-Dateien und dem Warten darauf, dass Korrekturen das Ökosystem durchlaufen, war nicht nachhaltig.
Snyks Ansatz löst dieses Problem, indem die Anwendung über ein postinstall-Skript gepatcht wird. So muss ich nicht warten, bis die Änderung das Ökosystem durchlaufen hat. Und mein Manifest listet nicht länger aktuell bestehende Sicherheitslücken auf, sondern solche, die bereits behoben wurden.
Warum haben Sie schließlich gulp-snyk entwickelt?
Ich entwickle schon seit den Node-0.8-Zeiten mit Node, vor allem, weil es damals die einzige Entwicklungsumgebung war, die ich auf meinem Windows-Rechner erfolgreich einrichten konnte, als ich gerade programmieren lernte. Deshalb habe ich noch eine ganze Reihe von Modulen, die Gulp als Build-System verwenden.
Ich bin der Meinung, dass Build-Systeme vor allem dazu dienen, gängige Aufgaben zu standardisieren und auffindbar zu machen. Statt von neuen Mitwirkenden zu erwarten, dass sie Aufgaben verteilt in einer package.json und einer gulpfile suchen, wollte ich eine einzige Aufgabenliste erstellen. Es war zwar nicht viel Boilerplate-Code nötig, um meine Snyk-Aufgaben in Gulp zu schreiben, aber genug, dass ich ihn nicht zwischen Projekten kopieren und einfügen wollte. Deshalb habe ich ihn auf npm veröffentlicht.
Den Großteil der Entwicklung habe ich an zwei Abenden nach der Arbeit erledigt. Wie sich herausstellte, gibt es eine undokumentierte programmatische API, die gulp-snyk zum Ausführen des Testziels verwendet.
Ich habe ein Issue eröffnet, um die Abstimmung mit Snyk zu versuchen. Für mich zeigt das aber auch eine meiner Lieblingsseiten dynamischer Sprachen: Ich musste nichts über Snyk wissen. Ich konnte einfach eine REPL (Read-Eval-Print-Loop) starten und die Dinge ausprobieren.
Wie verwenden Sie gulp-snyk heute?
Ich verwende gulp-snyk zum Schutz von Clefs und name-suffixes und plane, es auch zu React Server hinzuzufügen. Ich nutze Snyk für 17 meiner Node-Module und möchte es auf alle 33 davon ausweiten.
Dreiunddreißig NPM-Module! Was motiviert Sie zu solchen Beiträgen?
Ich bin überzeugt, dass wir als Entwickler eine ethische Verpflichtung haben, der Community etwas zurückzugeben, weil wir so viel von ihr profitieren. Ehrlich gesagt glaube ich aber, dass vieles, was mich motiviert, zutiefst egoistisch ist.
Wenn ich einen PR für Node, npm oder Lerna einreiche, kann ich den Code einiger der besten und klügsten Köpfe der Softwareentwicklung erkunden und ein Code-Review von ihnen erhalten. Wenn ich zum ersten Mal ein neues Projekt, das ich geschrieben habe, auf Reddit oder Hacker News vorstelle, bekomme ich Feedback zu API-Design, Architektur und Dokumentation, das viel genauer auf mein Fachgebiet zugeschnitten ist als das Feedback, das ich im Büro erhalte.
In gewisser Weise ist es wohl auch meine Art, die Leiter nicht hinter mir hochzuziehen. Meine Karriere baut auf der Zusammenarbeit mit freier und Open-Source-Software (FOSS) und dem Lernen daraus auf. Ganz konkret und in jeder Hinsicht wäre ich ohne FOSS also nicht dort, wo ich heute bin.
Apropos: Wo können Interessierte mithelfen, gulp-snyk weiterzuentwickeln?
Das gulp-snyk-Plugin ist auf npm verfügbar und lässt sich mit npm (npm install --save-dev gulp-snyk) oder yarn (yarn add --dev gulp-snyk) installieren. Wer mithelfen möchte, findet den Code auf GitHub.
Starten Sie mit Capture-the-Flag
Erfahren Sie in unserem virtuellen On-Demand-Workshop für Einsteiger, wie Sie Capture-the-Flag-Challenges lösen.


