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:
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
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”:
Na página de plugins, clique na aba “Available” e filtre por “git plugin”:
Selecione o plugin e clique no botão “Download now and install after restart”.
O download do plugin será exibido como a seguir:
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”:
Na página seguinte, selecione a opção “Discard Old Builds” para que os builds mais antigos sejam apagados automaticamente.
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:
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.
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.
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:
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:
Como podem ver, o Jenkins foi ao nosso repositório do Bitbucket, baixou o projeto e rodou os testes:
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?
Com os plugins instalados, o resultado dos builds fica assim:
Build quebrado:
Build ok:
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!