Como gerar pacotes .RPM – gere seu próprio pacote rpm

Uma excelente utilidade ao gerar seus próprios pacotes é a possibilidade de fazer upgrade e downgrade de aplicações com facilidade e agilizar as entregas em Dev, Qa, e Produção.
Hoje em dia com CI e CD é imprescindível que ao executar um deploy se tenha a possibilidade de rollback, isto é o básico.
Então neste tutorial vou demonstrar como gerar pacotes rpms, assim como o processo de instalação, upgrade e downgrade dos pacotes.

1. Criação de um usuário para gerar pacotes RPM
É opcional mas recomendo criar um usuário dedicado para o build de pacotes .rpm, neste tutorial eu criei o usuário “buildrpm”.

2. Instale os pacotes rpmdevtools e rpm-build

# yum -y install rpmdevtools rpm-build

3. Crie a árvore de diretórios para gerar o pacote

$ rpmdev-setuptree
$ ls -R rpmbuild/
rpmbuild/:
BUILD  RPMS  SOURCES  SPECS  SRPMS

Ou pode ser criado na mão.

$ mkdir rpmbuild
$ cd rpmbuild
$ mkdir BUILD RPMS SOURCES SPECS SRPMS

4. Vou criar um arquivo de repositório .repo, no caso é o “MEU-REPO.repo”

$ cd rpmbuild/SOURCES
$ mkdir -p repo-versao-1/etc/yum.repos.d
$ cp -v ~/MEU-REPO.repo repo-versao-1/etc/yum.repos.d

Foi criado um repositório qualquer no caso “MEU-REPO.repo”, mas poderia ser qualquer arquivo.
Criei uma pasta versionada “repo-versao-1”, sendo assim sugiro que a cada modificação altere a versão da pasta (repo-versao-1.1, repo-versao-1.2, repo-versao-2.0, …).

5. Gere o tarball da pasta “repo-versao-1”

$ cd rpmbuild/SOURCES
$ # tar cvzf repo-versao-1.tar.gz repo-versao-1

$ tar cvzf repo-versao-1.tar.gz repo-versao-1
repo-versao-1/
repo-versao-1/etc/
repo-versao-1/etc/yum.repos.d/
repo-versao-1/etc/yum.repos.d/MEU-REPO.repo

Este pacote .tar.gz será utilizado na definição do .spec logo abaixo.

6. Criação do arquivo .Spec
O arquivo .spec é onde serão definidas as informações para a gerar o pacote .rpm.

$ cd rpmbuild/SPECS
$ rpmdev-newspec  repo-versao-1.spec
$ cat repo-versao-1.spec
Name:           repo-versao
Version:        1
Release:        0
Summary:        Resumo Este e um repositorio repo devopslab bla bla bla

License:        GPL
URL:            http://repo.devopslab.com.br/repo/CentOS/
Source0:        repo-versao-1.tar.gz

BuildArch:	noarch
BuildRoot:	%{_tmppath}/%{name}-buildroot

%description
Escreva uma descricao para o pacote
Este e um novo repositorio bla bla bla

%prep
%setup -q

%install
mkdir -p $RPM_BUILD_ROOT
cp -R * $RPM_BUILD_ROOT

%files
%defattr(-,root,root,-)
/etc/yum.repos.d/MEU-REPO.repo

7. Gere o pacote utilizando as definições do arquivo .spec

$ cd rpmbuild/SPECS/
$ # rpmbuild -v -bb repo-versao-1.spec

buildrpm@rpmbuild-01 SPECS]$ rpmbuild -v -bb repo-versao-1.spec
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.DowMqD
+ umask 022
+ cd /home/buildrpm/rpmbuild/BUILD
+ cd /home/buildrpm/rpmbuild/BUILD
+ rm -rf repo-versao-1
+ /usr/bin/gzip -dc /home/buildrpm/rpmbuild/SOURCES/repo-versao-1.tar.gz
+ /usr/bin/tar -xf -
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd repo-versao-1
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ exit 0
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.xb3qI7
+ umask 022
+ cd /home/buildrpm/rpmbuild/BUILD
+ '[' /home/buildrpm/rpmbuild/BUILDROOT/repo-versao-1-0.x86_64 '!=' / ']'
+ rm -rf /home/buildrpm/rpmbuild/BUILDROOT/repo-versao-1-0.x86_64
++ dirname /home/buildrpm/rpmbuild/BUILDROOT/repo-versao-1-0.x86_64
+ mkdir -p /home/buildrpm/rpmbuild/BUILDROOT
+ mkdir /home/buildrpm/rpmbuild/BUILDROOT/repo-versao-1-0.x86_64
+ cd repo-versao-1
+ mkdir -p /home/buildrpm/rpmbuild/BUILDROOT/repo-versao-1-0.x86_64
+ cp -R etc /home/buildrpm/rpmbuild/BUILDROOT/repo-versao-1-0.x86_64
+ '[' noarch = noarch ']'
+ case "${QA_CHECK_RPATHS:-}" in
+ /usr/lib/rpm/check-buildroot
+ /usr/lib/rpm/redhat/brp-compress
+ /usr/lib/rpm/redhat/brp-strip /usr/bin/strip
+ /usr/lib/rpm/redhat/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump
+ /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip
+ /usr/lib/rpm/brp-python-bytecompile /usr/bin/python 1
+ /usr/lib/rpm/redhat/brp-python-hardlink
+ /usr/lib/rpm/redhat/brp-java-repack-jars
Processing files: repo-versao-1-0.noarch
Provides: repo-versao = 1-0
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/buildrpm/rpmbuild/BUILDROOT/repo-versao-1-0.x86_64
Wrote: /home/buildrpm/rpmbuild/RPMS/noarch/repo-versao-1-0.noarch.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.lNfmk8
+ umask 022
+ cd /home/buildrpm/rpmbuild/BUILD
+ cd repo-versao-1
+ /usr/bin/rm -rf /home/buildrpm/rpmbuild/BUILDROOT/repo-versao-1-0.x86_64
+ exit 0
#

8. Verifique o pacote criado na pasta RPMS

$ ls rpmbuild/RPMS/noarch/ 
rpmbuild/RPMS/noarch/repo-versao-1-0.noarch.rpm

$ rpm -qpl rpmbuild/RPMS/noarch/repo-versao-1-0.noarch.rpm
/etc/yum.repos.d/MEU-REPO.repo

9. Instale o pacote e veja se foi criado o arquivo “/etc/yum.repos.d/MEU-REPO.repo”

$ sudo rpm -hiv repo-versao-1-0.noarch.rpm

$ ls -l /etc/yum.repos.d/MEU-REPO.repo 
-rw-r--r--. 1 root root 202 Apr 14 13:10 /etc/yum.repos.d/MEU-REPO.repo

10. Teste de remoção de pacote
Remova o pacote repo-versao-1-0. Após a remoção o arquivo “/etc/yum.repos.d/MEU-REPO.repo” terá que ser removido.

$ sudo yum remove repo-versao-1-0.noarch
$ ls -l /etc/yum.repos.d/MEU-REPO.repo 
ls: cannot access /etc/yum.repos.d/MEU-REPO.repo: No such file or directory

11. Teste de Upgrade e Downgrade
Vou gerar algumas versões para fazer o teste de upgrade e downgrade.
Primeiramente crie novos arquivos “.spec” e altere a versão e o source0.

SPECS/repo-versao-1.1.spec
Name: repo-versao
Version: 1.1
Release: 0
Source0: repo-versao-1.1.tar.gz

SPECS/repo-versao-1.2.spec
Name: repo-versao
Version: 1.2
Release: 0
Source0: repo-versao-1.2.tar.gz

Agora crie novas pastas dentro do SOURCES com as respectivas versões.
SOURCES/repo-versao-1.1
SOURCES/repo-versao-1.2

Altere os arquivos que você quiser, e gere um novo tarball tar.gz.
tar -cvzf repo-versao-1.1.tar.gz repo-versao-1.1
tar -cvzf repo-versao-1.2.tar.gz repo-versao-1.2

Por fim gere os novos pacotes.
$ rpmbuild -v -bb SPECS/repo-versao-1.1.spec
$ rpmbuild -v -bb SPECS/repo-versao-1.2.spec

Verifique os pacotes rpms gerados.
$ cd /home/buildrpm/rpmbuild/RPMS/noarch
$ ls
repo-versao-1-0.noarch.rpm
repo-versao-1.1-0.noarch.rpm
repo-versao-1.2-0.noarch.rpm

Instalação do pacote versão 1.1 repo-versao-1.1-0.noarch.rpm

$ sudo rpm -hiv repo-versao-1.1-0.noarch.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:repo-versao-1.1-0                ################################# [100%]
$ cat /etc/yum.repos.d/MEU-REPO.repo | grep Versao
name=Versao 1.1 - Repositorio Teste Meu Repo - DevOpsLab

Upgrade para a versão 1.2 repo-versao-1.2-0.noarch.rpm

$ sudo rpm -Uvh repo-versao-1.2-0.noarch.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:repo-versao-1.2-0                ################################# [ 50%]
Cleaning up / removing...
   2:repo-versao-1.1-0                ################################# [100%]
$ cat /etc/yum.repos.d/MEU-REPO.repo | grep Versao
name=Versao 1.2 - Repositorio Teste Meu Repo - DevOpsLab
$ rpm -qa | grep repo-versao
repo-versao-1.2-0.noarch

Downgrade para a versão 1.0 repo-versao-1-0.noarch.rpm

$ sudo rpm -Uvh --oldpackage repo-versao-1-0.noarch.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:repo-versao-1-0                  ################################# [ 50%]
Cleaning up / removing...
   2:repo-versao-1.2-0                ################################# [100%]
$ cat /etc/yum.repos.d/MEU-REPO.repo | grep Versao
name=Versao 1.0 - Repositorio Teste Meu Repo - DevOpsLab
$ rpm -qa | grep repo-versao
repo-versao-1-0.noarch

Remoção do pacote repo-versao-1-0.noarch.rpm

$ sudo rpm -e repo-versao-1-0.noarch
$ ls  /etc/yum.repos.d/MEU-REPO.repo
ls: cannot access /etc/yum.repos.d/MEU-REPO.repo: No such file or directory
$ rpm -qa | grep repo-versao
$ 

É isto aí, novidades só chamar.

Leonardo Macedo

Um comentário sobre “Como gerar pacotes .RPM – gere seu próprio pacote rpm

  1. O meu deu erro:

    [root@localhost junior]# rpmbuild -v -bb arquivo.spec
    Executando (%prep): /bin/sh -e /var/tmp/rpm-tmp.QGk9wK
    + umask 022
    + cd /root/rpmbuild/BUILD
    + ‘[‘ 1 -eq 1 ‘]’
    + ‘[‘ 1 -eq 1 ‘]’
    + ‘[‘ 1 -eq 1 ‘]’
    + exit 0
    Executando (%install): /bin/sh -e /var/tmp/rpm-tmp.M9ebDO
    + umask 022
    + cd /root/rpmbuild/BUILD
    + ‘[‘ /root/rpmbuild/BUILDROOT/CalculadoraDeDecimo-1.0-1.x86_64 ‘!=’ / ‘]’
    + rm -rf /root/rpmbuild/BUILDROOT/CalculadoraDeDecimo-1.0-1.x86_64
    ++ dirname /root/rpmbuild/BUILDROOT/CalculadoraDeDecimo-1.0-1.x86_64
    + mkdir -p /root/rpmbuild/BUILDROOT
    + mkdir /root/rpmbuild/BUILDROOT/CalculadoraDeDecimo-1.0-1.x86_64
    + ‘[‘ 1 -eq 1 ‘]’
    + mkdir -p /root/rpmbuild/BUILDROOT/CalculadoraDeDecimo-1.0-1.x86_64//usr/bin/
    + install -m0755 /root/rpmbuild/BUILD/CalculadoraDeDecimo /root/rpmbuild/BUILDROOT/CalculadoraDeDecimo-1.0-1.x86_64//usr/bin
    install: cannot stat ‘/root/rpmbuild/BUILD/CalculadoraDeDecimo’: No such file or directory
    erro: Status de saída de /var/tmp/rpm-tmp.M9ebDO inválido (%install)

    Erros na construção do RPM:
    Status de saída de /var/tmp/rpm-tmp.M9ebDO inválido (%install)
    [root@localhost junior]#

    Meu arquivo.spec:

    Name:CalculadoraDeDecimo
    Summary: CalculadoraDeDecimo
    Version:1.0
    Release:1
    License: GPL
    Group: Sciences/Mathematics
    Source: CalculadoraDeDecimo.tar.gz
    Source1: calculadora.png
    Source2: calculadoradedecimo.desktop
    URL: ftp://ftp.planetalinux.com.br
    Vendor: Junior
    Packager: ftp
    BuildRoot: %{_tmppath}/%{name}

    %description
    Calculadora feita no lazarus.

    %prep

    %install
    mkdir -p $RPM_BUILD_ROOT/%{_bindir}/
    install -m0755 $RPM_BUILD_DIR/CalculadoraDeDecimo $RPM_BUILD_ROOT/%{_bindir}

    mkdir -p $RPM_BUILD_ROOT/%{_datadir}/pixmaps/
    install -m644 %{SOURCE0} -D $RPM_BUILD_ROOT/usr/share/pixmaps/
    mkdir -p $RPM_BUILD_ROOT/%{_datadir}/applications/
    install -m644 %{SOURCE1} -D $RPM_BUILD_ROOT/usr/share/applications/

    %clean
    rm -rf $RPM_BUILD_ROOT

    %post
    %{update_menus}

    %postun
    %{clean_menus}

    %files
    /usr/bin/CalculadoraDeDecimo

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *