DevOps工具介紹連載(6)——Capistrano
- 2020 年 2 月 19 日
- 筆記
使用 Capistrano 進行自動化部署
最近在折騰這個,弄了好多次都不成功,看了官方文檔和很多博客,都沒有說清楚,因此,我覺得有必要把它記錄下來,以幫助更多像我這樣被弄得煩躁的人。
首先是安裝,其實 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{[email protected]}, my_property: :my_value # role :web, %w{[email protected] [email protected]}, other_property: :other_value # role :db, %w{[email protected]} 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