2012-04-18 176 views
30

我正在研究使用Capistrano作爲通用部署解決方案的可能性。通過「通用」,我的意思是不軌。我對我發現的文檔的質量並不滿意,但是,我沒有看到那些假設你正在部署rails的文檔。所以我會試着根據幾個例子來破解一些東西,但是我從一開始就面臨着一些問題。將參數傳遞給Capistrano

我的問題是,cap deploy沒有足夠的信息來做任何事情。重要的是,它缺少我想要部署的版本的標記,並且此要在命令行上傳遞。

另一個問題是我如何指定我的git存儲庫。我們的git服務器是通過SSH在用戶帳戶上訪問的,但我不知道如何更改deploy.rb以將該用戶的ID用作scm URL的一部分。

那麼,我該如何完成這些事情呢?

我要部署的第二釋放的第一衝刺的結果。這在git存儲庫中被標記爲r2s1。另外,假設用戶「johndoe」獲得部署系統的任務。要訪問存儲庫,他必須使用URL [email protected]:app。因此,存儲庫的遠程URL取決於用戶標識。

的命令行來獲得所需的文件將這些:

git clone [email protected]:app 
cd app 
git checkout r2s1 
+0

嘿,我希望你不會忽視我們的答案。請至少評論他們。 :) – deadrunk 2012-04-27 09:55:08

回答

46

擁有jarrad說,Capistrano的-ash是部署其他項目類型的一個很好的基本輔助模塊集合,儘管在一天結束時它不是必需的。這只是一種腳本語言,大部分任務都是通過系統命令完成的,並最終變成幾乎像shell腳本一樣。

要傳遞參數,您可以在運行cap時爲-s標誌設置鍵值對。首先創建一個這樣的任務。

desc "Parameter Testing" 
task :parameter do 
    puts "Parameter test #{branch} #{tag}" 
end 

然後像這樣開始你的任務。

cap test:parameter -s branch=master -s tag=1.0.0 

最後一部分。我建議使用ssh密鑰設置無密碼訪問您的服務器。但是如果你想從當前登錄的用戶那裏獲取它。你可以做這樣的事情。

desc "Parameter Testing" 
task :parameter do 
    system("whoami", user) 
    puts "Parameter test #{user} #{branch} #{tag}" 
end 

UPDATE:編輯與Capistrano的最新版本。配置數組不再可用。

全局參數:請參閱註釋使用set:branch,fetch(:branch,'a-default-value')來全局使用參數。 (並用-S代替。)

+0

儘管如此,但是如何告訴Capistrano它應該檢查哪些標籤? – 2012-04-27 12:53:17

+1

使用-s參數。所以我有一個像這樣的命令來部署特定的標籤。 帽生產部署-s標籤= 2.1.3 如果你正在利用capistano灰的,你只需要做 集:分支,#{配置[:標籤]} 這應該檢出標籤在命令行中設置 – 2012-04-27 13:14:09

+2

這不起作用了。根據https://groups.google.com/forum/?fromgroups=#!topic/capistrano/1nFQPWf9EIo和其他地方,「配置」已被棄用:#(NameError)'。現在你可以使用變量名稱。這只是幾個月前的工作? – jordanpg 2012-10-16 17:33:54

0

爲圖書館,與非軌道部署有助於退房capistrano-ash。我用它來部署一個PyroCMS應用程序,它效果很好。

這裏是我的Capfile片段爲該項目:

# deploy from git repo 
set :repository, "[email protected]:mygitrepo.git" 
# tells cap to use git 
set :scm, :git 

我不知道我理解的問題的最後兩個部分。提供更多的細節,我很樂意提供幫助。例如後

編輯給出:

set :repository, "#{scm_user}@gitsrv.domain:app" 

然後每個人與部署priveledges可以添加以下到其本地〜/ .caprc文件:

set :scm_user, 'someuser' 
+0

好吧,給出的例子。請注意,我無法將存儲庫設置爲固定值,就像您在代碼段中執行的操作一樣。 – 2012-04-24 00:47:19

+0

主頁的'.caprc'很好,但不能強制。我想在命令行上傳遞參數。 – 2012-04-27 12:51:48

9

我建議使用ENV變量。

出頭喜歡這個(命令):

$ GIT_REPO="[email protected]:app" GIT_BRANCH="r2s1" cap testing 

帽配置:

#deploy.rb: 
task :testing, :roles => :app do 
    puts ENV['GIT_REPO'] 
    puts ENV['GIT_BRANCH'] 
end 

,並採取看看https://github.com/capistrano/capistrano/wiki/2.x-Multistage-Extension,可能這種方法會爲你有用。

+1

我注意到使用環境變量與Ruby的東西「在」,但我認爲他們非常不方便。例如,我需要在Windows上使用三個單獨的命令,並提供您提供的建議,每個命令都受到小的拼寫錯誤的影響,並且如果發生拼寫錯誤,則會出現糟糕的反饋。 – 2012-04-27 12:48:03

+0

我同意最後一條評論,我更喜歡一個帶-s或-S var =值的命令行,然後像 'if variables.include?(:var) ... else ... end' – Federico 2012-06-20 15:32:11

3

正如Jamie已經表明的那樣,您可以使用-s標誌將參數傳遞給任務。我想告訴你如何另外使用默認值。

如果你想使用默認值工作,你必須使用fetch,而不是||=或檢查nil

namespace :logs do 
    task :tail do 
    file = fetch(:file, 'production') # sets 'production' as default value 
    puts "I would use #{file}.log now" 
    end 
end 

您可以通過運行該任務(使用默認值productionfile

$ cap logs:tail 

或(使用值cronfile

$ cap logs:tail -s file=cron 
6

更新。關於僅將參數傳遞給Capistrano 3任務。

我知道這個問題是相當古老的,但當搜索傳遞參數給Capistrano任務時,仍然會首先在Google上彈出。

cap test:parameter -s branch=master 

輸出:

cap aborted! 
OptionParser::AmbiguousOption: ambiguous option: -s 
OptionParser::InvalidOption: invalid option: s 

和遺憾的是,在你浪費你的時間嘗試它只是結果要像下面由傑米·薩瑟蘭提供的夢幻般的答案是不再與Capistrano的3有效

cap test:parameter -S branch=master 

輸出:

invalid option: -S 

對Capistrano的3有效答案由@senz和布拉德·德懷爾提供您可以通過點擊此鏈接金髮現: Capistrano 3 pulling command line arguments

爲了完整看到下面的代碼,找出大約兩個選項,你有。

第一種選擇:

就如同使用普通哈希可以重複使用的鍵和值任務:

desc "This task accepts optional parameters" 

task :task_with_params, :first_param, :second_param do |task_name, parameter| 
    run_locally do 
    puts "Task name: #{task_name}" 
    puts "First parameter: #{parameter[:first_param]}" 
    puts "Second parameter: #{parameter[:second_param]}" 
    end 
end 

確保有,當你調用帽參數之間沒有空格:

cap production task_with_params[one,two] 

第二個選項:

當你調用任何任務,您可以指定環境變量,然後從代碼中調用它們:

set :first_param, ENV['first_env'] || 'first default' 
set :second_param, ENV['second_env'] || 'second default' 

desc "This task accepts optional parameters" 
task :task_with_env_params do 
    run_locally do 
    puts "First parameter: #{fetch(:first_param)}" 
    puts "Second parameter: #{fetch(:second_param)}" 
    end 
end 

要分配環境變量,調用帽狀波紋管:

cap production task_with_env_params first_env=one second_env=two 

希望,將節省你有一段時間。