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
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