Como configurar um projeto Django no Jenkins

Português   |   Source

Já estava querendo fazer esse tutorial há bastante tempo, mas estava esperando amadurecer algumas idéias para que a coisa ficasse bem redonda. Para facilitar, esse tutorial subentende que o usuário já conhece Python, Django e sabe como instalar e rodar o Jenkins. Sem enrolar, vamos aos passos do tutorial.

Passo 1 - Instalar os plugins do Jenkins

Esses são os plugins que eu uso para facilitar a configuração do meu ambiente e de quebra, trazer algumas informações úteis sobre os projetos.

Passo 2 - Instalar módulos Python para o projeto Django

Antes de entrar na configuração do projeto Django, precisamos instalar os seguintes módulos no Python:

  • django-jenkis - Essa ferramenta será a mais importante em todo o nosso processo de configuração e irá reduzir extremamente o trabalho e a complexidade em configurar um projeto Django no Jenkins.

  • clonedigger - Usada para encontrar código duplicado no seu projeto, muito útil.

  • coverage.py - Usada para gerar relatórios de cobertura de testes que serão lidos através do plugin Cobertura do Jenkins.

  • pep8, pylint e pyflakes - Essas ferramentas serão usadas para gerar relatórios de análise estática de código Python.

  • nose - Opcional, eu prefiro usar nose para rodar os testes unitários do meu projeto, mas o Django já possui uma biblioteca para rodar testes que é bem interessante.

Passo 3 - Configurar o django-jenkins

Uma vez instalado, para usar o django-jenkins é bem tranquilo. Basta rodar o seguinte comando que foi adicionado ao manage.py do Django.

:::bash
$ python manage.py jenkins

Esse simples comando irá gerar relatórios que serão consumidos pela nossa configuração do Jenkins como veremos mais tarde. Se quiser você pode optar por configurar as tarefas que você deseja que o django-jenkins execute para você. Para isso, é necessário criar a seguinte configuração no seu arquivo settings.py do Django.

:::python
JENKINS_TASKS = (
    'django_jenkins.tasks.with_coverage',
    'django_jenkins.tasks.run_pep8',
    'django_jenkins.tasks.run_pylint',
    'django_jenkins.tasks.run_pyflakes',
    'django_jenkins.tasks.run_jslint',
    'django_jenkins.tasks.run_csslint',
    'django_jenkins.tasks.run_sloccount',
)

Essa é a configuração que eu costumo usar para os projetos da nossa equipe. Para uma lista completa das tarefas, consulte esse link.

IMPORTANTE: Para que as tarefas run_jslint e run_csslint possam funcionar é necessário instalar o rhino ou NODE.js no servidor onde o Jenkins está instalado.

Passo 4 - Configurar o projeto no Jenkins

Para essa parte do tutorial, consideremos que o nome do meu projeto seja ProjetoBlog e que o diretório onde está o código-fonte do projeto é chamado blog. No meu caso, eu uso uma estrutura de projetos do Django em 2 níveis (pretendo escrever um post sobre isso depois), mas você poderá adaptar todos os passos seguintes a estrutura que você usa em seus projetos.

1. Criar o job

Na tela inicial do Jenkins você verá uma opção chamada New Job, ao clicar nela basta preencher o nome desejado para o job e selecionar a opção Build a free-style software project, conforme mostrado na figura abaixo.

Criando o job no Jenkins

2. Configurar o controle de versão

A configuração do controle de versão é extremamente simples, basta selecionar o controle de versão desejado, informar o repositório conforme solicitado e no campo Branches to build informar o branch que você deseja que o Jenkins use como padrão, na maioria absoluta dos casos, é o branch master.

Configurar VCS no Jenkins

3. Buscar atualizações do projeto

Após configurar o repositório do projeto, precisamos informar o intervalo de tempo que queremos que o job do Jenkins verifique se o projeto foi atualizado e em caso positivo rodar um novo build. Usamos para isso o campo Build Triggers. Na figura abaixo, a configuração colocada indica que o repositório será verificado de 5 em 5 minutos.

Build Triggers

4. Processo de build

Agora nesse passo é onde o Jenkins vai realmente realizar o trabalho de build e executar tudo o que planejamos e configuramos anteriormente. Para isso, vamos ter que criar diversos comandos de shell que serão executados em sequência. A figura abaixo mostra isso. Os comandos serão explicados logo abaixo da figura.

Comandos de Build do Jenkins

Comando 1

:::bash
bash -l -c "source /home/jenkins/.virtualenvs/blog/bin/activate && pip install -r requirements.txt"

Esse primeiro comando é usado para atualizar os módulos da aplicação, como eu uso o virtualenv, então ele precisa da primeira parte para rodar o comando sob o ambiente virtual que foi criado.

Comando 2

:::bash
bash -l -c "source /home/jenkins/.virtualenvs/blog/bin/activate && cd blog &&
python manage.py syncdb --noinput && python manage.py migrate && python manage.py jenkins"

Comando para atualizar o banco de dados e também para rodar as tarefas do django-jenkins.

Comando 3

:::bash
bash -l -c "source /home/jenkins/.virtualenvs/blog/bin/activate &&
clonedigger --cpd-output -o ./blog/reports/clonedigger.xml ./blog"

Comando usado para rodar a ferramenta clonedigger com os seus parâmetros e especificar o formato do relatório, esse formato é obrigatório para que ele seja entendido pelo jenkins.

Comando 4

:::bash
bash -l -c "source /home/jenkins/.virtualenvs/blog/bin/activate &&
cd blog && python manage.py test"

Esse último comando é opcional, eu apenas o uso pois como coloquei antes, eu não uso a suíte de testes padrão do Django, mas uso o nose.

5. Configurar o relatório de cobertura de testes

Chegou a hora de configurar o Jenkins para ler os relatórios que foram gerados, vamos começar com o relatório de cobertura de testes gerado pelo coverage.py. Selecione a opção Publish Cobertura Coverage Report e indique o caminho onde foi gravado o arquivo coverage.xml. Vejamos a imagem.

Cobertura Jenkins

6. Configurar o relatório de testes unitários e quantidade de linhas de código

Assim como na configuração anterior, precisamos apenas marcar as opções exibidas abaixo na figura e colocar o caminho para os respectivos relatórios.

JUnit SLOC Jenkins

7. Configurar os relatórios do plugin Violations

Chegamos na última etapa desse tutorial que envolve somente indicar os caminhos para os relatórios de violações que foram resultado das análises estáticas de código Python, Javascript e CSS conforme configuramos no início desse tutorial. Assim como nas opções anteriores, marque a opção Report Violations e coloque os caminhos de acordo com a imagem que é mostrada logo abaixo.

Violations Jenkins

Conclusão

E é isso! Essa é a configuração que precisamos fazer para que um projeto Django use o Jenkins. Depois de tudo isso feito, é só salvar a configuração e clicar no link Build Now e ver os resultados. Seguem alguns exemplos de informações que veremos como resultado, clique nas imagens para ver em tamanho real.

Result1

Result2

Result3

Dicas extras

  • Algo que pode facilitar ainda mais a configuração de um projeto no Jenkins é um plugin chamado ShiningPanda que permite trabalhar com diferentes versões do Python e inclusive usar o virtualenv de maneira mais transparente mas eu nunca testei.

  • Outra dica legal é que existem alguns plugins que podem ser usados para melhorar a aparência do Jenkins. Esse artigo mostra quais são os melhores plugins para fazer isso.

Referências

Mikhail Podgurskiy: django-jenkins Tutorial

Joe Heck: Setting up a Python CI server with Hudson

Gareth Rushgrove: A Continuous Deployment Example Setup

Bartek Ciszkowski: Continuous Integration with Jenkins

In []:
 
Comments powered by Disqus
Share