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.

Avatar for Ben Edmunds

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