Base de données distincte pour chaque succursale
C'est la seule façon de voler.
Mise à jour 16 octobre 2017
J'y suis revenu après un certain temps et j'ai apporté quelques améliorations:
- J'ai ajouté une autre tâche de râteau d'espace de noms pour créer une branche et cloner la base de données d'un seul coup, avec
bundle exec rake git:branch
.
- Je me rends compte maintenant que le clonage à partir de master n'est pas toujours ce que vous voulez faire, alors j'ai précisé que la
db:clone_from_branch
tâche prend une variable d'environnement SOURCE_BRANCH
et une TARGET_BRANCH
. Lors de son utilisation, git:branch
il utilisera automatiquement la branche actuelle comme fichier SOURCE_BRANCH
.
- Refactoring et simplification.
config/database.yml
Et pour vous faciliter la tâche, voici comment mettre à jour votre database.yml
fichier pour déterminer dynamiquement le nom de la base de données en fonction de la branche actuelle.
<%
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
Voici une tâche Rake pour cloner facilement votre base de données d'une branche à une autre. Cela prend une SOURCE_BRANCH
et une TARGET_BRANCH
variables d'environnement. Basé sur la tâche de @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
Cette tâche créera une branche git hors de la branche actuelle (maître ou autre), la récupérera et clonera la base de données de la branche actuelle dans la base de données de la nouvelle branche. C'est AF lisse.
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
Maintenant, tout ce que vous avez à faire est de courir bundle exec git:branch
, entrez le nouveau nom de branche et commencez à tuer des zombies.