แยกฐานข้อมูลสำหรับแต่ละสาขา
มันเป็นวิธีเดียวที่จะบิน
อัปเดตวันที่ 16 ตุลาคม 2017
ฉันกลับมาที่นี่หลังจากผ่านไประยะหนึ่งและทำการปรับปรุงบางอย่าง:
- ฉันได้เพิ่มงานคราดเนมสเปซอื่นเพื่อสร้างสาขาและโคลนฐานข้อมูลในคราวเดียวด้วย
bundle exec rake git:branch
.
- ตอนนี้ฉันรู้แล้วว่าการโคลนนิ่งจากต้นแบบไม่ใช่สิ่งที่คุณต้องการทำเสมอไปดังนั้นฉันจึงทำให้ชัดเจนมากขึ้นว่า
db:clone_from_branch
งานต้องใช้SOURCE_BRANCH
และTARGET_BRANCH
ตัวแปรสภาพแวดล้อม เมื่อใช้งานgit:branch
จะใช้สาขาปัจจุบันเป็นไฟล์SOURCE_BRANCH
.
- การปรับโครงสร้างและการทำให้เข้าใจง่าย
config/database.yml
และเพื่อให้ง่ายขึ้นสำหรับคุณนี่คือวิธีที่คุณอัปเดตdatabase.yml
ไฟล์เพื่อกำหนดชื่อฐานข้อมูลแบบไดนามิกตามสาขาปัจจุบัน
<%
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
นี่คืองาน Rake เพื่อโคลนฐานข้อมูลของคุณจากสาขาหนึ่งไปยังอีกสาขาหนึ่งได้อย่างง่ายดาย สิ่งนี้ใช้ตัวแปรSOURCE_BRANCH
และTARGET_BRANCH
สภาพแวดล้อม ตามออกของ@spalladinoงาน 's
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
งานนี้จะสร้างสาขา git จากสาขาปัจจุบัน (หลักหรืออื่น ๆ ) ตรวจสอบและโคลนฐานข้อมูลของสาขาปัจจุบันลงในฐานข้อมูลของสาขาใหม่ เป็น 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
ตอนนี้สิ่งที่คุณต้องทำคือเรียกใช้bundle exec git:branch
ป้อนชื่อสาขาใหม่และเริ่มฆ่าซอมบี้