使用 capistrano 3.11 實現一個小的釋出指令碼
Capistrano是用ruby編寫的可以在一臺或多臺伺服器上執行指令碼的開源工具,它主要用於部署web應用。它自動完成多臺伺服器上新版本的同步更新,包括資料庫的改變。
Capistrano官網地址及文件地址 capistranorb.com
Capistrano工具怎麼樣?
這個問題各個不同的開發團隊有各自的答案,不管網上說這個工具有多好,只有符合自己的需求才是最好。
未使用Capistrano之前,每次釋出程式碼,都需要以下幾個步驟
* 連線伺服器: 透過SSH
登上 正式生產服務區, 進入專案目錄
* 獲取最新程式碼:執行git pull
獲取master
分支最新程式碼
* 清除快取:清除快取
以往釋出方式不足的地方
* 每次都是重複操作那幾條相同的命令,機械,繁瑣
* 出錯 rollback 操作沒有 Capistrano 簡單
* 關鍵配置資訊需要放在版本庫中(資料庫配置,介面配置資訊)
* 個性化資訊需要手動修改,或者手動釋出。
Capistrano 安裝
* 確保電腦安裝好了 ruby 2.5以上, gem 2.7 以上
*gem install capistrano
如果裝不上,考慮 ruby 版本 和 gem 版本是不是太低
*gem install bundle
初始化專案
- cap install
編寫Capistrano指令碼
- vim config/deploy.rb
lock "~> 3.11.0"
# 採用ssh 方式登入遠端伺服器
# remote server 是遠端伺服器器地址,一般是網站正式伺服器地址
# server user 是登入到遠端伺服器的使用者
# web, app, db 都是角色名,我三個都在同一個伺服器,所以寫在一起。
server 'remote server', user: 'server user', roles: %w{web app db}, primary: true
# release path 釋出到正式伺服器的路徑,這個路徑需要提前在伺服器上建立好
set :deploy_to, "release path"
# application name 自定義的應用名稱,沒什麼作用
set :application, "application name"
# 設定程式碼倉庫地址, 我用的git
set :repo_url, "git lab"
# 設定程式碼版本控制工具
set :scm, "git"
# 設定獲取哪個分支的程式碼,預設是 master
set :branch, "master"
# 設定釋出採用快取技術。這個很有用,如果未設定這個,每次釋出都是全量釋出,超慢,如果依賴的vendor多,會更慢。
set :repository_cache, "git_cache"
set :deploy_via, :remote_cache
# ssh 選項設定。 告訴 Capistrano , ssh key 在本機的位置。
set :ssh_options, {:forward_agent => true, user: fetch(:user), keys: %w( ssh key在本機的路徑 ) }
set :format, :pretty
# 設定日誌級別
set :log_level, :info
# 設定儲存的版本數量,一般為5
set :keep_releases, 5
# 設定共享檔案,常用於專案的配置檔案,比如 env 檔案,資料庫配置檔案等等
set :linked_files, %w{
.env
.database.yml
}
# 設定共享目錄,常用於公共檔案,比如說 vendor 目錄
set :linked_dirs, %w{
vendor
}
# 自定義的一些任務
namespace :deploy do
# 清除快取
desc "clear cache"
task :clear_cache do
on roles(:app, :web) do
execute("rm -rf #{deploy_to}/current/var/cache/")
execute("mkdir -p #{deploy_to}/current/var/cache/")
end
end
# 改變專案所屬組
desc "change group"
task :change_group do
on roles(:app, :web) do
execute("sudo chown -R user:group #{deploy_to}/current")
end
end
# 上傳配置檔案 , 將本地檔案上傳到伺服器. 警告:伺服器的儲存路徑目錄必須存在,不然會報錯
desc "上傳檔案"
task :upload_file => '本地檔案絕對路徑' do |t|
on roles(:all) do
upload!(t.prerequisites.first, "伺服器儲存檔案絕對路徑+檔名")
end
end
#高階任務,根據使用者輸入資訊來執行任務。比如說此次釋出需要更新資料庫不?
desc "更新資料庫"
task :update_schema_datebase do
# 使用ack提示釋出人需要更新資料庫不?預設是 NO
ask(:update_database, "NO", prompt: "需要更新資料庫嗎? NO/YES")
on roles(:all) do
if "#{fetch(:update_database)}" == "YES" then
execute("執行資料庫更新命令")
end
end
end
after :finishing, :upload_file
after :finishing, :clear_cache
after :finishing, :update_schema_database
end
```
Capistrano 檢查命令,編輯好Capistrano指令碼後。先自己執行命令檢查
cap deploy:check
如果報錯,編輯 Capfile 檔案,在最後新增 Rake::Task[:production].invoke
檢視Capistrano全部任務
cap -T
Capistrano 回滾
cap deploy:rollback
Capistrano 釋出程式碼
cap production deploy
本作品採用《CC 協議》,轉載必須註明作者和本文連結