Come si mantengono i binari rilasciati sotto il controllo della versione?


14

Come si mantengono i binari rilasciati sotto il controllo della versione? Ciò consente di tenere traccia di quali elementi sono cambiati tra ogni versione. Intendo separare i file binari rilasciati dal repository di origine. I file binari rilasciati sono creati dal software di integrazione continua o compilati manualmente.


Che cosa intendi con "traccia quali elementi sono cambiati"? Quali attributi dei binari di rilascio stai (o vuoi essere) tracciare? Sembra strano, quindi sono curioso.
Jeremy Heiler,

ad esempio tra v1.0.0 e v1.0.1, viene modificato solo ABC.exe, mentre la dipendenza DEF.dll rimane invariata
linquize

1
Come lo determini guardando i binari?
Jeremy Heiler,

diff vecchia e nuova versione dello stesso file
linquize

Risposte:


21

Due opzioni:

a) No. Assicurati solo di avere build deterministiche riproducibili, ovvero costruire la stessa revisione del controllo del codice sorgente con la stessa configurazione produce sempre lo stesso binario esatto.

b) Designare una directory da qualche parte come fonte autorevole per build pubblicate. Rendi il caricamento dei file binari parte della procedura di distribuzione / spedizione e assicurati che la directory di build pubblicata sia coperta dal tuo piano di backup. Non è necessario alcun controllo di versione qui; le build sono in scrittura singola, se è necessario modificare qualcosa, si crea una nuova build.

In entrambi i casi, i binari e altri output di generazione non appartengono al controllo del codice sorgente, per numerosi motivi.


7
a) spesso non è ovviamente possibile blogs.msdn.com/b/ericlippert/archive/2012/05/31/…
jk.

@jk: bel link. Immagino che avere il codice sorgente e tutti i file di input per la fase di compilazione completamente sotto il controllo del codice sorgente (e che abbia installata la giusta versione del compilatore) possa essere "abbastanza deterministico" in molti scenari del mondo reale (e non abbastanza in altri, ovviamente ). Dipende dal caso quanto sia importante avere binari riproducibili bit per bit.
Doc Brown,

10

Utilizzare un repository di artefatti per i file binari, non un sistema di controllo della versione. Una versione specifica di un file binario rilasciato non dovrebbe cambiare nel tempo, quindi il controllo della versione non ha senso poiché i file non cambieranno.

Vedi ad esempio i repository Maven come repository per archiviare / pubblicare / offrire rilasci e altri file binari (ad es. Come documentazione)


neanche una versione specifica di un file sorgente rilasciato dovrebbe cambiare nel tempo. SCM è un ottimo posto per mettere il file binario spedito, basta memorizzarlo insieme ai file di origine utilizzati per costruirlo.
gbjbaanb,

2
gbjbaanb, SCM sta per "Gestione del controllo del codice sorgente". Ciò dovrebbe dare a tutti un suggerimento sul fatto che questi sistemi non sono progettati per archiviare i binari ma i sorgenti. Se vuoi ancora archiviare i binari, vai avanti. Non lo farò.
mhaller,

4
SCM sta per "Software Control Management" ma è una buona idea. "codice sorgente" spesso non è solo file di testo, ma immagini, documenti, diagrammi ecc.
gbjbaanb,

Normalmente "Gestione della configurazione del software". Non ho mai sentito parlare di "Software Control Management".
James McLeod,

7

Inseriscili. Non c'è problema, a meno che tu non stia usando git (che non unisce bene i binari, quindi dovrai gestirli da solo) o li commetti troppe volte (commetti solo quando è pronto per la spedizione, non tutte le volte che lo costruisci).

La maggior parte dei binari delta SCM abbastanza bene, abbiamo usato per inserire una dll di risorse da 2 Mb nel nostro SVN e ogni volta deltava a qualche kb.

Ho sentito molti argomenti secondo cui gli SCM sono per il sorgente, non per i binari, ma questo è chiaramente falso se si considera che la maggior parte dei software è costituita da immagini, anche se sono solo file icona. Sono binari, ma fanno parte della fonte, quindi inseriscili e non essere così dogmatico al riguardo. Ho anche sentito che puoi semplicemente ricostruire il binario quando necessario, spesso è così, ma può essere un enorme sforzo di perdita di tempo per i sistemi più vecchi che non sono più attivamente supportati. Se devi ricreare un sistema con solo service pack o patch più vecchi per corrispondere al sistema che è stato usato per costruire un binario 3 anni fa, sarai contento di aver aggiunto il cestino a SCM allora.

L'unica volta che devi preoccuparti di aggiungere build al tuo SCM è se lo stai facendo automaticamente come parte del processo del server build - non farlo. Riempirai il tuo SCM con build che non hanno alcun vantaggio per te. Invece aggiungili solo quando vengono rilasciati. In questo modo sai esattamente cosa ha il tuo cliente e puoi riprodurre qualsiasi problema segnalato dai clienti con i binari che stanno usando e non quelli che hai ricostruito (usando, diciamo, gli ultimi aggiornamenti del compilatore o del sistema operativo).


1
@ MarnenLaibow-Koser ovviamente non hai lavorato a lungo nel settore. Gli ambienti di costruzione cambiano nel tempo, quindi mentre puoi ricostruirne uno vecchio, è probabile che dovrai passare giorni a ricreare l'ambiente con i vecchi strumenti e SDK giusti. Che spero tu abbia fatto la versione ....
gbjbaanb,

1
Immagino che saresti in grado di costruire un vecchio binario VC6 che è stato compilato su una macchina XP usando un vecchio SDK che Microsoft non ritiene più opportuno rilasciare. Se qualcuno chiede quel binario, è facile prenderlo dallo stesso posto in cui è memorizzato tutto il resto. Il costo di gestione è enorme rispetto al dolore di dover ricostruire, e il costo di conservarlo con la fonte è insignificante. Sono stato lì (con un'app VB6 realizzata con un controllo di terze parti quando il cliente ha segnalato un bug - ottenere il binario e eseguirlo era molto più facile che ricostruirlo, che si è rivelato impossibile)
gbjbaanb

1
@gjbaanb Devo anche ammettere che sei in una situazione diversa da me in un altro modo: tutte le mie dipendenze esterne sono OSS, quindi non possono andare via solo perché qualche azienda non ritiene più opportuno rilasciarle.
Marnen Laibow-Koser,

1
Il mio punto è che le MSC possono memorizzare tutto, quindi non c'è alcuna necessità di non archiviare il binario separato dalla sua fonte. È comodo e facile e ti garantisce di sapere cosa succede dopo anni. Non c'è alcun aspetto negativo nel farlo. Ogni dato rilascio stesso è sincronizzato solo con un particolare commit di origine. Non vedo il problema, tranne per il fatto che alcune persone pensano che SCM significhi solo il testo del codice sorgente. No, usalo per archiviare quasi tutto (a volte include strumenti di creazione o librerie se non sono enormi), la vita diventa molto più semplice.
gbjbaanb,

1
@gjbaanb E il mio punto è che ti sbagli. :) Certo, i VCS possono archiviare tutto, ma non sono ben configurati per l'archiviazione di file che vivono solo per un commit (dopotutto, non vuoi la tua build r500 nel repository a r550; sarà solo confusa) . Il problema fondamentale con l'archiviazione di artefatti di build nel repository non è che sono binari , ma che sono dati derivati e non saranno sincronizzati con la loro origine nello stesso repository. Gli stessi argomenti che sto usando si applicherebbero ai file di testo generati.
Marnen Laibow-Koser,

5

Non tengo i binari di rilascio sotto controllo di versione. Invece li pubblico in una posizione ben definita in modo che altri strumenti, ispezionarli e usarli. Faccio molto lavoro in Java, quindi ciò significa che pubblico Jars nei repository Maven locali. Tuttavia, non utilizzo questi strumenti per tenere traccia di ciò che è cambiato per versione. Dopotutto, sono binari e non c'è molto altro da tracciare oltre al conteggio dei file.

Per tenere traccia delle modifiche tra le versioni, contrassegnerei o etichetterei le versioni nel mio sistema di controllo della versione con il numero di versione della versione. Ma questo è davvero solo per tracciare i file sorgente, non i binari. I binari sono artefatti della build e non devono essere sotto il controllo della versione.


1

La soluzione migliore è utilizzare in modo esclusivo il tuo sistema CI per tutte le build significative dal punto di vista organizzativo (release, release candidate ecc ...).

Ciò collega sistematicamente i file binari rilasciati al contenuto del repository senza dover effettivamente archiviare i binari nel repository.

Ad esempio, se si utilizza SVN, utilizzare lo schema organizzativo delle filiali principali; fare tutto lo sviluppo quotidiano in / trunk e creare un tag / per ogni versione una volta pronta.

Configura il tuo sistema CI per compilare dai tag e dal trunk e farlo scrivere in una directory di rete la cui struttura rispecchia la struttura di livello superiore del repository:

  • / Costruisce / trunk / [giro] [data] [ID build] /
  • / Costruisce / tag / release_0_1_3beta4 / [giro] [data] [ID build] /

Il sistema di compilazione dovrà trattare la directory / builds / trunk / come un buffer circolare, memorizzando le ultime n build, eliminando le build precedenti mentre procede.

La directory / builds / tags / , d'altra parte, è un archivio permanente. Gli artefatti di compilazione stessi sono archiviati in directory con nomi generati secondo il seguente schema:

  • [Rev] [data] [ID build]

dove [rev] è l'ID di revisione SVN, [data] è la data nel formato AAAAMMGG e [build_id] è un contatore univoco a 3 cifre, che aumenta dal primo build in poi, rendendo unica ogni directory di build.

La procedura sopra descritta offre i seguenti vantaggi:

  1. Gli artefatti da costruire sono legati sistematicamente alla fonte che li ha generati, quindi puoi trovare facilmente l'origine di un particolare artefatto da costruzione (e viceversa).

  2. Ciò costituisce la base per un'ulteriore automazione del rilascio. Ad esempio, generazione automatica di documenti di rilascio ecc ...

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.