Domanda

mi sto muovendo il mio test continuo ad un server dedicato (autotest rallenta il mio computer portatile locale troppo). Quello che mi piacerebbe è per il mio server di prova (che sembra essere in esecuzione CruiseControl.rb) di essere continuamente ottenere i miei ultimi cambiamenti (impegnati) tramite Git - idealmente, senza alcuna modifica il mio flusso di lavoro. Io sono l'unico sviluppatore che lavora su questo progetto.

Prima di ottenere il server di prova, ho avuto:

  • Il mio portatile come il mio sistema di sviluppo principale
  • rami più nel mio repository locale.
  • Una copia di lavoro locale, indicando uno dei rami. Posso passare tra i rami di frequente (di solito per nuove funzioni).
  • Un account GitHub, a cui spesso spingere sezioni locali di mirroring filiali remote. (Questo è per lo più per l'utilizzo di un backup fuori sede, io non sto condividendo alcun codice per il mio progetto in corso). Provo a spingere per GitHub, almeno alla fine di ogni giornata di lavoro, anche se a volte mi dimentico.

Mi piacerebbe mantenere tutto questo intatto. In cima a quello, ora ho:

  • Il server di test
  • ... in esecuzione CruiseControl.rb
  • Un clone del mio repository computer portatile sul mio server di prova. (Attualmente non è la clonazione GitHub)
  • Una copia di lavoro locale sul server di test, da cui CC sta costruendo / testing.
  • Questa copia di lavoro indica un particolare ramo Git (ovviamente)

Ho cercato di avere il mio server di prova ottenere automaticamente qualsiasi ramo su cui sto lavorando sul mio portatile copia di lavoro e costruire da questo. (Che sarebbe imitare continua sperimentazione di autotest senza mangiare risorse di sistema).

Le cose che ho provato senza successo:

  • cassa origine git / TESTA: questo ottiene i file bene, ma si rompe CruiseControl perché non piace il "branchless" copia di lavoro
  • .
  • git checkout -b --track a_branch origine / a_branch: questo funziona bene per ottenere i file, e CC piace, ma si attacca il server di prova ad un ramo particolare. Quando si passa rami sul portatile mi fermo effettivamente testare il mio lavoro attuale.
  • git checkout -b --track my_testing_branch origine / TESTA: questo diventa anche file edificabili, ma soffre lo stesso problema come il comando precedente. La creazione di un ramo di origine / HEAD ottiene solo la testa per il ramo "default", quindi è anche appiccicoso.

C'è un modo per ottenere un buon sistema di test continuo a distanza (con o senza rami Git) che non comporta modifiche sostanziali al mio flusso di lavoro?

È stato utile?

Soluzione

Un'altra opzione è quella di scrivere un gancio che notifica il server di test del nuovo codice per tirare . In particolare, un gancio post-commit è probabilmente un percorso migliore. Poi, ogni volta che si commettono è possibile informare il server di prova di quello che per tirare e da cui si dipartono.

Altri suggerimenti

Si potrebbe avere un ramo testing dedicato sul quale si unisce il lavoro filiale di corrente.
È possibile forzare la sostituzione del contenuto di tale ramo con il commit del ramo di lavoro corrente (vedi git unione -s nostro, che dire di “loro” domanda ).

Poi sul server CI, si inizializza con:

 $ git fetch laptopRepo
 $ git checkout -b testingBranch laptopRepo/testingBranch

E 'implica un primo passo sul lato computer portatile di pubblicare alcuni lavori in corso per testare.

Questa non è la soluzione ottimale ma è qualcosa ...

Il server di test può essere eseguito git remote show origin per vedere quale ramo è attualmente attivo sul vostro computer portatile. Per esempio,

$ git remote show origin
* remote origin
  Fetch URL: blade:/var/scratch/code
  Push  URL: blade:/var/scratch/code
  HEAD branch: foo
  Remote branches:
    foo tracked
    bar tracked
    qux tracked

Quindi, il repository origine è attualmente sul ramo foo.

Non ho visto un comando di basso livello che vi darà che direttamente in modo da avere per analizzare fuori da questo (forse qualcuno avrà un modo migliore). Esempio,

$ b=$(git remote show origin | grep "HEAD branch" | awk -F: '{print $2}')
$ echo $b
foo

Ora, dal momento che origin/foo agirà simile a origin/HEAD (nessun ramo locale) e la vostra CruiseControl non piace che si dovrebbe probabilmente solo creare una filiale locale sulla macchina di prova e semplicemente hard-reset per l'ultima posizione:

$ b=$(git remote show origin | grep "HEAD branch" | awk -F: '{print $2}')
$ git reset --hard origin/$b

Nota, questo è un po 'fragile, in quanto HEAD me non essere sempre quello che si pensa che è. Ad esempio, durante un HEAD rebase si muove all'indietro e in avanti. Se i controlli server di prova HEAD sul vostro computer portatile durante una rebase potrebbe ottenere qualche posizione non valida o indesiderato.

Ho penso ottenuto una soluzione abbastanza buona invertendo il rapporto tra i due sistemi. Invece di avere il tiro server di prova dal repository del computer portatile, ho potuto avere la spinta portatile cambia fuori al server per essere testato.

Per prima cosa aggiungo un telecomando sul repo del portatile:

git remote add testing <url of testing server>

Poi, ogni volta che ho il codice per il test, devo fare un push:

git push -f testing HEAD:master

Questo funziona da qualsiasi ramo Sono attualmente in. Il -f assicura che ti faccio saltare via tutto ciò che è già in quel ramo; Io non devono preoccuparsi di qualsiasi ascendenza.

Questo non sarà effettivamente messo il codice più recente in una copia di lavoro, ma di polling di CruiseControl in grado di risolvere questo. Potrei anche avere un gancio sul lato server che aggiorna una copia di lavoro e esegue la suite di test (non avrei nemmeno bisogno CC a quel punto).

Io probabilmente voglio aggiungere un combinato commettere + comando spinta per uno script o alias; che mi darà il mio unico comando commit e di prova. Se per qualche motivo che voglio fare un commit senza una spinta di prova (o viceversa), quindi non ho queste opzioni anche.

Host su GitHub e usano i loro uncini post di ricevono . È così che servizi come Devver e RunCodeRun farlo.

Ho considerato saltare git passato e andare a una cartella condivisa / soluzione / rsync NFS, ma che ha un grosso problema: non è innescato da / limitato al impegna, quindi mi finire per ottenere rotto falso-positivo costruisce mentre io sono nel bel mezzo di digitare qualcosa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top