最近在折騰這個,弄了好多次都不成功,看了官方文檔和很多博客,都沒有說清楚,因此,我覺得有必要把它記錄下來,以幫助更多像我這樣被弄得煩躁的人。
首先是安裝,其實 Ubuntu 上面安裝 Capistrano 非常簡單:
gem install capistrano
然后,進入項目目錄,運行下面命令生成 Capistrano 的配置文件:
cap install
這個命令會創建下面這些文件:
Capfile
config/
deploy/
production.rb
staging.rb
deploy.rb
lib/
capistrano/
tasks/
在 config
中存放的的各個環境的配置文件,而我,就是在配置這個的時候產生的問題。
deploy
文件配置如下:
# config valid for current version and patch releases of Capistrano
lock "~> 3.11.0"
set :application, "KFB"
set :repo_url, "git@<my-server-1>:<my-account>/<my-project>.git"
# Default branch is :master
# ask :branch, `git rev-parse --abbrev-ref HEAD`.chomp
set :branch, "dev"
# Default deploy_to directory is /var/www/my_app_name
set :deploy_to, "/home/KFB-API"
而 staging.rb
文件如下:
# server-based syntax
# ======================
# Defines a single server with a list of roles and multiple properties.
# You can define all roles on a single server, or split them:
# server "example.com", user: "deploy", roles: %w{app db web}, my_property: :my_value
# server "example.com", user: "deploy", roles: %w{app web}, other_property: :other_value
# server "db.example.com", user: "deploy", roles: %w{db}
# role-based syntax
# ==================
# Defines a role with one or multiple servers. The primary server in each
# group is considered to be the first unless any hosts have the primary
# property set. Specify the username and a domain or IP for the server.
# Don't use `:all`, it's a meta role.
# role :app, %w{deploy@example.com}, my_property: :my_value
# role :web, %w{user1@primary.com user2@additional.com}, other_property: :other_value
# role :db, %w{deploy@example.com}
role :web, %w{<my-user>@<my-server>}
就配置這一行就可以了。按照注釋所說,它有兩種方式配置,但其實都只干了一件事,就是配置部署服務器。
我之前錯誤就是在這里配了兩個設置,然后執行
cap staging deploy
時始終會報這幾個錯:
#錯誤一:fatal: unable to access 'http://<my-server>/<my-account>/<my-project>.git/': The requested URL returned error: 500
#錯誤二:fatal: repository 'http://<my-server>/<my-account>/<my-project>.git/' not found
#錯誤三:Net::SSH::AuthenticationFailed: Authentication failed for user <my-user>@<my-project>
#錯誤四:Permission denied (publickey,password)
發生錯誤根本原因有兩個,一個是本地連接遠程服務器不通,第二個是遠程服務器連接 Git 服務器不通,因為 Capistrano 的運行原理就是從本地連接遠程服務器,然后在遠程服務器上執行 Git 命令,克隆最新代碼到遠程服務器的發布目錄上面。這里都是使用的 ssh key 的方式進行連接。
本地連接遠程服務器不通,可以參考 設置_SSH_Key_登錄服務器和_Git_服務器 在本地生成兩個 Key,把公鑰放服務器上,私鑰放本地。這里還有一個坑,如果你在生成密鑰文件時指定了文件名的話,那是不能直接使用的,具體如何使用我暫時沒弄清楚,所以直接使用默認的文件名 id_rsa 就行啦。
對於連接 Git 服務器的問題,此時的 Git 服務器是用 Gitlab 搭建的一個項目,可以通過 Web 訪問;用上面同樣的方法生成兩個 Key,公鑰在 Gitlab 中的個人設置中(下圖)設置,私鑰放在遠程服務器訪問 Git 服務器的用戶目錄的 .ssh/
目錄下面。
配置完之后,可以先用 git clone git@<my-server>:<my-account>/<my-project>.git
測試一下,正常的話應該能直接克隆項目而不需要再輸入密碼了。
最后全部配置好了之后,再運行
cap staging deploy
輸出一大堆命令,最后顯示成功。根據先前的設置,自動部署之后的遠程服務器上的代碼目錄結構是這樣的:
KFB-API/
revisions.log
releases/
0180703070947/
# 這里是項目的具體內容,相當於原來的 KFB-API/ 下面的內容
current/ -> ./releases/20180703070947
repo
shared
PS - 個人博客原文:使用_Capistrano_進行自動化部署