Impostazione di un ciclo di implementazione / build / CI per progetti PHP


200

Sono uno sviluppatore solitario per la maggior parte del mio tempo, lavorando su una serie di grandi progetti, principalmente basati su PHP. Voglio professionalizzare e automatizzare il modo in cui vengono gestite le modifiche alla base di codice e creare un processo di integrazione continua che renda possibile il passaggio al lavoro in gruppo senza dover apportare modifiche fondamentali.

Quello che sto facendo in questo momento è che ho un ambiente di test locale per ogni progetto; Uso SVN per ogni progetto; le modifiche vengono testate localmente e quindi trasferite alla versione online, generalmente tramite FTP. La documentazione dell'API viene generata manualmente dal codice sorgente; I test unitari sono qualcosa a cui sto entrando lentamente, e non fa ancora parte della mia routine quotidiana.

Il "ciclo di costruzione" che sto immaginando farebbe quanto segue:

  • Un changeset viene verificato in SVN dopo essere stato testato localmente.

  • Inizio il processo di compilazione. La revisione SVN HEAD viene verificata, modificata se necessario e resa pronta per il caricamento.

  • La documentazione API viene generata automaticamente - se non l'ho ancora impostata in dettaglio, utilizzando un modello predefinito, eseguendo la scansione dell'intera base di codice.

  • La nuova revisione viene distribuita nella posizione remota tramite FTP (compresi alcuni rinominazioni di directory, messaggi, importazione di database e simili). Questo è qualcosa che già mi piace molto per phing , ma ovviamente sono aperto a alternative.

  • Vengono eseguiti test unitari che risiedono in una posizione predefinita. Sono informato del loro fallimento o successo utilizzando l'output di posta elettronica, RSS o (preferibilmente) HTML che posso prendere e inserire in una pagina web.

  • (facoltativamente) un file di testo "log delle modifiche" dell'utente finale in una posizione predefinita viene aggiornato con una parte predefinita del messaggio di commit ("Ora è possibile filtrare contemporaneamente sia" pippo "che" barra " ora) Questo messaggio non è necessariamente identico al messaggio di commit SVN, che probabilmente contiene molte più informazioni interne.

  • Roba come le metriche del codice, il controllo dello stile del codice e così via non sono il mio obiettivo principale in questo momento, ma a lungo termine, lo faranno sicuramente. Le soluzioni che portano questo fuori dalla scatola sono esaminate molto gentilmente.

sto cercando

  • Feedback ed esperienze di persone che si trovano o si trovano in una situazione simile e hanno implementato con successo una soluzione per questo

  • In particolare, buoni tutorial passo-passo e procedure dettagliate su come configurarlo

  • Soluzioni che forniscono quanta più automazione possibile , ad esempio creando un'API scheletro, casi di test e così via per ogni nuovo progetto.

e anche

  • Raccomandazioni prodotto . Quello che so finora è phing / ant per la costruzione e phpUnderControl o Hudson per la parte di segnalazione. Mi piacciono tutti per quanto posso vedere, ma ovviamente non ho alcuna esperienza dettagliata con loro.

Sono invasa dal lavoro, quindi ho una forte inclinazione verso soluzioni semplici. D'altra parte, se manca una caratteristica, piangerò perché è troppo limitata. :) Anche le soluzioni point-and-click sono benvenute. Sono anche a consigli sui prodotti commerciali che possono funzionare con progetti PHP.

La mia configurazione

Sto lavorando su Windows localmente (7, per l'esattezza) e la maggior parte dei progetti client viene eseguita su uno stack LAMP, spesso su hosting condiviso (= nessun SSH remoto). Sto cercando soluzioni che posso eseguire nel mio ambiente. Sono pronto a configurare una VM Linux per questo, nessun problema. Le soluzioni ospitate sono interessanti per me solo se forniscono tutti gli aspetti descritti o sono abbastanza flessibili da interagire con le altre parti del processo.

Bounty Sto accettando la risposta che sento mi darà il maggior chilometraggio. Ci sono molti input eccellenti qui, vorrei poter accettare più di una risposta. Grazie a tutti!

Risposte:


76

Ho lavorato con buildbot , CruiseControl.net , CruiseControl e Hudson . Anche se mi è piaciuto molto CruiseControl *, è stato davvero una seccatura con casi di dipendenza davvero complessi. buildbot non è facile da configurare, ma ha una bella aura (mi piace solo Python, tutto qui). Ma hudson ha vinto i primi tre perché:

  1. È semplice da configurare
  2. È facile da personalizzare
  3. Sembra buono e ha una buona funzionalità panoramica
  4. Ha ottenuto aggiornamenti punta e clicca, per sé e per tutti i plugin installati. Questa è davvero una bella caratteristica, che apprezzo sempre di più

Avvertenza: ho sempre usato Linux come base per i suddetti server di build (CC.net funzionava su mono ), ma tutti dovrebbero - secondo i documenti - eseguire multipiattaforma.

Configurare un server hudson

Prerequisiti:

  • Java (1.5 ti servirà bene)
  • Accesso in lettura al server subversion (ho un account separato per l'utente hudson)

Da qui, è solo:

java -jar hudson.war

Questo eseguirà una piccola istanza del server direttamente dalla tua console e dovresti essere in grado di sfogliare l'installazione sul tuo http://localhost:8080, se non hai altro in esecuzione su quella porta in anticipo (puoi specificare un'altra porta passando il--httpPort=ANOTHER_HTTP_PORT opzione al sopra il comando) e tutto è andato bene nel processo di 'installazione'.

Se vai alla directory dei plug-in disponibili ( http://localhost:8080/pluginManager/available), troverai plug-in per supportare le attività sopra menzionate (il supporto di sovversione è installato per impostazione predefinita).

Se questo ti stimola l'appetito, dovresti installare un server di applicazioni Java, come Tomcat o Jetty . Le istruzioni di installazione sono disponibili per tutti i principali server delle applicazioni

Aggiornamento : Kohsuke Kawaguchi ha realizzato un programma di installazione del servizio Windows per per Hudson

Allestire un progetto a Hudson

I collegamenti nel seguente walk-through presuppongono un'istanza corrente di hudson situata in http://localhost:8080

  1. Selezionare un nuovo lavoro ( http://localhost:8080/view/All/newJob) dal menu a sinistra
  2. Dai un nome al lavoro e spunta Build a free-style software projectla lista
  3. Premendo 'ok' si accederà alla pagina di configurazione del lavoro. Tutte le opzioni hanno un piccolo punto interrogativo oltre a loro. Premendolo, verrà visualizzato un testo di aiuto relativo all'opzione.
  4. Sotto il gruppo di opzioni "Gestione del codice sorgente" useresti Subversion. Hudson accetta sia l'accesso url che l'accesso al modulo locale
  5. Nel gruppo di opzioni "Trigger della build", utilizzeresti "Poll SCM". La sintassi usata qui è quella di cron, quindi sarebbe il polling del repository subversion ogni 5 minuti*/5 * * * *
  6. Il processo di costruzione del progetto è specificato nel gruppo di opzioni 'Build'. Se hai già un file build ant con tutti gli obiettivi di cui hai bisogno, sei fortunato. Basta scegliere "Invoca formica" e scrivere il nome del bersaglio. Il gruppo di opzioni supporta anche i comandi di maven e shell, ma è disponibile anche un plug-in per phing .
  7. Spuntare le azioni di compilazione aggiuntive in "Post Build Actions", come le notifiche e-mail o l'archiviazione dei manufatti di compilazione.

Per impostare processi per i quali hudson non ha plug-in, è possibile chiamarli direttamente tramite uno script della shell dall'impostazione di compilazione oppure scrivere il proprio plug-in

insidie:

  • Se lo fai produrre manufatti di costruzione, ricorda di far pulire Hudson dopo se stesso a intervalli regolari.
  • Se hai impostato più di 20 progetti, considera di non visualizzare il loro stato di compilazione come pagina principale predefinita su hudson

In bocca al lupo!


2
Penso che ci sia un errore nella tua sintassi cron. Quello verrebbe eseguito al quinto minuto di ogni ora. Se si desidera eseguire il polling del repository ogni 5 minuti, è necessario utilizzare * / 5
Brian Wigginton,

2
@BrianWigginton: hai perfettamente ragione. E ho anche provato a correggere il post, ma non riesco a salvarlo perché ho "un riferimento a un nome host non valido", vale a dire "localhost". Spero che la gente guardi quaggiù per la correzione.
Steen,

22

Il termine che stai cercando è "integrazione continua".

Ecco un esempio di qualcuno che utilizza GIT + phpundercontrol: http://maff.ailoo.net/2009/09/continuous-integration-phpundercontrol-git/

CruiseControl (che è un server CI), può utilizzare Hosted SVN / GIT come sorgente. Quindi puoi persino usarlo con GitHub o Beanstalk o qualcos'altro.

Quindi puoi integrarlo con il seguente tipo di software:

  • PHPUnit
  • php-codesniffer
  • phpDocumentor
  • PHP Gcov
  • PHPXref
  • Yasca
  • eccetera.

Puoi anche provare questo CI ospitato: http://www.php-ci.net/hosting/create-project

Tieni presente, tuttavia, che tali strumenti necessitano di supporto personalizzato se li integri da solo.

Hai pensato anche alla gestione dei progetti e alla gestione delle patch?

È possibile utilizzare Redmine per la gestione dei progetti. Ha integrato il supporto per l'integrazione continua, ma solo come lato client (non come server CI).

Prova a utilizzare un SVN / GIT / etc ospitato. soluzione, perché copriranno i tuoi backup e manterranno i loro server in esecuzione, così potrai concentrarti sullo sviluppo.

Per un'esercitazione su come configurare Hudson, consultare: http://toptopic.wordpress.com/2009/02/26/php-and-hudson/


2
Grazie per il link I prodotti con cui ho familiarità, quello che spero sono ulteriori procedure dettagliate in stile tutorial come quella che hai fornito.
Pekka,

Ciao, a partire da ottobre 2012, php-ci.net è inattivo o è già stato rimosso dal servizio? Non riesco a collegarmi a quell'indirizzo, né posso trovare nuove informazioni dell'anno passato.
Ryan,

@Ryan, non so cosa sia successo. So che puoi provare gli altri. Forse potresti provare: CircleCI o potresti consultare questo argomento: Hosted Continuous Integration for PHP?
Michiel,

@Ryan, no non è inattivo, lo uso da un po 'di tempo. Si sono trasferiti su phptesting.org
omrakhur

6

Uso il server di integrazione continua di Bamboo di Atlassian per il mio progetto PHP principale (insieme ad altri loro prodotti come fisheye (navigazione nel repository), jira (tracker dei numeri) e clover (copertura del codice)).

Supporta SVN e ora supporta Git e ha un'ottima interfaccia utente. È disponibile per Linux, Windows e Mac e può essere eseguito autonomamente sul proprio server Tomcat, il che è ottimo per le persone (come me) che non amano impiegare giorni per configurare i propri strumenti). Anche se può sembrare costoso, essendo uno sviluppatore solitario ho acquistato la licenza del kit di base per 10 $ (10 $ tramite software). Questo è ottimo per i piccoli team e vale la pena guardarlo.


Come puoi configurare bamboo per supportare phing? Attualmente sto usando la formica, ma sembra che phing sia più appropriato da usare per il depooyment di php. Grazie
Vincent,

5

PHPTesting PHPCI Questo è un bel server di integrazione continua integrato in php.

Inoltre, è gratuito e open source. :)

ha un numero di plugin ..

PHPCI include plugin di integrazione per:

  • Atoum
  • Behat
  • fuoco di bivacco
  • Codeception
  • Compositore
  • E-mail
  • Grugnito
  • IRC
  • PHP
  • garza
  • MySQL
  • PDEPEND
  • PostgreSQL
  • Sniffer codice PHP
  • Rilevatore copia / incolla PHP
  • Spec. PHP
  • Unità PHP
  • Comandi Shell
  • Tar / Zip

Anche se mi piace PHPCI, non lo consiglio. È incredibilmente difettoso e non affidabile. È triste che la funzionalità di base comune non sia stata adeguatamente testata dall'unità, quindi la cosa di base come l'aggiunta di un URL di progetto è difficile senza che si rovini.
Tek,

@Tek qual è la tua strategia CI per PHP?
omrakhur,

1
@omrakhur Purtroppo sono bloccato con PHPCI. Tutti gli altri software sono molto più ingombranti e richiedono molto tempo per essere configurati. Tutto ha i suoi pro e contro. Devi solo andare con ciò che funziona meglio per te.
Tek,

3

Sono principalmente un amministratore di sistema ma a volte codifico anche PHP. Come progetto collaterale ho creato degli script che renderanno semplice e indolore la creazione di un ambiente completo di PHP CI usando Jenkins. Esegue anche un progetto di esempio in modo che tu possa vedere come è configurato ogni passaggio di compilazione.

Se vuoi provarlo, tutto ciò che serve è un box Debian / Ubuntu e l'accesso alla shell.

http://yauh.de/articles/379/setting-up-a-ci-environment-for-php-projects-using-jenkins-ci

Aggiornamento Per aggiungere alcuni contenuti alla mia risposta:

Puoi semplicemente impostare un Jenkins CI per PHP usando Ansible. Dalla v1.4 supporta i ruoli che è possibile scaricare dal loro sito della community galaxy.ansibleworks.com e farà il lavoro pesante per te. Si chiama jenkins-php .


3

Suggerirei di usare Jenkins http://jenkins-ci.org/ è gratuito ed è open source.

È abbastanza semplice da configurare, funziona su più piattaforme e si integra bene con altri strumenti di integrazione continua come SonarQube (+ SQUALE) per misurare il debito tecnico e Tucidide per testare l'automazione.

Consiglio vivamente di utilizzare GIT o GIT Hub per il controllo della versione anziché SVN. Dal mio punto di vista è solo un migliore sistema di controllo della versione che ti aiuterà a ridimensionare i tuoi sforzi di sviluppo in un secondo momento.

Dato che stai lavorando principalmente con il progetto PHP ci sono altri strumenti che puoi usare.

PHPUnit - Per test unitari

PHP CodeSniffer - Controlla gli standard di codifica

PHP Depend: mostra le dipendenze del codice PHP

XDEBUG - Per test delle prestazioni

Tutti questi strumenti vengono attivati ​​con un lavoro Jenkins e aiutano con la qualità e le prestazioni del codice.

Buona fortuna e buon divertimento!


3

Non utilizzo molti dei prodotti, né tipi di prodotti che usi, ma ti darò la mia esperienza.

Gestisco un ambiente TEST in parallelo con il mio ambiente PROD. Non ho test locali di per sé. Se è troppo difficile entrare in un vero ambiente TEST, allora risolvo il mio processo di compilazione. Non vedo il punto di testare localmente, poiché gli ambienti sono diversi. AGGIORNAMENTO: L'unica cosa che faccio localmente è eseguire "php -l" prima di caricare qualsiasi cosa. Ferma gli stupidi errori.

Il processo di compilazione funziona con qualsiasi cosa si trovi nell'area di lavoro corrente, che include il codice di cui non è stato eseguito il commit. Questa non è la tazza di tè di tutti, ma vado a TEST molto spesso. Tutto si impegna prima di andare a PROD.

Parte del mio processo di compilazione (simile al tuo) crea due file META. Uno contiene le ultime (in genere) 100 modifiche e mi dà anche il numero della lista delle modifiche corrente. Mi mostra quali modifiche sono installate. L'altro contiene CLIENTSPEC (in termini di Perforce) che mi mostra esattamente quali rami sono stati usati in questa build. Insieme, questi mi danno build riproducibili.

Non costruisco direttamente nell'ambiente di destinazione, ma in un'area di gestione temporanea sul server. Uso SSH quindi questo ha senso. Questo mi dà alcuni vantaggi. Soprattutto, evita di morire a metà di un caricamento di grandi dimensioni. Mi dà anche un posto per archiviare i file META e tutti i file di build vengono automaticamente archiviati (quindi posso tornare indietro a qualsiasi build). Lo script registra anche l'aggiornamento (quindi c'è una voce nel flusso di log e posso vedere pre e post-) e dà dei calci a tutti i demoni (io uso i demoniol quindi "svc -t"). Tutti questi sono meglio sulla macchina target.

Un altro problema sono le modifiche al DB. Conservo uno script master dello schema DB, che aggiorno ogni volta che lo schema cambia. Ognuna delle modifiche va anche in uno script changes.sql, che viene caricato con la build nell'area di gestione temporanea. Lo script viene eseguito come parte dello script di installazione.


Grazie per il tuo contributo Phil, questa è una configurazione molto, molto interessante e penso di poterne utilizzare parti. Nel mio caso, tuttavia, molto spesso non avrò accesso SSH all'estremità remota, quindi ho bisogno di molta "intelligenza" a livello locale, motivo per cui penso che avrò bisogno di un prodotto CI come Hudson.
Pekka,

2

Di recente ho iniziato lo stesso tipo di processo e sto usando Beanstalk per l'hosting svn.

Ci sono due caratteristiche interessanti negli account a pagamento (a partire da $ 15pm credo):

  • l'implementazione consente all'utente di creare target ftp per server di gestione temporanea e di produzione, che possono essere distribuiti con un clic di un pulsante (incluso specificare una revisione e una diramazione)
  • i webhook consentono all'utente di impostare un URL che viene chiamato su ogni commit / deploy, passando attraverso cose come numero di revisione, descrizione e utente. Questo potrebbe essere usato per aggiornare i documenti, eseguire test unitari e aggiornare i log delle modifiche.

Sono sicuro che ci sono altri server svn ospitati o self-hosting con queste due funzionalità, ma beanstalk è quello di cui ho esperienza e funziona molto, molto bene

C'è anche un'API, che immagino possa essere utilizzata per integrare ulteriormente la distribuzione nel tuo processo.


Saluti @adam. Non sto cercando così tanto i servizi ospitati per questo, poiché temo che saranno sempre troppo limitati per ciò di cui ho bisogno. Ma quello che dici sembra interessante e l'API potrebbe essere un punto di collegamento per il resto. Daremo un'occhiata a questo.
Pekka,

Nessun problema, ho pensato che potresti dirlo. Per ora mi va bene, dato che non ho ancora la testa intorno a svn (e sono una squadra individuale), inoltre offrono un'esportazione repo completa se vuoi spostarti.
Adam Hopkinson,

2

Prendi in considerazione fazend.com , una piattaforma CI ospitata gratuitamente, che automatizza le procedure di configurazione e installazione. Non è necessario configurare il controllo della versione, il tracciamento dei bug, il server CI, l'ambiente di test, ecc. Tutto viene eseguito su richiesta.


Mmm, sembra molto interessante! Ma come sopravvivono? Visto che è tutto gratis? Come pagano il server e le commissioni E3?
Pekka,

@Pekka Questo progetto è sponsorizzato da una società di sviluppo software, ecco perché il servizio è gratuito
yegor256
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.