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

Como instalar o Jenkins

Como instalar o Jenkins

Pré-requisitos
CentOS 7 x86_64 – instalação mínima. Também funciona em RedHat e Fedora.

1.Repositório Jenkins

Instale o repositório do Jenkins conforme segue abaixo.

#wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
#rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key

2. Instalação do Java

Alguns sistemas podem vir com um java instalado como este:

#java -version
#java version "1.5.0"
#gij (GNU libgcj) version 4.4.6 20110731 (Red Hat 4.4.6-3)

Neste caso remova o java padrão “yum remove java” e instale a última versão do Java OpenJDK.

Instalação da versão funcional do Java para o Jenkins.

#yum search java
#yum install java-1.8.0-openjdk.x86_64

#java -version
openjdk version "1.8.0_71"
OpenJDK Runtime Environment (build 1.8.0_71-b15)
OpenJDK 64-Bit Server VM (build 25.71-b15, mixed mode)

3. Instalação do jenkins

Uma vez com o repositório e Java instalado.

#yum install jenkins

4. Configuração do Firewall

Abra a porta 8080 e 80 no firewall.

firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --add-service=http --permanent
firewall-cmd --reload

5. Stop, Start, Restart e habilitar o startup automático

Operações de start, stop e restart.

Systemctl [COMANDO] jenkins
#systemctl start jenkins
#systemctl stop jenkins
#systemctl restart jenkins
#systemctl status jenkins

Habilitar o statup automático após o boot

#systemctl enable jenkins
#Ou
#chkconfig jenkins on

6. Acessando o jenkins pela primeira vez

Digite no navegador o ip ou dns do servidor e a porta da seguinte forma http://ip:8080

http://jenkins.devopslab.com.br:8080/
print jenkins-home1

7. Criação de usuários e segurança

A instalação padrão do Jenkins permite que qualquer pessoa na rede possa acessar e mexer no Jenkins e isto é inseguro, logo vamos habilitar a autenticação e criar usuários no Jenkins.

Existem várias formas de autenticação no Jenkins, por exemplo utilizando LDAP (Active Directory ou OpenLDAP), porém aqui nós vamos utilizar a própria base de dados do Jenkins para a criação de usuários, e também a criação de usuários será manual pelo Administrador.

7.1. Configuração de Segurança e autenticação

Configure Global Security
Vamos desabilitar o usuário Anonymous e criar um novo usuário administrativo
Entre em Manage Jenkins -> Configure Global Security e clique em “Enable Security“.

Security Realm
Em Security Realm escolha: “Jenkins own user database“.
Ainda em Secutiry Realm desative “Allow users to sign up“, para não permitir que qualquer usuário faça cadastro.

Ou seja os usuários serão criados na própria base de dados do Jenkins e será bloqueado o cadastro de novos usuários na home do Jenkins. Os novos usuários serão cadastrados manualmente pelo administrador do Jenkins.

Authorization
Em Authorization escolha “Matrix-based security
Matrix-based security possibilita criar permissões de forma mais granular.
No usuário Anonymous marque todas as opções, dê permissão total neste momento.

Lembre-se você está logado com o usuário Anonymous, se você salvar sem dar esta permissão, você será impossibilitado de administrar o Jenkins. Então antes será preciso criar um novo usuário administrativo para substituir o Anonymous.

Então ainda em Authorization crie um novo usuário com poder total. Eu vou criar um usuário “leonardo” para demonstração. Após a criação do usuário clique em Save.
jenkins-security1

Você será redirecionado para uma tela de cadastro, então preencha de acordo com o usuário que você recém criou, no meu caso o usuário é “leonardo”.
jenkins-cadastro1

Agora volte em “Configure Global Security” e remova todas as permissões do usuário Anonymous.

Após este processo todo foi criado um novo link dentro do Manage Jenkins.
O novo link é Manage Users (Manage Jenkins -> Manage Users).
Será dentro do Manage Users que você vai criar, editar e remover usuários do Jenkins.

O próximo passo será a criação de projetos e Jobs.

See you.