Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Multi-Environment Git Deployment with CodeIgniter

Multi-Environment Git Deployment with CodeIgniter

A presentation given by Ben Edmunds at CICON 2011 in NYC.

Ben Edmunds

May 09, 2012
Tweet

More Decks by Ben Edmunds

Other Decks in Technology

Transcript

  1. • What is Git? • Distributed Version Control • Why

    use version control? • Change tracking and roll-back • Multi-developer projects • Deployment
  2. • Why use Git? • Branching • Feature branches •

    Environment deployment with branches
  3. • What is Deployment? • Automated update and setup of

    code • Why use deployments? • FTP = nasty • Humans suck • Ease of use
  4. Local Development Setup $ git init $ git remote add

    origin yourRepo.git $ git pull origin master $ git checkout -b staging $ git push origin staging $ git checkout -b production $ git push origin master
  5. Branch Setup $ git checkout -b staging $ git push

    origin staging $ git checkout -b production $ git push origin master
  6. Deployment Code post_receive() { ... } • json_decode($_POST[‘payload’]) • Check

    payload ref against ENV • Execute Git commands to clean and pull the correct branch
  7. Deployment Code function post_receive() { if (isset($_POST['payload']) && !empty($_POST['payload'])) {

    $payload = json_decode($_POST['payload']); //make sure this is the correct environment if ($payload->ref == 'refs/heads/' . ENV) { log_message('debug', 'DEPLOYMENT: Post-receive hook - '. ENV); //reset, clean and pull shell_exec('/usr/bin/git --git-dir="' . ENV_BASE_PATH . '.git" ‘ . ‘--work-tree="' . ENV_BASE_PATH . '" ‘ . ‘reset --hard HEAD'); shell_exec('/usr/bin/git --git-dir="' . ENV_BASE_PATH . '.git" ‘ . ‘--work-tree="' . ENV_BASE_PATH . '" clean -f'); shell_exec('/usr/bin/git --git-dir="' . ENV_BASE_PATH . '.git" ‘ . ‘--work-tree="' . ENV_BASE_PATH . '" ‘ . ‘pull origin ' . ENV); } } }
  8. class Migration_Create_accounts extends Migration { function up() { $this->migrations->verbose AND

    print "Creating table accounts..."; if ( ! $this->db->table_exists('accounts')) { // Setup Keys $this->dbforge->add_key('id', TRUE); $this->dbforge->add_field(array( 'id' => array('type' => 'INT', 'constraint' => 5, 'unsigned' => TRUE, 'auto_increment' => TRUE), 'company_name' => array('type' => 'VARCHAR', 'constraint' => '200', 'null' => FALSE), 'first_name' => array('type' => 'VARCHAR', 'constraint' => '200', 'null' => FALSE), 'last_name' => array('type' => 'VARCHAR', 'constraint' => '200', 'null' => FALSE), 'phone' => array('type' => 'TEXT', 'null' => FALSE), 'email' => array('type' => 'TEXT', 'null' => FALSE), 'address' => array('type' => 'TEXT', 'null' => FALSE), 'Last_Update' => array('type' => 'DATETIME', 'null' => FALSE) )); $this->dbforge->add_field("Created_At TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP"); $this->dbforge->create_table('accounts', TRUE); } } function down() { $this->dbforge->drop_table('accounts'); } } Migrations https://github.com/philsturgeon/codeigniter-migrations
  9. Staging Server Setup $ git init $ git remote add

    origin yourRepo.git $ git pull origin staging
  10. Production Server Setup $ git init $ git remote add

    origin yourRepo.git $ git pull origin production
  11. Pushing to Master $git checkout master $ git commit -am

    ‘Made code change’ $ git push origin master Local Github
  12. Pushing to Staging $ git checkout staging $ git merge

    master $ git push origin staging Local Github Staging
  13. Pushing to Production $ git checkout production $ git merge

    staging $ git push origin production Local Github Production