Back-End

31 mar, 2015

Montando um serviço de integração contínua para um projeto Django no Jenkins

Publicidade

Neste artigo, vamos fazer uma demonstração de como incluir um projeto Django em Integração Contínua utilizando o Jenkins. Já falamos bastante sobre integração contínua em Android, iOS e .NET, além de alguns artigos gerais sobre o assunto. Mas hoje vamos, finalmente, falar sobre integração contínua em Django.

Assumindo que já terminamos esse artigo, vamos colocar o Jenkins para efetuar os testes da nossa aplicação sempre que um novo commit for enviado para o repositório.

Então, mãos à obra!

O projeto

Hoje vamos utilizar como projeto o tutorial oficial do site do Django para a versão 1.7, pois ele já tem uns testes unitários para servir de exemplo.

Instalação do projeto

Para baixar o projeto, faça um git clone:

git clone https://bitbucket.org/suporte_concrete/cs-django-jenkins.git

Em seguida, crie um virtualenv para o projeto:

virtualenv ~/projetos/virtualenvs/blog

Ative o virtualenv:

source ~/projetos/virtualenvs/blog/bin/activate

Obs.: O que é Virtualenv? Ferramenta utilizada para criar ambientes isolados. Assim, você pode instalar os pacotes do seu projeto sem interferir nos pacotes instalados no escopo global do sistema operacional. Para saber mais, visite esse site.

Instale os requirements do projeto:

pip install -r requirements.txt

Agora que já temos o nosso virtualenv com os pacotes necessários, vamos rodar um comando que irá efetuar as migrations:

python manage.py migrate

Feito isso, agora podemos rodar nosso projeto.

Rodando o projeto localmente

Para rodar o projeto na máquina, execute:

python manage.py runserver

Importante: este comando deve ser usado somente em ambiente de desenvolvimento local. Para rodar em produção devem ser utilizados outros serviços, como apache + modwsgi, gunicorn + nginx, entre outros.

Rodando os testes

Para rodar os testes, execute:

python manage.py test

O resultado deverá ser o seguinte:

filipe1

Agora que já sabemos como preparar o projeto e executar os testes, vamos instalar o Jenkins na máquina de integração contínua.

Preparando a máquina

Instalação das dependências

Precisamos instalar alguns pacotes para que o Jenkins consiga montar o ambiente e fazer os builds. Instale os seguintes pacotes com o apt-get:

sudo apt-get install -y git python-pip python-virtualenv

Instalando o Jenkins

O primeiro passo é instalar o Jenkins na máquina. Como estamos utilizando no exemplo uma máquina Ubuntu, conseguimos instalá-lo facilmente com o comando apt-get: 

# Adicione a chave do repositório do Jenkins
wget -q -O – https://jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add –
 sudo sh -c ‘echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list’
 sudo apt-get update
 sudo apt-get install jenkins

Após a instalação, verifique se o serviço está rodando com o comando:

sudo service jenkins status

Caso o serviço esteja rodando, o resultado será este:

Jenkins Continuous Integration Server is running with the pid XXX

Para iniciar o serviço, execute:

sudo service jenkins start

Agora já podemos acessar o Jenkins na porta 8080 da máquina que instalamos (nesse caso, na minha própria máquina). Vamos acessar o endereço localhost:8080

filipe2

Dependências

Por padrão, o Jenkins não permite acessar repositórios Git. Por isso, vamos precisar instalar um plugin do Git no Jenkins. Acesse o Jenkins na porta 8080, clique na opção “Manage Jenkins” e, na página seguinte, escolha a opção “Manage Plugins”:

filipe3

Na página de plugins, clique na aba “Available” e filtre por “git plugin”:

filipe4

Selecione o plugin e clique no botão “Download now and install after restart”.

O download do plugin será exibido como a seguir:

filipe5
Nota: Caso a página não responda depois de um tempo, acesse a home novamente, pois a instalação já pode ter sido concluída.

Configurando o nosso Job

Agora que já temos no nosso servidor o Jenkins e o Git instalados, precisamos configurar o job para que o Jenkins consulte nosso repositório.

Configurações iniciais

Na página inicial, clique no link “New Item” para criar um novo Job. Preencha o nome do Job e selecione a opção “Freestyle project”:

filipe6

Na página seguinte, selecione a opção “Discard Old Builds” para que os builds mais antigos sejam apagados automaticamente.

filipe7

Acesso ao repositório

Essa parte é vital. Nela, vamos selecionar o tipo de repositório, endereço, qual branch buscar por padrão etc. Como nosso projeto está no bitbucket da Concrete, selecione a opção Git. Em seguida, insira a URL para o repositório:

Importante: a URL no exemplo é pública, então não é necessária nenhuma permissão especial para acessar. Em um projeto privado, é necessário configurar uma chave ssh na máquina com permissão para que o Jenkins consiga acessar o repositório.
Importante: a URL no exemplo é pública, então não é necessária nenhuma permissão especial para acessar. Em um projeto privado, é necessário configurar uma chave ssh na máquina com permissão para que o Jenkins consiga acessar o repositório.

Gatilho para o Build – Build Triggers

Aqui podemos configurar a periodicidade com que o Jenkins deve verificar as alterações no servidor. No nosso caso, escolhi que ele consulte o repositório a cada 15 minutos. Caso exista alguma mudança, ele vai baixar a nova versão e testar.

filipe9

Build

Depois de baixar a versão mais nova, só precisamos conseguir rodar o código pra validar. Para isso, vamos inserir uma etapa na parte de build. Para configurar, vamos adicionar um shell script.

filipe10

Depois de escrito, nosso script ficou assim:

#!/bin/bash

export WORKSPACE=pwd

# Create/Activate virtualenv

virtualenv venv

source venv/bin/activate

# Install Requirements

pip install -r requirements.txt

# Run tests

python manage.py test

Para concluir, salve a configuração.

Será que está funcionando?

Vamos forçar um novo build clicando no botão Build Now:

filipebuildnow

Podemos acompanhar o andamento do build na barra lateral ou clicar no link do número do build para ver o andamento com mais detalhes:

filipe11

Como podem ver, o Jenkins foi ao nosso repositório do Bitbucket, baixou o projeto e rodou os testes:

filipe12

applause

Bônus(!)

Vamos instalar estes plugins: “Green Balls” e “ChuckNorris Plugin”, porque um indicador verde é muito melhor para indicar um sucesso do que um azul. Já o Chuck Norris, bem… Quem melhor pra nos convencer a não quebrar um build do que ele?

filipe13

Com os plugins instalados, o resultado dos builds fica assim:

Build quebrado:

filipe14

Build ok:

filipe15

Bom, é isso! Espero que tenham curtido e caso tenham alguma dúvida, postem nos comentários ou entrem em contato comigo pelo twitter: @filipecm.

Lembrando que o projeto utilizado no artigo está hospedado no bitbucket da Concrete.

Até a próxima!