Crear repositorio de paquetes RPM

Últimamente he estado aprendiendo a crear paquetes RPM y cuando ya tienes hechos unos cuantos es muy útil crearse un repositorio para instalarlos desde ahí. Para una empresa que tiene que gestionar muchas máquinas es una herramienta fundamental para distribuir versiones personalizadas o aplicaciones propias. Hay bastante documentación al respecto, yo he estado leyendo entradas como ésta.

Os cuento como he creado mi repositorio.

Cuento con dos máquinas, el servidor (un VPS en buyvm.net, os lo recomiendo) y mi máquina de trabajo. Los RPM ya los tengo generados, en otra entrada ya explicaré en más detalle como hacerlos.

Primero voy a crear toda la estructura en mi máquina.


$ mkdir -p /home/user/devel/repo #Este será el directorio raiz del repositorio
$ cd /home/user/devel/repo
$ mkdir -p Fedora/15/{i386,x86_64}/{os,debug}
$ mkdir -p Fedora/15/source/SRPMS
$ cp <rpms> <directorio donde les corresponda> #Los binarios en arch/os los src.rpm en source/SRPMS etc.

Ahora vamos a generar una clave GPG para firmar los RPM y la información del repositorio.

$ gpg --gen-key #Creamos una clave RSA de 4096 bits (recomendado), le damos el nombre del repositorio.
$ gpg --export <nombre de la clave> > /home/user/devel/repo/RPM-GPG-KEY-myrepo #Exportamos la clave pública al repositorio


Añado las siguientes líneas a ~/.rpmmacros

%_signature gpg
%_gpg_name <nombre de la clave del repositorio>

Y firmo los paquetes con la clave:

$ find /home/user/devel/repo -type f -name "*.rpm" | xargs rpm --resign

Ahora solo nos queda crear la información del repositorio, para esto usaremos la herramienta createrepo. He creado el siguiente script en bash para automatizar el proceso:

#!/bin/bash
repodir="/home/user/devel/repo/Fedora/15"
archs="i386/os i386/debug x86_64/os x86_64/debug source/SRPMS"

# Actualizo la informacion del repositorio
for arch in $archs
do
   pushd ${repodir}/${arch} >/dev/null 2>&1
   createrepo -v .
   popd >/dev/null 2>&1
done

# Firmo el repositorio
files=$(find $repodir -name repomd.xml)
for file in $files
do
   echo "Firmo el archivo: $file"
   if [ -f ${file}.asc ]; then
      rm -f ${file}.asc
      gpg --armor --detach-sign --default-key "<nombre de la clave del repositorio>" $file
   fi
done

Ya tenemos el repositorio creado en nuestra máquina. Ahora vamos a replicarlo al servidor web, para ello crearemos la carpeta que alojará la web y lo sincronizaremos con rsync. Podemos crear un tarea cron que se ejecute cada hora para tenerlo siempre sincronizado o lanzarlo manualmente.


rsync -avz --rsh=ssh --delete /home/user/devel/repo/ user@server.example.com:/var/www/vhosts/rpm.server.example.com/repo/

Por último creamos el fichero myrepo.repo que describe nuestro repositorio y lo copiamos en /etc/yum.repos.d

[myrepo]
name=My repository
baseurl=http://server.example.com/repo/Fedora/15/$basearch/os
enabled=1
gpgcheck=1
gpgkey=http://server.example.com/repo/RPM-GPG-KEY-myrepo.asc

[myrepo-debuginfo]
name=My repository - Debug
baseurl=http://server.example.com/repo/Fedora/15/$basearch/debug
enabled=0
gpgcheck=1
gpgkey=http://server.example.com/repo/RPM-GPG-KEY-myrepo.asc

[myrepo-source]
name=My repository - Source
baseurl=http://server.example.com/repo/Fedora/15/source/SRPMS
enabled=0
gpgcheck=1
gpgkey=http://server.example.com/repo/RPM-GPG-KEY-myrepo.asc
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s