Skip to content

Instantly share code, notes, and snippets.

@saimonmoore
Forked from defunkt/gist:4169
Created September 3, 2008 09:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save saimonmoore/8563 to your computer and use it in GitHub Desktop.
Save saimonmoore/8563 to your computer and use it in GitHub Desktop.
# by bryan helmkamp with slight modification by chris wanstrath
# and a bit of refactoring by saimon moore
# from http://www.brynary.com/2008/8/3/our-git-deployment-workflow
module GitCommands
extend self
def diff_staging
execute('git fetch')
puts `git diff origin/production origin/staging`
end
def tag_staging(branch_name)
verify_working_directory_clean
execute(
'git fetch',
'git branch -f staging origin/staging',
'git checkout staging',
"git reset --hard origin/#{branch_name}",
'git push -f origin staging',
'git checkout master',
'git branch -D staging')
end
def tag_production
verify_working_directory_clean
execute(
'git fetch',
'git branch -f production origin/production',
'git checkout production',
'git reset --hard origin/staging',
'git push -f origin production',
'git checkout master',
'git branch -D production')
end
def branch_production(branch_name)
verify_working_directory_clean
execute(
'git fetch',
'git branch -f production origin/production',
'git checkout production',
"git branch #{branch_name}",
"git checkout #{branch_name}",
"git push origin #{branch_name}")
end
protected
def verify_working_directory_clean
return if `git status` =~ /working directory clean/
raise "Must have clean working directory"
end
def execute(*commands)
commands.each do |command|
puts "Executing: '#{command}'"
raise "Command failed!" unless system(command)
end
end
end
namespace :tag do
desc <<-DESC
Update the staging branch to prepare for a staging deploy.
Defaults to master. Optionally specify a BRANCH=name
DESC
task :staging, :branch do |t, args|
branch_name = args.branch || ENV['BRANCH'] || "master"
GitCommands.tag_staging(branch_name)
end
desc "Update the remove production branch to prepare for a release"
task :production => ['diff:staging'] do
GitCommands.tag_production
end
end
namespace :diff do
desc "Show the differences between the staging branch and the production branch"
task :staging do
GitCommands.diff_staging
end
end
namespace :branch do
desc "Branch from production for tweaks or bug fixs. Specify BRANCH=name"
task :production, :branch do |t, args|
branch_name = args.branch || ENV['BRANCH']
raise "You must specify a branch name using BRANCH=name" unless branch_name
GitCommands.branch_production(branch_name)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment