openSUSE:OSC

Questo documento riguarda sia lo strumento da riga di comando per Open Build Service sia l'API di pertinenza, entrambi chiamati osc.

Si noti che esiste anche osc2, una riscrittura in corso di osc che non è ancora pronta per il normale utilizzo operativo.

Introduzione

osc è scritto in Python e, in aggiunta all'interfaccia da riga di comando, fornisce anche un modulo Python per consentirne l'uso da altri programmi in Python.

osc è un client con interfaccia a riga di comando e funzionalità di rete in stile Subversion. Svolge fa funzione di client per il componente deposito dei codici sorgente del Build Service, viene inoltre usato per modificare i metadati o per eseguire interrogazioni riguardo i risultati delle operazioni di build (creazione pacchetti).

Scaricamento e installazione

osc è incluso nelle versioni recenti della distribuzione Linux openSUSE. Per averlo nel proprio sistema è sufficiente eseguire

zypper in osc

Le nuove versioni, nel caso in cui le si ritenga davvero necessarie, sono disponibili nel repository tools di openSUSE, in cui si trovano inoltre i pacchetti per molte altre distribuzioni (SLES, Fedora, Mandriva, Debian, etc.). Se si desidera avere a disposizione la versione del codice ancora più recente, si può ricorrere a Git:

Per avere osc funzionante, è richiesto python-xml, e, se non fosse già stato installato automaticamente da zypper (ad esempio se si è deciso fin da subito di usare la versione git), sarà necessario installarlo in seguito.

Fase operativa

Autenticazione

Quando si usa osc per la prima volta, vengono richiesti i propri dati di autenticazione, che verranno archiviati nel file ~/.oscrc. La password viene salvata come testo semplice, proteggere dunque il file ~/.oscrc e il proprio filesystem in maniera adeguata.

A partire dalla versione 0.122, osc è stato dotato del supporto per la libreria d'accesso universale python-keyring (che supporta KWallet, il portachiavi di Gnome, MacOS e Windows) ed è in grado di salvare le password nei portachiavi (i keyring) invece che nel file ~/.oscrc.
python-keyring dovrebbe già essere fornito da openSUSE e installato assieme a osc (è raccomandato dal suo pacchetto rpm), se così non fosse si potrà installarlo manualmente (preferibilmente prima di avviare osc per la prima volta) oppure aggiungere un repository opportuno prima di installare il pacchetto osc.
Se si volesse usare il portachiavi dopo aver già creato l'utente con osc, sarà necessario rimuovere la sezione con i propri dati d'accesso dal file ~/.oscrc. La prossima volta che si esegue osc verranno nuovamente richiesti i dati di autenticazione.
Ma prima di ciò potrebbe essere necessario de-commentare la riga #use_keyring = 1 nella sezione [general] del suddetto file .oscrc (dipende dalla versione di osc in uso).

È stato riportato che, con python-keyring e le modifiche di qui sopra nel file ~/.oscrc, non è possibile autenticarsi usando il portachiavi di Gnome. In tal caso è stato d'aiuto rimuovere il pacchetto python-keyring e aggiungere alla sezione relativa al server di autenticazione nel file ~/.oscrc soltanto la riga gnome_keyring=1, invece della riga keyring=1.

Esempi di utilizzo

Qui sotto si riportano alcuni esempi d'uso a scopo introduttivo. Da notare la disponibilità del Tutorial su Build Service, che fornisce un'introduzione più sistematica.

Mostra informazioni su come usare un comando

osc help
osc help <cmd>

Elenca il contenuto presente sul server

osc ls                          # elenca i progetti
osc ls Apache                   # elenca i pacchetti in un progetto
osc ls Apache subversion        # elenca i file del pacchetto di un progetto

Checkout (crea una copia locale gestibile da ocs) del contenuto

osc co Apache                   # tutto il progetto
osc co Apache subversion        # un pacchetto
osc co Apache subversion foo    # un singolo file

Aggiorna una directory di lavoro (ovvero già inizializzata e gestibile da ocs)

osc up
osc up <directory>
osc up *                        # dall'interno della directory del progetto, aggiorna tutti i pacchetti
osc up                          # dall'interno della directory del progetto, aggiorna tutti i pacchetti
                                  E fai il check out (crea copia gestibile da ocs) di tutti i pacchetti
                                  aggiunti dall'ultima volta

Invia al server la revisione (checkin/commit) con i contenuti modificati

osc ci                          # directory corrente
osc ci <file1> <file2>          # solo i file specificati
osc ci <dir1> <dir2> ...        # più pacchetti
osc ci -m "updated foobar"      # specifica un messaggio per il commit (commento in inglese, please)

Mostra il log (registro) dei commit

osc log

Mostra lo status (quali file sono stati modificati in locale)

osc st
osc st <directory>

Se un aggiornamento (update) non può essere importato automaticamente, il relativo file sarà in condizione 'C' (di conflitto) e i conflitti saranno segnalati con le righe speciali <<<<<<< e >>>>>>>. Una volta risolto manualmente il problema, usare

osc resolved <file>

Segna i file che devono essere aggiunti o rimossi al prossimo "checkin"

osc add foo
osc rm foo

Aggiunge tutti i file nella copia locale che sono nuovi e rimuove tutti quelli non più presenti.

osc addremove

Genera un confronto per visualizzare le modifiche

osc diff [file]

Mostra i risultati della creazione (build) del pacchetto

osc results
osc results <piattaforma>

Visualizza il file registro (log) di un pacchetto (è necessario lanciare il comando all'interno della directory di un pacchetto)

osc buildlog <piattaforma> <arch>

Mostra gli indirizzi URL dei file .repo che costituiscono le fonti di installazione pacchetti per Yum/YaST/smart

osc repourls [dir]

Richiamo una nuova creazione di pacchetto per tutti i repository/architetture di un pacchetto

osc rebuildpac [dir]

Crea un pacchetto nella propria piattaforma locale

osc build <piattaforma> <arch> <filespec> [--clean|--noinit|...]

Mostra le piattaforme configurate o gli obiettivi della creazione pacchetti.

osc platforms [progetto]

Visualizza gli obiettivi della creazione pacchetti disponibili per il proprio progetto.

osc repos

Mostra le meta-informazioni

osc meta prj <progetto>
osc meta pkg <progetto> <pacchetto>
osc meta user <nomeutente>
osc meta prjconf <progetto>

Modifica le meta-informazioni. Verrà creato un nuovo pacchetto o progetto se non è ancora presente, in ogni caso si aprirà un Editor (default: vi) con il file sorgente dei metadati, direttamente in formato XML. Se non si ha dimestichezza con il codice XML da inserire, si può invece usare il client web, dal browser.

osc meta prj -e <progetto>
osc meta pkg -e <progetto> <pacchetto>
osc meta prjconf -e <progetto>

(Il file di configurazione del progetto (prjconf) può essere tranquillamente vuoto. È necessario soltanto in casi particolari.)

Aggiorna i meta-dati del pacchetto con i metadati estratti dal file spec

osc updatepacmetafromspec <dir>

Tenere traccia di un pacchetto

Con osc è inoltre possibile gestire i pacchetti in una modalità simile a svn. Questa funzionalità è chiamata package tracking (tracciatura del pacchetto) e, per usarla, deve essere attivata nella sezione [general] del file ~/.oscrc

# gestire i pacchetti in modalità simile a svn
do_package_tracking = 1

Aggiungere un nuovo pacchetto al progetto

osc mkpac <pacchetto>

Aggiungere ad un progetto una directory già esistente, assieme ai file all'interno di essa

osc add <directory>

Rimuovere un pacchetto e i file ad esso appartenenti da un progetto

osc deletepac <pacchetto>

Tutti i comandi qui sopra modificheranno soltanto la copia di lavoro locale gestita da ocs. Per inviare le modifiche al buildservice sarà necessario inviare la revisione (commit) delle stesse (comando: osc ci -m <message>).

Il comando status mostra anche lo stato attuale dei pacchetti

osc st

Documentazione

Oltre alla pagina di manuale per osc, è disponibile anche una scheda di riferimento rapido.

Come faccio a intervenire su un pacchetto, con dei problemi, non in factory?

Checkout del pacchetto che ti interessa:

osc -A https://api.suse.de bco SUSE:SLE-11-SP2:GA <nome pacchetto>

Sistemalo e, dopo aver verificato che il pacchetto si può compilare senza problemi, invialo al server:

osc commit <nome pacchetto>

Estendere osc con i plugin

osc è estendibile, per cui è possibile modificare il comportamento dei comandi o scriverne di propri. Si veda en:openSUSE:OSC plugins per maggiori informazioni.

Migrazione di configurazione

Con la versione 0.114 sono stati riordinati alcuni aspetti relativi al file di configurazione, per cui alcune opzioni sono diventate deprecate, in particolare:

  • apisrv
  • scheme

È stata aggiunta una nuova opzione:

  • apiurl = <protocollo>://<hostqualunque> # da usare come apiurl predefinita. Se questa opzione non è specificata viene usata quella predefinita (https://api.opensuse.org).

Qualora la versione in uso di osc sia ancora (limitatamente) retro-compatibile con queste opzioni, che tuttavia potrebbero venire rimosse in futuro, verrà comunque emesso un avviso di opzione deprecata, nel caso in cui una di tali opzioni venga ancora utilizzata. Il nuovo schema di configurazione si presenta come il seguente:

# voce per una apiurl
[<protocollo>://<apiurl>]
user = <nomeutente>
password = <password>
...

Prima di iniziare la migrazione si raccomanda di salvare il proprio file ~/.oscrc!

Se la migrazione non dovesse avvenire correttamente per un qualche motivo, contattare la mailinglist opensuse-buildservice o il canale irc #opensuse-buildservice.

Primo caso di migrazione (solo apisrv)

L'opzione apisrv è usata per specificare l'apihost predefinito. Se apisrv non è in alcun modo specificata viene usata quella predefinita ("api.opensuse.org"). In questo primo caso la sezione [general] si presenta al momento così:

[general]
...
apisrv = <hostqualunque>
# oppure
apisrv = <protocollo>://<hostqualunque>

ma apisrv è stata rimpiazzata dalla nuova opzione apiurl, che deve essere usata in questo modo:

[general]
...
apiurl = <protocollo>://<hostqualunque>

Se non è stato specificato nessun "<protocollo>" per apisrv, verrà usato https. Assicurarsi che tutte le sezioni apiurl siano nel nuovo formato descritto sopra, dopodiché si potrà rimuovere apisrv.

Secondo caso di migrazione (solo scheme)

In tal caso la sezione [general] si presenta al momento così:

[general]
...
scheme = <protocollo>

questo significa che ogni sezione apiurl che non sia usata nel nuovo formato, il quale è descritto nell'esempio qui di seguito

[<hostqualunque>]
user = <nomeutente>
password = <password>
...

deve essere convertita in

[<protocollo>://<hostqualunque>]
user = <nomeutente>
password = <password>
...

Dopodiché l'opzione scheme può essere rimossa dalla sezione [general] (potrebbe darsi che alcune sezioni siano già nel formato corretto).

Terzo caso di migrazione (apisrv e scheme)

In tal caso la sezione [general] si presenta al momento così:

[general]
...
apisrv = <hostqualunque>
scheme = <protocollo>

Entrambe le opzioni devono essere rimosse, una volte che tutte le sezioni apiurl siano nel nuovo formato descritto sopra. Quindi si tratta in pratica di correggere tutte le sezioni apiurl (potrebbe darsi che alcune sezioni siano già nel formato corretto).

Usare osc build con xen

Prima di procedere sarà necessario avere i pacchetti xen e il kernel Xen installati e avviati all'avvio del sistema. Al fine di attivare i build locali con xen, sarà necessario aggiungere le righe qui di seguito alla sezione [general] del file ~/.oscrc del proprio utente:

build-type=xen
build-device=/tmp/FILE.root
build-swap=/tmp/FILE.swap
build-memory=512

Creare quindi i succitati due file:

dd if=/dev/zero of=/tmp/FILE.root bs=1M count=4096  # partizione di 4GB per / . Con grossi progetti si dovrebbero usare 8GB.
mkfs.ext3 /tmp/FILE.root                            # Premere (y) se si riceve l'avviso che il file non è un nodo dispositivo.
dd if=/dev/zero of=/tmp/FILE.swap bs=1M count=512   # se necessario usare una dimensione diversa
mkswap /tmp/FILE.swap

Nel caso in cui si voglia utilizzare la funzionalità di compilazione multi-piattaforma, sarà necessario aggiungere, nel file /etc/sysconfig/kernel del proprio sistema, rispettivamente:

  • binfmt_misc a INITRD_MODULES
  • binfmt_misc a DOMU_INITRD_MODULES
  • binfmt_misc a MODULES_LOADED_ON_BOOT

Rigenerare il file initrd con mkinitrd.

Lanciare infine osc build.

Scheda di riferimento rapido per .oscrc

Sezione [general]

Archiviazione:

# I pacchetti scaricati sono salvati, temporaneamente, qui. Sono necessari i permessi di scrittura da parte dell'utente.
# default:
packagecachedir = /var/tmp/osbuild-packagecache
# directory radice impostata per l'ambiente chroot
# può contenere (anche più volte) %(repo) e/o %(arch) etc. automaticamente sostituiti coi loro valori
# /<percorso>/%(repo)-%(arch)-%(project)-%(package)
# default:
build-root = /var/tmp/build-root/

API di comunicazione:

# utilizza questo server delle API (nomehost[:porta])
# (richiede una sezione [api.opensuse.org] con i dati di autenticazione)
# default:
apisrv = api.opensuse.org
# usare questo protocollo per accedere al server delle API (http o https)
# default:
scheme = https

Host delle API:

# è possibile fare riferimento agli host delle API con l'ausilio di alias, p.es. 'osc -A alias ...'
# Elenca gli alias per gli host delle API nella sezione host API.
# https://api.opensuse.org
# user=jdoe
# aliases=

Build locale:

# Wrapper per invocare build come root (sudo, su -, ...)
# default:
su-wrapper = su -c
# non richiedere alcuna password con:
#su-wrapper = sudo
#con questa voce nel file sudoers:
# <nomeutente> ALL = NOPASSWD: /usr/bin/build
# Per conveninenza/scopi di debug, osc aggiunge internamente vim gdb strace
# ai pacchetti installati nel chroot della build, se extra-pkgs non è impostato a:
#extra-pkgs=
# build-type, tipo di build - valori ammessi:
#  * vuoto -> chroot
#  * xen -> xen VM
#  * kvm -> kvm VM (necessita di test)
# default: non impostato/chroot
#build-type=xen
# build-device, dispositivo di build - filesystem radice da usare per la VM (macchina virtuale)
# default: non impostato
#build-device=/tmp/FILE.root
# build-swap - filesystem di swap da usare per la VM
# default: non impostato
#build-swap=/tmp/FILE.swap
# build-memory - quantità di memoria per la VM
# default: non impostata
#build-memory=512

Contribuire: segnalazione di bug, sviluppo, etc.

Lo sviluppo viene portato avanti in: https://github.com/openSUSE/osc

Segnalare eventuali nuovi problemi a: https://github.com/openSUSE/osc/issues/new