使用_Capistrano_進行自動化部署(2)

以前的一篇文章是爲了解決問題而寫的,不少東西都沒有介紹清楚,這一篇文章就是完整介紹一下 Capistrano,主要的參考來源是 Modern PHP 這本書。nginx

Capistrano 是用於自動部署應用的軟件,能讓部署變得簡單、可預知結果和可逆。Capistrano 運行在本地設備中,經過 SSH 與遠程服務器通訊。Capistrano 原本是爲了部署 Ruby 應用而開發的,不過對任何編程語言開發的應用都有用,包括 PHP。web

Capistrano 的工做方式

Capistrano 安裝在本地設備中。部署 PHP 應用時,Capistrano 會在本地設備中執行 SSH 命令,與遠程服務器通訊。Capistrano 會在遠程服務器中保存以前部署的應用,並且每次部署的版本放在各自的目錄中。Capistrano 會維護五個或更多以前部署的應用,以防須要回滾到早期版本。Capistrano 還會建立一個 current/ 目錄,經過符號連接指向當前部署的應用所在的目錄。在生產服務器中,Capistrano 管理的目錄結構可能像下圖這樣:數據庫

home/
    deploy/
        apps/
            my_app/
                current/
                releases/
                    release1/
                    release2/
                    release3/
                    release4/

把新版應用部署到生產環境時,Capistrano 首先從應用的 Git 倉庫獲取最新版代碼,而後把應用的代碼放到 releases/ 目錄中的一個新子目錄中,最後把 current/ 目錄的符號連接指向這個新目錄。讓 Capistrano 回滾到以前的版本時,Capistrno 會把 current/ 目錄的符號連接指向 releases/ 目錄中存檔以前版本的目錄。Capistrano 是一種優雅且簡單的部署方案,能讓 PHP 應用的部署過程變得簡單、可預知和可逆。編程

安裝

Capistrano 應該安裝在本地設備中,別在遠程服務器中安裝。安裝時還須要 ruby 和 gem。OS X 系統已經有了。Ubuntu 用戶能夠直接用下面的命令安裝:api

sudo apt-get install ruby
sudo apt-get install gem

安裝好以後,執行下面命令安裝 Capistrano:ruby

gem install capistrano

配置

安裝 Capistrano 以後,爲了使用 Capistrano,必須初始化項目。打開終端,進入項目的根目錄,執行下面的命令:服務器

cap install

這個命令會建立 Capfile 文件,config/ 目錄和 lib/ 目錄。如今,項目目錄結構應該以下所示:架構

Capfile
config/
    deploy/
        production.rb
        staging.rb
    deploy.rb
lib/
    capistrano/
        tasks/

Capfile 是 Capistrano 的中央配置文件,會聚合 config/ 目錄中的配置文件。 config/ 目錄中存放的是各個遠程服務器環境(例如,測試環境、過渡環境或生產環境)的配置文件。app

默認狀況下,Capistrano 假設你爲應用搭建了多個環境。例如,可能有單獨的過渡環境和生產環境。Capistrano 在 config/deploy/ 目錄中爲每一個環境都提供了單獨的配置文件。Capistrano 還提供了 config/deploy.rb 配置文件,這個文件用於保存全部環境通用的設置。composer

在每一個環境中,Capistrano 會區分服務器的角色。例如,生產環境可能有前置 Web 服務器(web角色),應用服務器(app角色)和數據庫服務器(db角色)。只有最大規模的應用纔有必要使用這種架構,小型 PHP 應用通常在同一臺設備中運行 Web 服務器(nginx)、應用服務器(PHP-FPM)和數據庫服務器(MariaDB)。

這篇文章的例子中,我使用的是 web 角色,和生產環境的配置。

config/deploy.rb 文件

這個配置文件包含全部環境通用的配置。打開這個文件,而後更新下列設置:

  • :application 這是 PHP 應用的名稱。只能包含字母、數字和下劃線。
  • :repo_url 這是Git倉庫的URL。這個URL必須指向一個Git倉庫,並且遠程服務器必須能訪問這個倉庫。
  • :reploy_to 這是遠程服務器中一個目錄的絕對路徑,咱們不熟的PHP應用就存放在這個目錄中,此時,該路徑爲:/home/deploy/apps/my_app
  • :keep_releases 保留多少箇舊版,以便於應用的版本回滾。

config/deploy/production.rb 文件

這個文件只包含生產環境的設置。這個文件用於定義生產環境的角色,列出屬於各個角色的服務器。咱們只使用 web 角色,並且只有一個服務器屬於這個角色。因此,這是,把該文件所有內容替換爲下列代碼便可:

role :web, %w(deploy@123.123.123.123)

認證

使用 Capistrano 部署應用以前,咱們必須在本地電腦和遠程服務器之間,以及遠程服務器和 Git 倉庫之間創建認證。在以前的文章中 [[Blog:設置 SSH Key 登陸服務器和 Git 服務器]] 已經討論瞭如何使用 SSH 密鑰登陸服務器和 Git 服務,使用以前討論的方法在每臺遠程服務器中生成 SSH 公鑰和私鑰。Git 倉庫應該能訪問每臺遠程服務器的公鑰。Github 容許在用戶帳戶中添加多個 SSH 公鑰。總之,咱們必須不使用密碼就能把 Git 倉庫克隆到遠程服務器。

準備遠程服務器

就快能部署環境了,但在此以前,還須要準備遠程服務器。咱們要經過 SSH 登陸遠程服務器,建立一個目錄,存放部署的 PHP 應用。deploy 用戶必須有這個目錄的讀寫權限。我喜歡在 deploy 用戶的主目錄中建立這個目錄:

/home
    /deploy
        apps/
            my_app/

虛擬主機

Capistrano 會建立符號連接,把 current/ 目錄指向存放當前應用版本的目錄。所以,咱們要更新 Web 服務器的虛擬主機文檔根目錄,指向 Capistrano 的 current/ 目錄。根據上述文件系統的結構圖,要把虛擬主機的文檔根目錄改成 /home/deploy.apps.my_app/current/public/。這麼設置的前提是,假設 PHP 應用中有個 public/ 目錄,把它當作文檔根目錄。而後重啓 Web 服務器,加載修改後的虛擬主機配置。

依賴的軟件

遠程服務器不須要 Capistrano,可是須要 Git。並且還須要運行 PHP 應用所須要的所有軟件。

Capistrano 的鉤子

Capistrano 容許在部署應用過程當中的特定時刻執行咱們指定的命令。不少 PHP 開發者都使用 Composer 管理應用的依賴。每次使用 Capistrano 部署應用時,咱們可使用 Capistrano 的鉤子安裝 Composer 依賴,打開 config/deploy.rb 文件,添加下面的 ruby 代碼:

namespace :deploy do
    desc "update composer package"
    after :updated, :build do
      on roles(:web) do
          within release_path do
              execute :composer, "install --no-dev --quiet"
              execute :cp, "-rfv  ../../shared/configs ./application/"
          end
      end
    end
  end

一些不便於放在 Git 中的配置文件此時能夠經過在鉤子中執行 ln -s source dest 命令,創建符號連接,引用外部的配置文件。

部署應用

一切準備就緒之後,切換到本地項目根目錄,執行下列命令部署你的應用!

cap production deploy

回滾應用

要回滾到上個版本,只需執行下列命令:

cap production deploy:rollback

PS - 我的博客原文:使用_Capistrano_進行自動化部署(2)

相關文章
相關標籤/搜索