radar parlamentar

Gerência de Configuração de Software

tecnologias utilizadas

  • FABRIC
  • CHEF
  • JENKINS
  • SONARQUBE

Resultados

receita de deploy do radar

Criação de usuário

default.rb

template "#{repo_folder}/radar_parlamentar/create_user.py" do
  mode '777'
  owner user
  group user
  source "create_user.py.erb"
  variables({
    :user => 'radar',
    :password => node['radar']['database_user_password']
  })
end

execute "create_user" do
  command "#{venv_folder}/bin/python create_user.py"
  environment ({"DJANGO_SETTINGS_MODULE" => "settings.production"})
  cwd "#{repo_folder}/radar_parlamentar/"
  user user
  group user
  action :run
end
create_user.py.erb

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings.defaults")
from django.contrib.auth.models import User

if __name__ == "__main__":
    try:
        user = User.objects.create_user('<%= @user %>', '', '<%= @password %>')
        user.is_staff = True
        user.is_superuser = True
        user.save()
    except:
        pass

Importação dos dados

default.rb

template "#{home}/importar_dados.sh" do
  mode '777'
  owner user
  group user
  source "importar_dados.sh.erb"
  variables({
    :user => 'radar',
    :password => node['radar']['database_user_password'],
    :server_user => node['radar']['user']
  })
end

execute "importar_dados" do
  command "sh importar_dados.sh"
  cwd "#{home}"
  user user
  group user
  action :run
end
importar_dados.sh.erb

touch /home/<%= @server_user %>/cookies.txt

LOGIN_URL=http://localhost/admin/
USERNAME='<%= @user %>'
PASSWORD='<%= @password %>'
COOKIES=/home/<%= @server_user %>/cookies.txt
CURL_BIN="curl -s -c $COOKIES -b $COOKIES -e $LOGIN_URL"

$CURL_BIN $LOGIN_URL > /dev/null
DJANGO_TOKEN="csrfmiddlewaretoken=$(grep csrftoken $COOKIES | sed 's/^.*csrftoken\s*//')"

$CURL_BIN \
-d "$DJANGO_TOKEN&username=$USERNAME&password=$PASSWORD&next=/admin/" \
-X POST $LOGIN_URL

$CURL_BIN \
-d "$DJANGO_TOKEN&..." \
-X POST http://localhost/importar/cdep/

rm $COOKIES

Resultados

receita jenkins

Configuração do jenkins

jenkins.rb

xml_radar = File.join(Chef::Config[:file_cache_path], 'jobRadar_config.xml')

template xml_radar do
  source 'jobRadar_config.xml.erb'
  variables ({
    :venv_folder => venv_folder
  })
end


jenkins_job 'build_radar' do
  config xml_radar
  action :create
end
jenkins.rb

xml_chef = File.join(Chef::Config[:file_cache_path], 'jobChef_config.xml')

template xml_chef do
  source 'jobChef_config.xml.erb'
  variables ({
    :home => home,
    :venv_folder => venv_folder
  })
end

python_pip "fabric" do
  virtualenv "#{venv_folder}"
end

template "#{home}/fabfile.py" do
  source "fabfile.py.erb"
  variables ({
    :user => user,
    :password => password,
    :home => home
  })
end

jenkins_job 'deploy_radar' do
  config xml_chef
  action :create
end

jenkins_command "safe-restart" 

xml de configuração do job

jobChef_config.xml.erb

<?xml version='1.0' encoding='UTF-8'?>
<project>
    <actions/>
    <description></description>
    <keepDependencies>false</keepDependencies>
    <properties/>
    <scm class="hudson.scm.NullSCM"/>
    <canRoam>true</canRoam>
    <disabled>false</disabled>
    <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
    <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
    <triggers/>
    <concurrentBuild>false</concurrentBuild>
    <builders>
        <hudson.tasks.Shell>
        <command>
        bash -l -c "source <%= @venv_folder %>/bin/activate 
&& fab -f <%= @home %>/fabfile.py localhost deploy "</command>
        </hudson.tasks.Shell>
    </builders>
    <publishers/>
    <buildWrappers/>
</project>

resultados

receita sonar

configuração do sonar

sonar.rb

package "openjdk-7-jdk" do
  action :install
end

postgresql_database 'sonar' do
  connection(
    :host => 'localhost',
    :port => 5432,
    :username => 'postgres',
    :password => node['postgresql']['password']['postgres']
  )
  template 'DEFAULT'
  encoding 'DEFAULT'
  tablespace 'DEFAULT'
  connection_limit '-1'
  owner 'postgres'
  action :create
end

postgresql_database_user node["sonar"]["user"] do
  connection postgresql_connection_info
  password node["sonar"]["password"]
  action :create
end
sonar.rb

template "/opt/sonarqube-4.4/conf/sonar.properties" do
  mode '0644'
  source "sonar.properties.erb"
  variables({
    :user => node["sonar"]["user"],
    :password => node["sonar"]["password"],
    :port => node["sonar"]["port"]
  })
end

remote_file "/opt/sonarqube-4.4/extensions/plugins/sonar-python-plugin-1.3.jar" do
  source "http://repository.codehaus.org/org/codehaus/sonar-plugins/python/sonar-python
-plugin/1.3/sonar-python-plugin-1.3.jar"
  action :create_if_missing
end

remote_file "#{home}/sonar-runner.zip" do
  source "http://repo1.maven.org/maven2/org/codehaus/sonar/runner/sonar-runner-dist/
2.4/sonar-runner-dist-2.4.zip"
  action :create_if_missing
end

execute "unzip sonnar-runnser" do
  command "unzip -u sonar-runner.zip -d /opt/"
  cwd "#{home}"
  action :run
end
sonar.properties.erb

sonar.jdbc.username=<%= @user %>
sonar.jdbc.password=<%= @password %>

sonar.jdbc.url=jdbc:postgresql://localhost/sonar

sonar.jdbc.maxActive=20
sonar.jdbc.maxIdle=5
sonar.jdbc.minIdle=2
sonar.jdbc.maxWait=5000
sonar.jdbc.minEvictableIdleTimeMillis=600000
sonar.jdbc.timeBetweenEvictionRunsMillis=30000

sonar.web.port: <%= @port %>
sonar.notifications.delay=60
sonar-runner.sh.erb

#!/bin/bash
find . -type f -name "*.pyc" -exec rm -rf "{}" \;

source <%= @venv %>/bin/activate
<%= @coverage %> erase
<%= @coverage %> run --source='.' manage.py test modelagem analises exportadores
importadorInterno importadores testes_integracao
<%= @coverage %> xml -o sonar/reports/coverage.xml

sudo /opt/sonar-runner-2.4/bin/sonar-runner

dificuldades encontradas

dificuldades encontradas

  • Travis CI
    • Manter senha especificada no repositório.
    • Executar comandos com sudo localmente.
  • Diferenças entre versões do Chef
    • Receita inicial utilizando Chef v10.
    • Necessidade de utilizar alguns cookboks incompatíveis.
  • Configurações de jobs no Jenkin
    • "Permission denied".
  • Integração Vagrant + Chef
    • Receita atualizada para a versão 11 do Chef.

Obrigado :)

Radar-GCS-EntregaFinal

By Matheus Fernandes

Radar-GCS-EntregaFinal

  • 386