2015-11-18 14 views
10

Ho un file RPM Spec, basato su rhel7 con rpmbuild, in cui vorrei definire la versione con uno script.Definire la versione con script nel file spec RPM

ho letto qui http://www.techrepublic.com/article/rpmproc-spec-file/, che posso fare questo:

%define version 1.2 

Version: %{version} 

E qui RPM spec file - Is it possible to dynamically populate a spec file variable, che posso definire con uno script:

%define whoami %(cmd) 

Così ho provato a fare questo nel mio Spec File:

%define version %(echo "$(sed -n 's|^[ ]*appVersion = "\(.*\)"|\1|p' /fullfilepath/values.txt | sed 's/^\(.*\)-.*$/\1/')") 

Version: %{version} **Line 23** 

Ma ho un

error: line 23: Empty tag: Version: 

Le cose che ho provato finora:

%define version %(echo "12") --basic script works ok, version becomes 12 

//As a command straight in terminal 
$ echo "$(sed -n 's|^[ ]*appVersion = "\(.*\)"|\1|p' /fullfilepath/values.txt | sed 's/^\(.*\)-.*$/\1/')" 
//returns 1.2 

Queste funzionano bene, quindi non ho idea di cosa potrebbe essere questo è che causano il fallimento. Qualche idea su cosa potrebbe incastrarla per fallire quando chiamo la stessa cosa nel definire il tag nel file spec?

Aggiornamento

Ho provato a sostituire il nome del file con il valore effettivo in modo che appaia come questo

echo "$(sed -n 's|^[ ]*appVersion = "\(.*\)"|\1|p' <<< "appVersion = \"1.2-SNAPSHOT\"" | sed 's/^\(.*\)-.*$/\1/')" 

che funziona quando viene chiamato nel terminale, ma come un

%(echo "$(sed -n 's|^[ ]*appVersion = "\(.*\)"|\1|p' <<< "appVersion = \"1.2-SNAPSHOT\"" | sed 's/^\(.*\)-.*$/\1/')") 

ma Ricevo ancora il

Empty tag: Version: Error 

Aggiornamento 2

ho testato un comando diverso più complesso quindi echo "12":

%define version %(echo "$(git log -1 | grep commit | awk -F"commit " '{print $2}' | cut -c1-8)") 

Questo funziona bene anche! Rende la versione le prime 7 cifre dell'hash commit.

Update 3

Il mistero continua, ho fatto un test per verificare se il comando sed questo è la causa, ma il seguente comando mi dà 1.2 come la versione

%define version %(echo "$(sed 's/.*= //' <<< "appVersion = 1.2")") 

Se questo comando funziona ma non il mio primo, quindi deve essere con qualcosa nel mio primo comando che funziona solo se chiamato direttamente nel terminale e non in% (cmd). Avvicinarsi!

Update 4

Ok, quindi mi sembra di aver isolato quello che deve essere, curioso, sembra che potrebbe essere il -n o s| | \1 |p sintassi che rpmbuild non piace. Ho creato una versione più semplice del mio originale.Dateci un'occhiata:

#Error, doesn`t set version to 1.2 
%define version %(echo "$(sed -n 's|^.*-\(-*\)|\1|p' <<< "foo-1.2")") 

#Works ok! sets version to 1.2 
%define version %(echo "$(sed 's/.*= //' <<< "appVersion = 1.2")") 

Purtroppo però non penso di poterlo fare più per isolare e capire quale sia il problema. Non c'è niente di sbagliato nell'usare un sed nello stile del secondo comando, ma è ancora molto interessante sul perché il primo comando non funzioni.

Update 5

ho scoperto che c'è qualche problema profondo qui quando si lavora con qualsiasi script all'interno%() con un file di specifica e rpmbuild. Ho provato ad usare awk solo per vedere cosa sarebbe successo e anche questo si rompe! Questo va più in profondità, allora Inizialmente ho pensato, come scoprire una cospirazione:

#In terminal it prints 1.2-SNAPSHOT, but in Spec it's an error 
%define version %(echo "$(awk '/appVersion /{ print $3 }' <<< "appVersion = \"1.2-SNAPSHOT\"" | tr -d \")") 

sh: -c: line 0: unexpected EOF while looking for matching `)' 
sh: -c: line 1: syntax error: unexpected end of file 
error: line 23: Empty tag: Version: 

Update 6

buona notizia e una cattiva notizia per tutti, ho scoperto che rpm sembra fare un po 'del proprio lavoro nel backround e non mostrando ciò che il suo fare, ho finalmente trovato un comando che dà valori diversi quando viene chiamato tramite rpm:

%define version %(echo "$(awk '/midonetVersion /{ print $3 }' <<< "midonetVersion = \"5.1-SNAPSHOT\"")") 
#In terminal it echos "5.1-SNAPSHOT" (literally wrapped in "") 
#When in spec it set version to 5.1-SNAPSHOT , rpmbuild is removing the "" 

Così ora ho fatto un adeguamento e chiamato questo:

012.
#echos "5.1 in terminal and sets version to 5.1 in spec 
%define version %(echo "$(awk '/appVersion /{ print $3 }' <<< "appVersion = \"1.2-SNAPSHOT\"")"| cut -d'-' -f1) 

Quindi, da questo punto di vista, penso che ci sia un simile tipo di analisi del dietro le quinte del risultato del mio primo comando sed da rpm. Faremo il nostro modo rpm!

aggiornamento finale

Una tregua è stata fatta con rpm, ho intenzione di utilizzare questo comando invece:

%define version %(echo "$(awk '/ appVersion =/{ print $3 }' /filepath/values.txt" | sed 's/\"//g' | cut -d'-' -f1) 

Si fa la stessa cosa come il mio primo comando e lavora all'interno specfile l'impostazione del numero di versione corretto. Se qualcuno ha qualche ipotesi sul motivo per cui il primo comando non funzionerebbe, sarei felice di leggerlo. Pace!

+0

Potrebbe essere a causa di un problema di autorizzazione con '/ fullfilepath/values.txt'. Prova a sostituirlo con il valore effettivo (o semplificato). –

risposta

1

È necessario avere uno script di shell che richiama il comando rpmbuild. Puoi usare quello script per calcolare la versione (o per quello, qualsiasi comando tu stia cercando di usare nel file spec di rpm).

modificare il codice originale,

%define version %(echo "$(sed -n 's|^[ ]*appVersion = "\(.*\)"|\1|p' /fullfilepath/values.txt | sed 's/^\(.*\)-.*$/\1/')") 
Version: %{version} 

a,

%define version _VERSION_ 
Version: %{version} 

Sed VERSIONE al suo valore calcolato nello script di shell che chiama rpmbuild (prima di richiamare rpmbuild). Dopo che i contenuti delle specifiche effettive sono stati scaricati su un file, passare il file generato a rpmbuild nello stesso script di shell.

Ecco un riassunto dei passi:

Supponendo di avere un costruttore.sh script di shell che chiama rpmbuild, seguire la procedura:

  1. Aggiornamento del file di vostra spec di avere VERSIONE stringa segnaposto/macro come esposizione qui sopra
  2. Sposta file spec rpm corrente my_package_template.spec
  3. in builder .SH, comando di marcia (s) per ottenere la versione e salvare la versione da un
  4. Utilizzare il comando variabile sed in archivio my_package_template.spec per sostituire vERSIONE da questa versione computerizzata, e salvare l'output sed per my_package.spec
  5. Passare my_package.spec al comando rpmbuild.

Ripetere i passaggi 1, 3 e 4 per sostituire l'utilizzo di altri comandi della shell all'interno del file spec.

+4

'rpmbuild' consente di impostare variabili dalla riga di comando, ed è molto più semplice che richiedere file' sed' e temporanei. –

1

Farei uno script wrapper. Ciò ti consente di decidere come se si trattasse di una versione normale o di sviluppo, ecc. Quindi puoi passare le variabili con l'opzione --define - vedi this question for more options.

Problemi correlati