Capistrano 3.11, GitLab, PHP 本地自動釋出

A-big-beard發表於2018-09-18

使用 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 協議》,轉載必須註明作者和本文連結

相關文章