2012-07-18 5 views
11

Ich betreibe Jenkins und ich habe es erfolgreich mit meinem Github-Konto arbeiten, aber ich kann es nicht richtig mit Amazon S3 arbeiten.Jenkins Continuous Integration mit Amazon S3 - Alles wird in den Stamm hochgeladen?

Ich habe das S3-Plugin installiert und wenn ich ein Build starte, wird es erfolgreich in den S3-Bucket hochgeladen, aber alle hochgeladenen Dateien landen im Root des Buckets. Ich habe eine Reihe von Ordnern (wie/css/js und so weiter), aber alle Dateien in diesen Ordnern von Hithub enden im Stamm meines S3-Kontos.

Ist es möglich, dass das S3-Plugin die Ordnerstruktur hochlädt und behält?

Antwort

15

Es sieht nicht so aus, als ob das möglich ist. Stattdessen verwende ich s3cmd, um dies zu tun. Sie müssen zunächst auf dem Server installieren, und dann in einen des Bash-Skripte innerhalb eines Jenkins Jobs, den Sie verwenden können:

s3cmd sync -r -P $WORKSPACE/ s3://YOUR_BUCKET_NAME 

, dass alle der Dateien auf Ihr S3 Konto, auf die Ordnerstruktur kopiert. Das -P enthält Leseberechtigungen für alle Benutzer (erforderlich, wenn Sie Ihren Bucket als Webserver verwenden). Dies ist eine großartige Lösung, da die Synchronisierungsfunktion verwendet wird, da alle lokalen Dateien mit dem S3-Bucket verglichen werden und nur Dateien kopiert werden, die sich geändert haben (durch Vergleich von Dateigrößen und Prüfsummen).

+1

Ich würde vorschlagen, t zu verwenden er JClouds Jetzt einstecken. – Aron

+0

JClouds ist auch nicht großartig; Es kommt immer wieder zu einem obskuren Fehler beim Streaming. Das Zurückfallen zu einem CLI-Werkzeug dafür ist lächerlich ... – aendrew

+0

s3cmd ist nicht optimal, da es einen separaten Speicher für die aws-Anmeldeinformationen benötigt. Die Verwendung von s3-Profilen für die Authentifizierung ist für das s3-Plugin von Vorteil. Stimmen Sie zu, dass das Beibehalten der Artefakthierarchie dem aktuellen Verhalten vorzuziehen wäre. –

3

Ich habe noch nie mit dem S3-Plugin für Jenkins gearbeitet (aber jetzt, da ich weiß, dass es existiert, könnte ich es versuchen), obwohl es scheint, können Sie nur tun, was Sie wollen mit einem Workaround .

Hier ist, was die eigentliche Plugin-Code ist (von Github genommen) -I die Teile des Codes entfernt, die nicht relevant für die aus Gründen der Lesbarkeit sind:

Klasse hudson.plugins.s3.S3Profile, Methode upload:

final Destination dest = new Destination(bucketName,filePath.getName()); 
getClient().putObject(dest.bucketName, dest.objectName, filePath.read(), metadata); 

Nun, wenn Sie einen Blick in hudson.FilePath.getName() ‚s JavaDoc:

Ruft nur den Dateinamen Teil ohne Verzeichnisse. Jetzt

, werfen Sie einen Blick in die hudson.plugins.s3.Destination ‚Konstruktor:

public Destination(final String userBucketName, final String fileName) { 

    if (userBucketName == null || fileName == null) 
     throw new IllegalArgumentException("Not defined for null parameters: "+userBucketName+","+fileName); 

    final String[] bucketNameArray = userBucketName.split("/", 2); 
    bucketName = bucketNameArray[0]; 
    if (bucketNameArray.length > 1) { 
     objectName = bucketNameArray[1] + "/" + fileName; 
    } else { 
     objectName = fileName; 
    } 
} 

Die Destination Klasse JavaDoc sagt:

Die Konvention hier implementiert ist, dass ein/in einen Eimer Name ist verwendet, um eine Struktur im Objektnamen zu konstruieren. Das heißt, ein put von file.txt in den Bucket-Namen "mybucket/v1" bewirkt, dass das Objekt "v1/file.txt" im mybucket erstellt wird.

Fazit: Die filePath.getName() Anruf Streifen aus jedem Präfix (S3 kein Verzeichnis, sondern vielmehr Präfixe finden this und this Themen für weitere Informationen) Sie zu der Datei hinzuzufügen. Wenn Sie Ihre Dateien wirklich in einen "Ordner" (dh mit einem speziellen Präfix, das einen Schrägstrich (/) enthält) legen, sollten Sie dieses Präfix am Ende Ihres Bucket-Namens hinzufügen, wie in der JavaDoc-Klasse Destination erläutert .

1

Ja, das ist möglich.

Es sieht so aus, als ob für jedes Ordnerziel eine separate Instanz des S3-Plugins benötigt wird.

"Quelle" ist die Datei, die Sie hochladen.

"Ziel-Bucket" ist, wo Sie Ihren Pfad platzieren.

+0

Es ist nicht vollständig rekursiv, aber Sie können in ein Unterverzeichnis innerhalb des S3-Buckets hochladen. –

1

Mit Jenkins 1.532.2 und S3 Publisher Plug-In 0.5 weist der Bildschirm "UI configure Job" zusätzliche S3-Veröffentlichungseinträge zurück. Es würde auch einen erheblichen Wartungsvorteil für uns bedeuten, wenn das Plugin die Verzeichnisstruktur des Arbeitsbereichs neu erstellt, da wir viele Verzeichnisse erstellen müssen.

+1

das Plugin ist nicht schlimmer zu versuchen! Es ist in Ordnung für einen Datei-Upload, aber es behält die Verzeichnisstruktur nicht bei. – mohamnag

1
  1. Richten Sie Ihr Git-Plugin ein.

enter image description here

  1. Ihr Bash-Skript

enter image description here

einrichten
  1. Alle in Ihrem Ordner markiert als "*" wird zum Eimer gehen