2012-07-18 9 views
11

Sto eseguendo Jenkins e lo faccio funzionare correttamente con il mio account Github, ma non riesco a farlo funzionare correttamente con Amazon S3.Integrazione continua di Jenkins con Amazon S3 - Tutto sta caricando nella root?

Ho installato il plug-in S3 e quando eseguo una build viene caricato correttamente nel bucket S3 che ho specificato, ma tutti i file caricati finiscono nella radice del bucket. Ho un sacco di cartelle (come/css/js e così via), ma tutti i file in quelle cartelle da Hithub finiscono nella radice del mio account S3.

È possibile caricare il plug-in S3 e mantenere la struttura delle cartelle?

risposta

15

Non sembra possibile. Invece, sto usando s3cmd per fare questo. È necessario prima installare sul vostro server, e poi in uno degli script bash all'interno di un lavoro di Jenkins è possibile utilizzare:

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

che copierà tutti i file al tuo account S3 mantenendo la struttura delle cartelle. L'opzione -P mantiene le autorizzazioni di lettura per tutti (necessarie se si sta utilizzando il bucket come server Web). Questa è un'ottima soluzione utilizzando la funzione di sincronizzazione, perché confronta tutti i file locali con il bucket S3 e copia solo i file che sono stati modificati (confrontando dimensioni dei file e checksum).

+1

Vorrei suggerire di utilizzare t lui JClouds Plug in ora. – Aron

+0

Anche JClouds non è eccezionale; continua a non riuscire con un errore oscuro sullo streaming. Il ridimensionamento di uno strumento CLI per questo è ridicolo ... – aendrew

+0

s3cmd non è ottimale in quanto richiede un archivio separato per le credenziali di aws. C'è merito per l'uso del plugin s3 di profili s3 per l'autenticazione. Concorda sul fatto che preservare la gerarchia degli artefatti sarebbe preferibile al comportamento corrente. –

3

Non ho mai lavorato con il plugin S3 per Jenkins (ma ora che so che esiste, potrei provarlo), però, guardando il codice, sembra che tu possa fare solo quello che vuoi usando una soluzione alternativa .

Ecco ciò che il codice del plugin effettivo non (tratto da github) --I rimosso le parti del codice che non sono rilevanti per il bene di leggibilità:

classe hudson.plugins.s3.S3Profile, metodo upload:

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

Ora, se si dà un'occhiata in JavaDoc hudson.FilePath.getName() s':

Ottiene solo la parte del nome del file senza directory.

Ora, un'occhiata in costruttore di 's il hudson.plugins.s3.Destination:

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; 
    } 
} 

Il JavaDoc Destination classe dice:

La convenzione implementato è che a/in un nome benna è usato per costruire una struttura nel nome dell'oggetto. Cioè, una put di file.txt nel nome bucket di "mybucket/v1" causerà l'oggetto "v1/file.txt" da creare nel mybucket.

Conclusione: le strisce filePath.getName() annullare qualsiasi prefisso (S3 non ha alcuna directory, ma piuttosto prefissi, vedere this e this thread per maggiori informazioni) si aggiungono al file. Se hai davvero bisogno di mettere i tuoi file in una "cartella" (cioè con un prefisso specifico che contiene una barra (/), ti suggerisco di aggiungere questo prefisso alla fine del nome del bucket, come spiegato nella classe Destination JavaDoc .

1

Sì, questo è possibile.

Sembra che per ogni destinazione di cartella, avrete comunque bisogno di un'istanza separata del plugin S3.

"Origine" è il file che stai caricando.

"Punto di destinazione" è il punto in cui posizionare il percorso.

+0

Non è interamente ricorsivo, ma è possibile caricare in una sottodirectory all'interno del bucket s3. –

1

Utilizzando il plug-in Jenkins 1.532.2 e S3 Publisher 0.5, la schermata di configurazione del lavoro dell'interfaccia utente rifiuta le voci di pubblicazione S3 aggiuntive. Ci sarebbe anche un significativo vantaggio di manutenzione se il plugin ricreasse la struttura della directory dello spazio di lavoro poiché avremo molte directory da creare.

+1

che il plugin non sta peggiorando cercando! va bene per un caricamento di un file, ma non mantiene la struttura delle directory. – mohamnag

1
  1. Imposta il tuo plugin git.

enter image description here

  1. Impostare il tuo script Bash

enter image description here

  1. Tutto nella cartella contrassegnata come "*" andrà nel bucket