使用 Capistrano 发布静态网站

1
$ bundle init

修改Gemfile 内容为以下:

1
2
3
4
source "http://ruby.taobao.org"
gem 'capistrano'
gem 'capistrano3-nginx', '~> 2.0'

初始化当前目录为Cap:

1
$ bundle exec cap install

会生成下面的一个目录结构(为简单,修改为prod.rb):

1
2
3
4
5
6
7
8
9
10
.
├── Capfile
├── config
│ ├── deploy
│ │ ├── prod.rb
│ │ └── staging.rb
│ └── deploy.rb
└── lib
└── capistrano
└── tasks

配置 Cap Config

deploy.rb 文件主要是配置所有发布环境的公共配置

config/deploy.rb
1
2
3
set :application, 'd2labs_beta'
set :deploy_user, 'deploy'
set :repo_url, 'git@github.org:lanvige/test.git'

除了公共配置文件外,每个环境都有自己的配置文件:

config/depoly/prod.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
set :stage, :production
set :branch, 'master'
# Extended Server Syntax
server '1.2.6.1', user: 'deploy', roles: %w{web app db}
# used in case we're deploying multiple versions of the same
# app side by side. Also provides quick sanity checks when looking
# at filepaths
set :full_app_name, "#{fetch(:application)}"
## where to put the app
set :deploy_to, "/home/#{fetch(:deploy_user)}/apps/#{fetch(:full_app_name)}"

在Deploy 前,我们还需要添加一些功能,将site-enabled/nginx.conf的配置文件添加到Remote Server下。

lib/capistrano/tasks/prepare.rake
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
namespace :deploy do
task :prepare do
on roles(:app) do
# 在服务器上创建config目录
execute :mkdir, "-p #{shared_path}/config"
full_app_name = fetch(:full_app_name)
# 将给定的config文件通过cap的upload上传
config_files = fetch(:config_files)
config_files.each do |file|
compile file
end
# 将设定的文件软链到相对应的地址
symlinks = fetch(:symlinks)
symlinks.each do |symlink|
sudo "ln -nfs #{shared_path}/config/#{symlink[:source]} #{sub_strings(symlink[:link])}", "-v"
end
end
end
end

deploy

Remote 到远程Server,确保git配置正确

1
2
3
4
5
6
7
$ ssh-keygen -t rsa -C "your_email@example.com"
$ cat ~/.ssh/id_rsa.pub
# 将输出的public key复制到git repo上。
# SSH第一次访问时,会有一个同意选项。建议手工先添加github为known host。
$ ssh git@github.com

准备条件

1
$ cap prod deploy:prepare

上线

1
$ cap prod deploy

Preview

这时,用nginx.conf中配置的域名打开就可以看到内容了。

REF::