介紹 Capistrano

deploy manage
deploy rollback

with ci system

manual deplay

進化

automatic deploy

部署要做的事

  • 備份 / 更新資料庫

  • 更新程式碼

  • 更新設定檔

  • 例行性指令

    • 重啟 service

    • 清除 cache

Tool

  • Ansible

  • Chef

  • Capitrano

What is Capistrano?

Capistrano

require 'capistrano/setup'
require 'capistrano/deploy'
require 'capistrano/bundler'
require 'capistrano/rails/migrations'
require 'capistrano/rails/assets'

常見用途

  • automated configuration manage

  • database migration

  • etc...

more detail...

Stages

  • dev

  • QA

  • Staging

  • Production

execute different stage

cap dev deploy
cap sandbox deploy
cap production deploy

Server manage

# server-based syntax
# ======================
server 'dev.horidashi.com', user: 'ubuntu', roles: %w{app db web}, primary: true
# server 'example.com', user: 'deploy', roles: %w{app web}, other_property: :other_value
# server 'db.example.com', user: 'deploy', roles: %w{db}

Role manage

# role-based syntax
# ==================
role :app, %w{ubuntu@dev.horidashi.com}
role :web, %w{ubuntu@dev.horidashi.com}
role :db,  %w{ubuntu@dev.horidashi.com}
set :default_env, { path: "/home/ubuntu/.nvm/versions/node/v4.4.7/bin/:$PATH" }

# Default value for keep_releases is 5
# set :keep_releases, 5
set :keep_releases, 10

namespace :setup do

  desc "Upload config file."
  task :upload_config do
    on roles(:app) do
      execute "mkdir -p #{shared_path}/config"
      upload! StringIO.new(File.read("config/database.yml")), "#{shared_path}/config/database.yml"
    end
  end

end

config/deploy.rb

namespace :deploy do

  task :restart do
    on roles(:web) do
      site_dir = "#{current_path}";
      within site_dir do
        puts capture(:env)
        puts capture(:npm, 'i')
        puts capture(:bower, 'i')
        puts capture(:grunt, 'build')
        puts capture(:pm2, 'restart', 'hub')
      end
    end
  end

  before :deploy, "deploy:env"
  after :deploy, "deploy:restart"
end

Custom task

other config set up

set :ssh_options, {
   keys: %w(/home/ubuntu/.ssh/id_rsa),
   forward_agent: true,
   auth_methods: %w(publickey password)
 }

set :application, 'hub'
set :user, "ubuntu"
set :deploy_to, '/home/ubuntu/service/hub'

set :repo_url, 'git@bitbucket.org:adplayhubteam/hub.git'
set :branch, "master"


after "deploy", "deploy:cleanup"

append :linked_files, 'config/database.yml', 'config/secrets.yml'
append :linked_dirs, 'log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'public/system'

rollback for what?

  • code

  • database

rollback code

structure

cap production deploy:rollback ROLLBACK_RELEASE=20160614133327

execute commend

rollback database

# db/migrate/20160801115659_adplay.rb

class Adplay < ActiveRecord::Migration[5.0]
  def change
     add_column :adplays, :google_play_url, :string
     add_column :adplays, :itunes_url, :string
  end
end

migration script

cap production db:rollback STEP=1

execute commend

transaction

ci todo

  • vm server

  • webhook

  • Build Scheduler

  • Notification

  • permissions

  • Report

介紹 Capistrano

By alincode

介紹 Capistrano

  • 1,385