Coucou !

Benjamin Clay

Expert Web et Symfony & éleveur de licorne

@ternel

Joel Wurtz

Expert Web & tueur de licorne

@joelwurtz


Mais ça marche chez moi !

AFUP - PHP Tour Nantes - Edition 2012

Cette conférence n'est pas une conférence sur le cyclimse.

#Fail

#Fail

Sources

Sources

La question : Comment est-ce que tu gères tes sources ?

Les réponses :

  • FTP
  • SCP
  • Emails

Sources : Outils

Bien :

Sources : Outils

Mieux :

Sources : Outils

   

Sources : Outils

Code review :

Les gestionnaires de sources c'est bien !

Savoir organiser son projet avec c'est mieux !

Branche !

One branch to rule them all!

  • Petits projets
  • Simple, rapide
  • Quickfix impossible
  • Aucune séparation des devs

Branches !

Une branche de dev / Une branche de release

  • Moyens projets
  • Simple, moins rapide
  • Quickfix
  • Aucune séparation des devs

Branchesssssss !

n-branches

  • Gros projets
  • Quickfix
  • Séparation des devs
  • Demande une trés bonne organisation

Branchesssssss !

Un peu d'organisation !

Recap.

  • Utiliser Git (ou autre)
  • Utiliser GitHub / GitLab (ou autre)
  • Choisir l'utilisation des branches selon votre projet

Environnements

Environnements

La question : Quels sont tes environnements ?

La réponse :

  • Production
  • Pré-Production
  • Recette
  • Dev' distant
  • Dev' local

Environnements

Son dev distant :

Environnements

Environnements

Sa recette :

Environnements

Environnements

Sa preprod :

Environnements

Environnements

Avons-nous besoin d'autant d'environnements ?

Développement

Obligatoire en local, distant si besoin

Recette

Permet de combiner et valider le travail de toute l'équipe de dev

Pre-production

Doit être la réplique quasi-exacte de la production, permet de simuler la production

Production

Un peu obligatoire, non ?

Environnements

Le nombre d'environnement dépend du projet

Il faut les maintenir, sinon ils sont inutiles

Livraison

Livraison

La question : Comment est-ce que tu livre ?

La réponse :

  • A la main

Livraison

Cycle de livraison le plus court possible

  • Meilleur contrôle
  • Plus d'expérience
  • Réduit les problèmes, le stress

Livraison

Documentation

  • Simple à faire
  • Pas normalisé
  • Lourd à maintenir
  • Rapidement obsolète

Livraison

Scripts shell

  • Automatisation
  • Assez simple
  • Assez limité

Livraison

Capistrano

  • Ruby / Open-Source
  • Nombreuses tâches disponibles et possibilité de surcharge
  • Capifony : Surcharge pour les projets SF/SF2
  • Murder : livraison par torrent

Livraison

Capistrano

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
					

Livraison

Fabric

  • Python / Open-Source
  • Makefile amélioré, gestion ssh
  • On doit écrire ses scripts

Livraison

Fabric

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

Livraison propre et similaire sur tous vos serveurs

MAIS

Problème de livraison == 90% du temps problème de config !

Livraison et configuration

Documentation

  • Facile. Au début.
  • Aucune normalisation
  • Rarement maintenue

Livraison et configuration

Configuration management tools

  • Déploiement des configurations sur différentes machines
  • Synchronisation entre tous nos serveurs
  • Normalisation de nos configurations

Livraison et configuration

Puppet - Ruby

CF Engine - C

Chef - Ruby

Fonctionnement général

  • Des scripts
  • Un maitre
  • Des esclaves

Chef

Vos premiers pas

Vagrantfile

# -*- 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

Chef Cookbook

Cookbooks

  • Recettes
  • Attributs
  • Templates
  • ...

Chef Cookbook

Exemple

`-- cookbooks
    `-- php
       |-- recipes
       |    `-- default.rb
       |-- attributes
       |    `-- default.rb
       `-- templates
           `-- default
               `-- php.ini.erb
                    

Chef

Une recette défini comment installer un logiciel

package "php"

Chef : Recette

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

Chef : Templates

Un template est un fichier de configuration à mettre en place sur les serveurs

Chef : Templates

Exemple

...

expose_php = On

;;;;;;;;;;;;;;;;;;;
; Resource Limits ;
;;;;;;;;;;;;;;;;;;;

max_execution_time     = <%= @config['max_execution_time'] %>
max_input_time         = 60
memory_limit           = <%= @config['memory_limit'] %>

...

Chef : Attributs

Les attributs sont toutes les valeurs configurables entres nos différents environnements (un chemin, une valeur dans php.ini, etc ...)

Chef : Attributs

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"

Chef

Bien d'autres notions ...

  • Rôles
  • Data bags
  • Défintions
  • .....

Chef

Allez y et ne reinventer pas la roue !

  • Un peu complexe, mais tellement bien
  • Chef community
  • Cookbooks sur github

Conclusion

  • Utilisez un gestionnaire de version et de suivi de projet
  • Organisez vos développements
  • Automatisez vos livraisons et jouez les souvent
  • Automatisez et normalisez la configuration de vos serveurs

Merci !

Des questions ?

http://ternel.net/chezmoicamarche

http://github.com/jolicode/ca-marche-chez-moi

  • Benjamin Clay - @ternel
  • Joel Wurtz - @joelwurtz
  • JoliCode - @jolicode