Centos6.4 部署安裝Webistrano
安裝環境:
安裝epel源:
wget -q -O -http://www.atomicorp.com/installers/atomic |sh
安裝軟件包:
yum install ruby ruby-devel ruby-docs ruby-ri ruby-irbruby-rdoc rubygems
安裝git:
Yum install git –y
安裝mysql:
Yum install mysql mysql-servermysql-devel
初始化mysql:
Mysql_install_db
登陸mysqk:
Mysq –uroot –p直接回車進入
給mysql設置密碼
Use mysql;
Update user set password=PASSWORD(“123456”) where user=’root’;
Flush privileges;
啓動mysql:
/etc/init.d/mysqld restart||start||stop
使用gem安裝軟件:
Gem install Capistrano
Gem install rails 如果提示要求ruby版本1.9.3以上,則制定安裝rails版本
Detail:
Gem install rails –v 2.1.2
安裝完成後安裝bundler
Gem installbundler
Gem installopen4 exception_notification
然後使用git拿到webistrano
Git clone https://github.com/peritor/webistrano.git
使用bundlerinstall 更新&&安裝ruby的環境包
Detail:
Bundle install
然後通過閱讀webistrano的README文件進行安裝
RAILS_ENV=productionrake db:create 創建相關的數據庫
RAILS_ENV=productionrake db:migrate 創建相關的表結構
操作完成後,通過rubyscript/server –d –p 3000 –e prodution來啓動webistrano
報錯:
1.ERROR: 'rake/rdoctask' is obsolete and nolonger supported. Use 'rdoc/task'
這個錯誤是說rdoc過期
解決方法:
降低rake版本
gemuninstall rake -v 10.1.0
安裝0.8.7的rake版本
Geminstall rake –v 0.8.7
然後就可以通過rake 建立相關的數據庫及表結構了
2.bundle install的時候提示要求1.3.5或更高版本的bundler,請運行gem install bundler –v 1.3.5
執行完gem install bundler –v 1.3.5安裝成功後依然出現這個提示
解決方法:
修改gemfilegem
gem 'bundler', " ~>1.3.5"
手動將bundler的版本更改成1.3.5
3.安裝0.8.7的rake後,提示bundler版本要求10.0.1
解決方法:更改gemfile文件
gem "rake" , "0.8.7" 手動添加版本信息
然後執行bundle update rake
然後執行 gem install rake –v 0.8.7
這是將rake更改成0.8.7的方法在ruby1.8.7的版本下
webistrano是capistrano的web版,用法和capistrano差不多,附上capistrano的用法:
安裝capistrano後,執行capify conf/------在conf文件下生產配置文件
如果開始沒有安裝capistrano
則使用gem install capistrano或vim Gemfile 添加一行gem “capistrano”然後執行bundle install即可
編輯config下的deploy文件
set :application, "set your application name here" set :repository, "set your repository location here" 如果你不熟悉ruby語法,你會發現這看起來十分像配置文件。但是,因爲在ruby中調用函數的時候,不需要使用括號,文件裏面的每一行其實就是調用set()函數:
set(:application, "your-app-name") 使用你的應用的名字替代:application變量,不要包含空格--這會創建一個部署目錄。使用你的版本管理URL目錄替代:repository(在這個例子中,我們使用SVN) |
|
如果你的SVN需要用戶名和密碼,請按如下配置: set :scm_username, "svn-username" set :scm_password, "svn-password" |
|
|
接着,取消註釋並配置部署目錄。如果你的部署服務器上沒有部署的目錄,Capistrano會幫你創建它:
set :deploy_to, "/path/to/doc/root/www/#{application}" 這裏,我們使用我們之前設置的目標部署目錄的application變量。這寫全部是ruby的標準語法,在所有的Capistrano腳本中適用,這樣可以使我們的工作更有效,而不是混雜各種令人頭暈的語法在裏面。 |
最後,我們需要配置部署的服務器信息。你可以添加很多你需要部署的服務器,你只需遵循SSH可以理解的命名規則: role :app, "app-server-1", "app-server-2", "app-server-3" role :web, "192.168.3.173" role :db, "db-server-1", :primary => true 如果你只是想測試一下Capistrano,你可以把你的工作站配置到部署地址; 這樣,你就無需考慮服務器之間的跳轉:
role :app, "me@my-local-ip" 現在,我們可以告訴Capistrano爲我們建立部署路徑的配置:
cap deploy:setup 當你運行這個命令,Capistrano開始爲你展示它所做的。這樣一來,可以方便我們調試Capfile,並可以消除你的疑慮知道它在做什麼動作。每當你連接到一臺服務器,系統會需要你提供密碼,然後Capistrano就會運行一連串的命令。 | 執行完deploy:setup命令後,部署路徑就會創建了一些新增的目錄,運行cap命令去推送新版本,執行回滾和其他動作: myapp/ releases/ shared/log shared/pids shared/system 接着,我們開始部署應用。Capistrano會自動檢查源代碼併發布,同時創建一個叫做current的symlink鏈接:
cap deploy:cold 執行完這個命令後,讓我們來看看發佈目錄:
# current@ -> /www/captest/myapp/releases/20131119144520 這個一個"cold"發佈,意思是表示只執行一次的任務。之後如果我們需要再發布應用,你只需使用部署任務:
cap deploy 當你執行完deploy:cold或者deploy命令後,查看一下部署目錄,你會發現你的源代碼會按照Capistrano的方式被髮布出去。 部署任務替代了登錄服務器,獲取源代碼,設置數據庫和重啓服務器。任務只需運行很短時間,我們能就現在可以享受懶惰的感覺了! |
深入知識 我們只需運用deploy:setup , deploy:cold, deploy命令就可以發佈應用。recipe裏面其實包含了很多東西,讓我們來看看所有可用的任務: cap -Tv 和rake -T很相像,這個命令會列出所有的任務和任務相關的文檔。如果你已經運行過幾次deploy,我們就可以嘗試一下rollback或者rollback_code任務。 每次你執行回滾的時候,Capistrano會把symlink指向前一次發佈的目錄。回滾操作可以重複執行,直到你找到了你想要的穩定版本: cap deploy:rollback_code | 屬於你自己的任務 當你使用Capistrano應用到你的rails項目中,你就會發現他是如何讓你變得更懶惰。使用Rails特有命令的任務同樣可以包含任何的命令在裏面。 當你運行Capistrano任務,例如deploy,你會很多SSH命令和迴應會回顯出來。如果你需要發佈到幾臺服務器上,你看到來自多臺服務器的迴應,因爲Capistrano可以在多臺服務器上運行任務,只要你需要發佈到多少臺服務器都可以。 它的用處是非常廣的——檢查硬盤空間,從集羣中複製實時數據和運行維護計劃——那麼我們應該如何構建我們自己的任務呢? |
Capistrano的任務是通過如下的語法來定義的: desc "Short description here..." task :name_of_function, :roles => :servers do # tasks is in here... end Ruby的優雅語法讓所有事情都變得十分簡單,那麼讓我們來單獨討論它。第一行是一些解釋說明,這些說明會在你運行命令時被輸出(同樣在你的項目的跟目錄下):
cap -Tv Ruby支持在調用函數的時候,不使用括號,所以第二行實際上是調用了Capistrano的任務函數. | 第一個參數是新任務的名字(name_of_function)。第二個參數是指定執行任務的服務器集合;這個可以是:server,:app,:db或者其他服務器的集合。 任務第一部分由do開始,這個是一個匿名函數,它是表示任何在do和end之間的任務都會被執行。你可能在javascript函數中也遇到過匿名函數。 一個非常簡單的任務'df -h'將會被執行,用於檢查服務器的磁盤使用情況。這個任務不會修改服務器上的任何配置,所以你可以大膽的去運行它: desc "Check disk space" task :diskspace, :roles => :servers do run 'df -h' end run函數只會簡單的在服務器上運行命令。你可以使用sudo來替代它,使用sudo在遠程服務器上實行命令: desc "Who hasn't been cleaning out their home directories?" task :home_disk_usage, :roles => :servers do sudo 'du -sh /home/*' end 如果你就如上一節提到的一樣,capified你的項目,你甚至可以添加你自己自定義的任務到標準的Rails recipe上,並修改Rails recipe的行爲。這樣可以讓你的Capistrano按照你的意思去工作,這樣的好處就在於當你忘記了某些命令如何運行。 |
在capified之後的Rails項目中添加你自己的任務,只需按照上面提到的任務語法,把它們添加到 config/deploy.rb中。當你添加了以惡搞任務,運行runcap -Tv命令檢查你的任務是否存在,並運行其他任務。 Tasks可以被其他Task調用就如函數一樣,所以複雜的Tasks可以切分成多個簡單的tasks並按照“DRY”原則設計你的Capistrano recipes。Tasks可以通過rails函數調用實現互相調用: task :home_disk_usage, :roles => :servers do vhosts_disk_usage run "ls /home/" end 你可能需要自定義的任務知道你的項目是在哪個路徑上。這就用到了我們在開頭提到的配置變量,並通過ruby語法來定義:
run "tar czf ~/snapshot.tgz #{release_path}" 如果你需要其他變量,你可以像之前的語法一樣去set:
set :foo, "bar" | 或者,你可以通過set函數提示用戶輸入變量,但是用法有一點點不同: set(:deploy_version) do Capistrano::CLI.ui.ask "What version is this? " end 變量使用方法是一樣的,不管是用那個方式去set他們。 所有的這些都離不開ruby,所以你會發現Capistrano更像一個框架而並非是一個獨立的應用或腳本。如果Ruby對於你來說是一件新鮮的事情, 請繼續學習吧——你很會就能熟悉它。 最後,就像DRY原則一樣,儘量保持代碼整潔。所有的Rails recipes可以在deploy 命名空間中找到,當你運行runcap -Tv的時候你就會發現的。命名空間允許你把任務組合在一起,這可以通過namespace命令包含你的這些任務: namespace :our_tasks do desc "The default task" task :default do restart end
desc "Empty logs" task :empty_logs do # ... end end 當你運行runcap -Tv,你可以看到任務已經被組合在一起:
cap our_tasks # The default task cap our_tasks:empty_logs # Empty logs |
定製Rails recipe 創建Capistrano任務很簡單,但是我們之前使用的Rails recipe已經包含了90%我們需要的東西。在這個例子中,更好的方式是定製recipe而不是創建就一個。我們可以通過覆蓋特定的任務,實現對某些行爲的定製。 我在嘗試使用Capistrano來運行makefile的時候發現這個特性。在這裏我完成了大部分的代碼管理,數據庫版本控制和安裝配置。我們可以在不需要提交或編輯文件的場合使用這個方法。所以通過capistrano來部署是相當誘人的。 | 當你讀到這裏並想:"這是酷斃了,但是我們還沒打算遷移到Rails"。定製化會很適合你,因爲你可以覆蓋執行rails命令相關的任務。 第一,嘗試在非Rails項目中使用cap,但是請確保有一個config/目錄,這樣capify可以放置它的deploy.rb文件。當capify運行完畢後,你可以開始嘗試運行各種我們上面提到的cap deploy任務。 但是,當Rails服務器不存在或者Rakefile不存在時候,Capistrano就會發生錯誤。 這是因爲其中一個任務deploy:restart,會嘗試重啓rails服務器。另外一個任務會嘗試運行runrake db:migrate。你的項目很可能不支持這兩個任務,所以你需要添加如下的代碼到config/deploy.rb,覆蓋他們: desc "Do nothing" deploy.task :restart, :roles => :app do # ...do what you like here... end |
這個很直觀,這段代碼是在deploy 命名空間中覆蓋了restart任務,和所有包含在任務裏面的命令(所有包含在do和end之間的代碼)都可以被編輯。你可能需要重啓Apache服務器而不是rails服務器: desc "Do nothing" deploy.task :restart, :roles => :app do sudo '/etc/init.d/restart' end 當你運行cap命令 deploy:cold,rails遷移命令會創建對應的數據庫。我們可以按照我們實際需要覆蓋它: deploy.task :migrate, :roles => :app do run "make data" end | 結論 Capistrano提供給我們相當簡潔的方法去發佈應用。它還能在其他關於遠程服務器的領域中使用,例如監視,隨意的任務,創建一次性備份和其他。 這些要歸功於Ruby的優雅簡潔,Capistrano可以推廣到很多地方。Rails recipe可以被其他non-rails應用所提到,還可以使用小小的ruby知識就能添加一個新的recipes 最後,要讓所有事情變得更迅速,使用SSH認證登錄遠程服務器。如果你需要把認證文件放在其他地方,你只需添加如下代碼到deploy.rb文件: ssh_options[:keys] = "/path/to/identity_file" 通過這個方式,你可以通過cap命令完全發佈你的應用——現在你就是真正的懶人了。
|
|
|
|
|