Separate Datenbank für jeden Zweig
Es ist der einzige Weg zu fliegen.
Update 16. Oktober 2017
Ich bin nach einiger Zeit darauf zurückgekommen und habe einige Verbesserungen vorgenommen:
- Ich habe eine weitere Namespace-Rake-Task hinzugefügt, um einen Zweig zu erstellen und die Datenbank auf einen Schlag zu klonen
bundle exec rake git:branch
.
- Mir ist jetzt klar, dass das Klonen vom Master nicht immer das ist, was Sie tun möchten. Deshalb habe ich expliziter gemacht, dass die
db:clone_from_branch
Aufgabe eine SOURCE_BRANCH
und eine TARGET_BRANCH
Umgebungsvariable enthält. Bei Verwendung git:branch
wird automatisch der aktuelle Zweig als verwendet SOURCE_BRANCH
.
- Refactoring und Vereinfachung.
config/database.yml
Um es Ihnen einfacher zu machen, aktualisieren Sie Ihre database.yml
Datei wie folgt, um den Datenbanknamen basierend auf dem aktuellen Zweig dynamisch zu ermitteln.
<%
database_prefix = 'your_app_name'
environments = %W( development test )
current_branch = `git status | head -1`.to_s.gsub('On branch ','').chomp
%>
defaults: &defaults
pool: 5
adapter: mysql2
encoding: utf8
reconnect: false
username: root
password:
host: localhost
<% environments.each do |environment| %>
<%= environment %>:
<<: *defaults
database: <%= [ database_prefix, current_branch, environment ].join('_') %>
<% end %>
lib/tasks/db.rake
Hier ist eine Rake-Aufgabe, mit der Sie Ihre Datenbank einfach von einem Zweig in einen anderen klonen können. Dies erfordert eine SOURCE_BRANCH
und eine TARGET_BRANCH
Umgebungsvariable. Basierend auf der Aufgabe von @spalladino .
namespace :db do
desc "Clones database from another branch as specified by `SOURCE_BRANCH` and `TARGET_BRANCH` env params."
task :clone_from_branch do
abort "You need to provide a SOURCE_BRANCH to clone from as an environment variable." if ENV['SOURCE_BRANCH'].blank?
abort "You need to provide a TARGET_BRANCH to clone to as an environment variable." if ENV['TARGET_BRANCH'].blank?
database_configuration = Rails.configuration.database_configuration[Rails.env]
current_database_name = database_configuration["database"]
source_db = current_database_name.sub(CURRENT_BRANCH, ENV['SOURCE_BRANCH'])
target_db = current_database_name.sub(CURRENT_BRANCH, ENV['TARGET_BRANCH'])
mysql_opts = "-u #{database_configuration['username']} "
mysql_opts << "--password=\"#{database_configuration['password']}\" " if database_configuration['password'].presence
`mysqlshow #{mysql_opts} | grep "#{source_db}"`
raise "Source database #{source_db} not found" if $?.to_i != 0
`mysqlshow #{mysql_opts} | grep "#{target_db}"`
raise "Target database #{target_db} already exists" if $?.to_i == 0
puts "Creating empty database #{target_db}"
`mysql #{mysql_opts} -e "CREATE DATABASE #{target_db}"`
puts "Copying #{source_db} into #{target_db}"
`mysqldump #{mysql_opts} #{source_db} | mysql #{mysql_opts} #{target_db}`
end
end
lib/tasks/git.rake
Diese Aufgabe erstellt einen Git-Zweig aus dem aktuellen Zweig (Master oder auf andere Weise), checkt ihn aus und klont die Datenbank des aktuellen Zweigs in die Datenbank des neuen Zweigs. Es ist glatter AF.
namespace :git do
desc "Create a branch off the current branch and clone the current branch's database."
task :branch do
print 'New Branch Name: '
new_branch_name = STDIN.gets.strip
CURRENT_BRANCH = `git status | head -1`.to_s.gsub('On branch ','').chomp
say "Creating new branch and checking it out..."
sh "git co -b #{new_branch_name}"
say "Cloning database from #{CURRENT_BRANCH}..."
ENV['SOURCE_BRANCH'] = CURRENT_BRANCH # Set source to be the current branch for clone_from_branch task.
ENV['TARGET_BRANCH'] = new_branch_name
Rake::Task['db:clone_from_branch'].invoke
say "All done!"
end
end
Jetzt müssen Sie nur noch rennen bundle exec git:branch
, den neuen Filialnamen eingeben und Zombies töten.