2012-04-05 22 views
5

Ho un manufatto che dovrebbe essere costruito per diverse piattaforme di destinazione:versioni artefatto Sincronizzazione su piattaforme con processo di rilascio Maven

  • Linux x86
  • di Windows x86
  • ARM11

causa Purtroppo per la mancanza di crosscompiler, non è possibile creare tutte le versioni del manufatto in un colpo solo.

Usando altre parole, l'obiettivo è di avere qualcosa nel repository come questo

  • artifact-1.0.0-linux.zip
  • artifact-1.0.0-windows.zip
  • artefatto -1.0.0-arm11.zip
  • artifact-1.0.1-linux.zip
  • artifact-1.0.1-windows.zip
  • artifact-1.0.1-arm11.zip
  • 012.351.641.061.
  • ...

Si noti che le versioni sono sincronizzate. Come realizzare questo?

Il problema è che il processo di rilascio aggiorna la versione di pom.xml dopo ogni generazione. Quindi, con la costruzione di consecutivamente su diverse piattaforme posso realizzare avendo

  • artifact-1.0.0-linux.zip
  • artifact-1.0.1-windows.zip
  • artifact-1.0.2-arm11.zip
  • artifact-1.0.3-linux.zip
  • artifact-1.0.4-windows.zip
  • artifact-1.0.5-arm11.zip
  • ...

ma questo non è quello che sto cercando.

potevo

  1. eseguito su Linux

    rilascio mvn: preparare rilascio: eseguire -DpushChanges = false

    (con pushChanges impostata su false rilascio non aumenterà il numero di versione in SCM)

  2. e quindi eseguito su Windows

    rilascio mvn: preparare rilasciare: eseguire

    (questo aumenterà il numero di versione)

Ma poi la responsabilità di innescare i processi di rilascio su diverse piattaforme nel giusto ordine è con me. C'è un modo in cui Maven può aiutarmi con questo?

Avete qualche suggerimento?

Grazie


PS. Si noti che questa non è una domanda su come organizzarsi in moduli. Si tratta di come sincronizzare i processi di rilascio di un singolo artefatto su più piattaforme.

risposta

0

come la vedo io, si utilizza classificatori (nome del file suffisso del manufatto), come linux, windows o arm11 per distinguere i vari rilasci di artefatto, destinati a piattaforme specifiche. Quindi, se crei un progetto multi-modulo gestito da Maven, dove i moduli sarebbero artefatti con lo stesso , lo stesso artifactId, lo stesso version (probabilmente ereditato dal loro genitore comune), ma diverso classifier, otterrai esattamente ciò che desideri. In tal caso, rilasci sempre il tuo POM multi-modulo (di solito è anche un genitore comune per i suoi moduli) per far rilasciare tutti i moduli contemporaneamente. Assumendo stesso-versione-per-tutti-i moduli-politica (che sembra adattarsi abbastanza bene qui), si può sostanzialmente eseguire:

mvn release:prepare release:perform -DautoVersionSubmodules

e basta. Riceverai artifact-1.0.0-linux.zip, artifact-1.0.0-windows.zip, artifact-1.0.0-arm11.zip artefatti rilasciati. La prossima versione di sviluppo verrà impostata su 1.0.1-SNAPSHOT per tutti i moduli (tramite l'ereditarietà da padre).

+0

Ma il mio punto è che quando si è su Linux, non è possibile creare un binario per Windows (a causa di alcuni vincoli di toolchain). Quindi il processo di compilazione eseguito su Linux, non può creare i binari di Windows. E viceversa. Quindi non è possibile creare tutti i file binari per tutte le piattaforme in una volta. --- Questa non è una domanda su come organizzare in moduli. Si tratta di sincronizzare i processi di rilascio di un singolo artefatto su più piattaforme. –

+0

OK, quindi temo che Maven non possa aiutarti a farlo automaticamente come vuoi, a meno che tu non voglia (e abbia tempo) di creare un proprio plugin di rilascio. Come hai detto, puoi fare tutto di nuovo senza sbattere contro una versione e poi romperla globalmente alla fine, ma è qualcosa che devi ricordare. Puoi anche scartare il versioning comune (ereditato dal genitore) e digitare letteralmente le versioni in POM di tutti i moduli. Questa volta, tuttavia, è necessario controllare questo processo e assicurarsi che tutti i moduli vengano rilasciati con la versione e che ogni modulo venga rilasciato una sola volta. Non riesco davvero a vedere il modo automatico al 100%. –

+0

Sono sempre in ritardo :) Comunque, grazie per l'aiuto. –

2

Hai già trovato una soluzione? E 'bene sapere che non sono l'unico a combattere con Maven :-)

In ogni caso,

È consentito distribuire una versione rilasciata al nesso? Sto pensando, puoi fare questo:

1 - Fai una "release di mvn: preparare release: perform" da una macchina Windows - che dovrebbe ottenere artefatto-1.0.1-windows.zip in nexus.

2 - Verificare l'artefatto-1.0.1 tag dal controllo sorgente

3 - Fai una "mvn deploy" da linux e arm11 (qualunque cosa sia: P) - che dovrebbe avere anche -linux.zip e -arm11.zip in nexus.

Anche se, credo che a seconda di come è configurato il nesso che non ti consente di ridistribuire qualsiasi cosa con lo stesso GAV (anche se il classificatore è diverso)

0

Lei mi ha aiutato con la vostra domanda ... non sapevo circa l'opzione pushChanges = false.

Utilizzando Jenkins è possibile impostare un lavoro su ciascuna piattaforma che esegue il rilascio Maven in serie utilizzando la funzione "Trigger build in remoto (ad esempio dagli script)". Se lo desideri, puoi utilizzare una Build parametrizzata per scegliere la versione da compilare (se la utilizzi, allora hai bisogno dello Parameterized Trigger Plugin per attivare la compilazione sulle altre piattaforme).

Problemi correlati