環境:
ubuntu 14.04
mina 0.3
rails 4.1.4
(其他參考上一篇文章設定環境)
以後操作流程:
- 安裝mina gem
- 指定專案使用的ruby版本
- mina init (初始化)
- 修改deploy.rb文件
- mina setup (創建環境)
- mina deploy (部署)
- 設定nginx vhost (參考上一篇文章)
- 重啟nginx server
實際操作:
1. 安裝gem
gem 'mina'
2. 初始化
$ mina init
3. 指定專案使用的ruby版本
$ rbenv local 2.1.2
$ rbenv rehash
$ git add .
$ git commit -m “xxxx”
4. 修改deploy.rb
require 'mina/bundler' require 'mina/rails' require 'mina/git' require 'mina/rbenv' # for rbenv support. (http://rbenv.org) set :domain, 'rails4.coolsea.net' set :deploy_to, '/home/apps/my_project/rails4' set :repository, 'git@github.com:coolsea/coolsea-store.git' set :branch, 'master' # Manually create these paths in shared/ (eg: shared/config/database.yml) in your server. # They will be linked in the 'deploy:link_shared_paths' step. set :shared_paths, ['config/database.yml', 'log'] # Optional settings: set :user, 'apps' # Username in the server to SSH to. task :environment do # If you're using rbenv, use this to load the rbenv environment. # Be sure to commit your .rbenv-version to your repository. invoke :'rbenv:load' # For those using RVM, use this to load an RVM version@gemset. # invoke :'rvm:use[ruby-1.9.3-p125@default]' end ########################################################################## # # Create new host tasks # Tasks below are related to deploying a new version of the application # ########################################################################## # Function extracted from http://blog.nicolai86.eu/posts/2013-05-06/syncing-database-content-down-with-mina # allowing to read the content of the database.yml file RYAML = <<-BASH function ryaml { ruby -ryaml -e 'puts ARGV[1..-1].inject(YAML.load(File.read(ARGV[0]))) {|acc, key| acc[key] }' "$@" }; BASH # Put any custom mkdir's in here for when `mina setup` is ran. # For Rails apps, we'll make some of the shared paths that are shared between # all releases. task :setup => :environment do queue! %[mkdir -p "#{deploy_to}/shared/log"] queue! %[chmod g+rx,u+rwx "#{deploy_to}/shared/log"] queue! %[mkdir -p "#{deploy_to}/shared/config"] queue! %[chmod g+rx,u+rwx "#{deploy_to}/shared/config"] queue! %[touch "#{deploy_to}/shared/config/database.yml"] queue %[echo "-----> Be sure to edit 'shared/config/database.yml'."] invoke :'setup:db:database_yml' end # Populate file database.yml with the appropriate rails_env # Database name and user name are based on convention # Password is defined by the user during setup desc "Populate database.yml" task :'setup:db:database_yml' => :environment do puts "Enter a name for the new database" db_name = STDIN.gets.chomp puts "Enter a user for the new database" db_username = STDIN.gets.chomp puts "Enter a password for the new database" db_pass = STDIN.gets.chomp # Virtual Host configuration file database_yml = <<-DATABASE.dedent #{rails_env}: adapter: mysql2 encoding: utf8 database: #{db_name} username: #{db_username} password: #{db_pass} host: localhost timeout: 5000 DATABASE queue! %{ echo "-----> Populating database.yml" echo "#{database_yml}" > #{deploy_to!}/shared/config/database.yml echo "-----> Done" } invoke :'setup:db' end # Create the new database based on information from database.yml # In this application DB, user is given full access to the new DB desc "Create new database" task :'setup:db' => :environment do queue! %{ echo "-----> Import RYAML function" #{RYAML} echo "-----> Read database.yml" USERNAME=$(ryaml #{deploy_to!}/#{shared_path!}/config/database.yml #{rails_env} username) PASSWORD=$(ryaml #{deploy_to!}/#{shared_path!}/config/database.yml #{rails_env} password) DATABASE=$(ryaml #{deploy_to!}/#{shared_path!}/config/database.yml #{rails_env} database) echo "-----> Create SQL query" Q1="CREATE DATABASE IF NOT EXISTS $DATABASE;" Q2="GRANT USAGE ON *.* TO $USERNAME@localhost IDENTIFIED BY '$PASSWORD';" Q3="GRANT ALL PRIVILEGES ON $DATABASE.* TO $USERNAME@localhost;" Q4="FLUSH PRIVILEGES;" SQL="${Q1}${Q2}${Q3}${Q4}" echo "-----> Execute SQL query to create DB and user" echo "-----> Enter MySQL root password on prompt below" #{echo_cmd %[mysql -uroot -p -e "$SQL"]} echo "-----> Done" } end desc "Deploys the current version to the server." task :deploy => :environment do deploy do # Put things that will set up an empty directory into a fully set-up # instance of your project. invoke :'git:clone' invoke :'deploy:link_shared_paths' invoke :'bundle:install' invoke :'rails:db_migrate' invoke :'rails:assets_precompile' end end task :restart do queue 'sudo service nginx restart' end ######################################################################### # # Libraries # ########################################################################## # # See https://github.com/cespare/ruby-dedent/blob/master/lib/dedent.rb # class String def dedent lines = split "\n" return self if lines.empty? indents = lines.map do |line| line =~ /\S/ ? (line.start_with?(" ") ? line.match(/^ +/).offset(0)[1] : 0) : nil end min_indent = indents.compact.min return self if min_indent.zero? lines.map { |line| line =~ /\S/ ? line.gsub(/^ {#{min_indent}}/, "") : line }.join "\n" end end
修改
set :domain
set :deploy_to
set :repository
set :shared_paths, [‘config/database.yml’, ‘log’, ‘config/config.yml’, ‘config/secrets.yml’]
#註:把不能git的檔案,手動先增到伺服器的shared資料夾裡,然後把路徑添加在這裡。
5. 創建環境
$ mina setup
6. 部署
$ mina deploy
$ mina restart (重啟nginx server)