Concrete Logo
Hamburger button

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

  • Blog
  • 6 de Março de 2015

Neste tutorial 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, em iOS e em .NET, além de alguns posts gerais sobre o assunto, mas hoje vamos finalmente falar sobre integração contínua em Django.

Assumindo que já terminamos esse tutorial, 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!

gato-lendo-livroa

O projeto

Para este tutorial, 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 

* 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

Todos os testes passando! =D

 

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 https://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:

filipe8

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 que o Jenkins deve verificar 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 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

Bonus(!)

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 post está hospedado no bitbucket da Concrete.

Até a próxima!