2011-11-22 11 views
5

Mi chiedevo come ottenere i miei progetti web implementati usando ftp e/o ssh.Jenkins: implementazione FTP/SSH, inclusa cancellazione e spostamento di file

Attualmente disponiamo di un sistema di implementazione autonomo in grado di gestirlo, ma desidero passare a Jenkins.

So che ci sono plugin di pubblicazione e funzionano bene quando si tratta di caricare artefatti di build. Ma non possono cancellare o spostare file.

Avete suggerimenti, suggerimenti o idee sul mio problema?

risposta

2

Il plug-in Publish Over SSH consente di inviare comandi utilizzando ssh al server remoto. Funziona molto bene, eseguiamo anche alcuni file in movimento/cancellati prima di implementare la nuova versione e non abbiamo avuto alcun problema con questo approccio.

+0

Grazie, probabilmente mi aiuterà con i miei server ssh. Ma come ottenere le informazioni di cui i file hanno bisogno essere spostato/cancellato? Git certamente lo sa, ma come integrarlo nel flusso di lavoro di distribuzione? – 4eyes

+0

Se i file che sei interessato a spostare/eliminare sono già in git, puoi semplicemente clonare il repository sui tuoi server di distribuzione e usare git command line per estrarre le modifiche usando publish su ssh. Questo potrebbe essere un buon modo per andare se si hanno file statici, che non devono essere compilati o controllati, solo bisogno di distribuzione. Probabilmente funzionerebbe meglio se hai repository separati per codice sorgente e file statici. – pushy

+0

Grazie. I nostri progetti sono tutti file "statici" mentre sviluppiamo software basato su php (TYPO3). Sono consapevole che posso ottenere i file spostati/cancellati usando git, in realtà è quello che abbiamo fatto nel nostro semplice sistema di distribuzione basato su phing. Sono semplicemente stupito, che non sembra esserci un plugin che copra l'implementazione ftp/ssh pulita ed efficiente. Mi chiedo in che modo altre aziende implementano i loro progetti web, non usano ftp (s)? O solo l'hosting personalizzato più costoso con ssh e/o git sul server live? – 4eyes

1

Il modo più semplice per gestire l'eliminazione e lo spostamento di elementi consiste nell'eliminare tutto sul server prima di distribuire una nuova versione utilizzando una delle estensioni "Publish over". Direi che è davvero l'unico modo per sapere che la versione implementata è quella che vuoi. Se si desidera un maggior numero di comportamenti del sistema di versioning, è necessario utilizzare un sistema di controllo delle versioni o forse rsync che ne copra una parte.

Se le vostre richieste sono molto specifiche, potete sviluppare la vostra convenzione per contrassegnare le eliminazioni e farle eseguire da uno script separato (come per le modifiche al database usando Liquibase o qualcosa del genere).

A proposito: mi raccomando di non aggiornare automaticamente i siti live dopo ogni generazione utilizzando l'estensione "pubblica oltre ...". Nel caso in cui desideriamo veramente che un sito live venga aggiornato automaticamente, ci affidiamo allo Promoted Builds Plugin per mantenerlo quasi completamente automatizzato ma aggiungere un po 'di sicurezza.

+0

Grazie a te Simone per il tuo consiglio, controllerò il plugin di sviluppo promosso. Ad ogni modo, non ha senso per me, perché ho bisogno di caricare un sito web completo, quando ho semplicemente cambiato un piccolo css o corretto un bug in uno script. In qualche modo, sembro l'unico con questo problema o chiunque altro distribuisca i loro progetti di sito web ad un hosting più esperto (ssh/git) o ​​non stia usando la distribuzione automatizzata. – 4eyes

0

Mi è venuta una soluzione semplice per rimuovere i file eliminati e caricare le modifiche su un server FTP remoto come azione di compilazione in Jenkins utilizzando un semplice script mirror lftp. Lftp Manual Page

In breve, si crea un file di configurazione nella directory utente Jenkins ~/.netrc e popolarlo con le credenziali FTP.

machine ftp.remote-host.com 
login mySuperSweetUsername 
password mySuperSweetPassword 

Creare uno script lftp deploy.lftp e rilasciarlo nella root del vostro repo .git

set ftp:list-options -a 
set cmd:fail-exit true 
open ftp.remote-host.com 
mirror --reverse --verbose --delete --exclude .git/ --exclude deploy.lftp --ignore-time --recursion=always 

Quindi aggiungere un "Exec Shell" costruire l'azione da eseguire lftp alla sceneggiatura.

lftp -f deploy.lftp 

Lo script sarà lftp

  • specchio: copiare tutti i file modificati
  • inversa: spingere file locali a un host remoto. un normale mirror tira dall'host remoto al locale.
  • verbose: dump tutte le note su ciò che i file sono stati copiati dove il log di compilazione
  • eliminare: rimuovere i file remoti non sono più presenti nel repository git
  • esclude: non pubblicare directory .git o il deploy. script lftp.
  • ignore-time: non verrà pubblicato in base al tempo di creazione del file. Se non si dispone di questo, nel mio caso, tutti i file sono stati pubblicati da quando un nuovo clone del repository git ha aggiornato il file creare timestamp. Funziona ancora abbastanza bene e anche i file modificati aggiungendo un singolo spazio sono stati identificati come diversi e caricati.
  • ricorsione
  • : analizzerà ogni file anziché dipendere dalle cartelle per determinare se eventuali file in essi sono stati eventualmente modificati. Questo non è tecnicamente necessario dal momento che stiamo ignorando i timestamp, ma ce l'ho comunque qui.

Ho scritto un articolo che spiega come I keep FTP in sync with Git per un sito WordPress che potevo accedere solo tramite FTP. L'articolo spiega come sincronizzare da FTP a Git, quindi come usare Jenkins per costruire e distribuire di nuovo su FTP. Questo approccio non è perfetto ma funziona. Carica solo i file modificati e cancella i file dall'host che sono stati rimossi dal repository git (e viceversa)