Expert Web et Symfony & éleveur de licorne
@ternel
Expert Web & tueur de licorne
@joelwurtz
Cette conférence n'est pas une conférence sur le cyclimse.
La question : Comment est-ce que tu gères tes sources ?
Les réponses :
Bien :
Mieux :
Code review :
Savoir organiser son projet avec c'est mieux !
La question : Quels sont tes environnements ?
La réponse :
Son dev distant :
Sa recette :
Sa preprod :
La question : Comment est-ce que tu livre ?
La réponse :
Cycle de livraison le plus court possible
Exemple
# Port
`-- /var/www/my-app.com
|-- current → /var/www/my-app.com/releases/20100512131539
|-- releases
| `-- 20100512131539
| `-- 20100509150741
| `-- 20100509145325
`-- shared
|-- web
| `-- uploads
|-- log
`-- config
`-- databases.yml
Exemple de config
def deploy():
with cd('%s' % env.srvdir):
run('git checkout %s' % env.git_branch)
run('git pull')
run('%s composer.phar self-update' % env.php)
run('%s composer.phar install' % env.php)
run('%s app/console cache:clear --env=prod --no-debug' % env.php)
local('app/console assets:install --symlink --env=prod --no-debug web/')
local('app/console assetic:dump --env=prod --no-debug')
put('web/css/compiled/*', 'web/css/compiled/')
Livraison propre et similaire sur tous vos serveurs
MAIS
Problème de livraison == 90% du temps problème de config !
Vos premiers pas
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant::Config.run do |config|
config.vm.box = "ubuntu"
config.vm.network :hostonly, "192.168.33.100"
config.vm.forward_port 80, 8080
config.vm.provision :chef_solo do |chef|
#Chemin vers les cookbooks
chef.cookbooks_path = "/Users/ternel/Sites/tools/cookbook-test/cookbooks"
#Chemin vers les rôles
chef.roles_path = "/Users/ternel/Sites/tools/cookbook-test/roles"
#Checmin vers les data bags
chef.data_bags_path = "/Users/ternel/Sites/tools/cookbook-test/data_bags"
chef.add_recipe "chef-php::php"
end
end
Cookbooks
Exemple
`-- cookbooks
`-- php
|-- recipes
| `-- default.rb
|-- attributes
| `-- default.rb
`-- templates
`-- default
`-- php.ini.erb
package "php"
Exemple
pkgs = value_for_platform(
%w(centos redhat scientific fedora) => {
%w(5.0 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8) => %w(php53 php53-devel php53-cli),
'default' => %w(php php-devel php-cli)
},
[ "debian", "ubuntu" ] => {
"default" => %w{ php5-cgi php5 php5-dev php5-cli}
},
"default" => %w{ php5-cgi php5 php5-dev php5-cli}
)
pkgs.each do |pkg|
package pkg do
action :install
end
end
template "#{node['php']['conf_dir']}/php.ini" do
source "php.ini.erb"
owner "root"
group "root"
mode "0644"
end
Un template est un fichier de configuration à mettre en place sur les serveurs
Exemple
...
expose_php = On
;;;;;;;;;;;;;;;;;;;
; Resource Limits ;
;;;;;;;;;;;;;;;;;;;
max_execution_time = <%= @config['max_execution_time'] %>
max_input_time = 60
memory_limit = <%= @config['memory_limit'] %>
...
Les attributs sont toutes les valeurs configurables entres nos différents environnements (un chemin, une valeur dans php.ini, etc ...)
Exemple
case node["platform_family"]
when "rhel", "centos"
default['php']['conf_dir'] = '/etc'
default['php']['ext_conf_dir'] = '/etc/php.d'
when "debian", "ubuntu"
default['php']['conf_dir'] = '/etc/php5/cli'
default['php']['ext_conf_dir'] = '/etc/php5/conf.d'
else
default['php']['conf_dir'] = '/etc/php5/cli'
default['php']['ext_conf_dir'] = '/etc/php5/conf.d'
end
default['php']['config']['date.timezone'] = "Europe/Paris"
default['php']['config']['max_execution_time'] = "-1"
default['php']['config']['memory_limit'] = "-1"
Bien d'autres notions ...
Allez y et ne reinventer pas la roue !
http://ternel.net/chezmoicamarche
http://github.com/jolicode/chezmoicamarche