デプロイコマンドの実装
では核心のdeployアクションに入りましょう。このアクションでチケットのステータスの確認や,
def deploy
### ① チケットの状態チェック
warning_status = IssueStatus.find(:first, :conditions => { :name => "実装完了" })
if @project.issues.map(&:status).include?(warning_status)
flash[:error] = "未チェックのチケットが存在します!"
redirect_to :action => "index", :project_id => params[:project_id]
return
end
### ② リポジトリの更新,最新リビジョン番号の取得
repository = @project.repository
repository.fetch_changesets
latest_changeset = Changeset.find(:first, :conditions => { :repository_id => repository }, :order => "revision DESC")
### ③ デプロイの実行
start = Time.now
cmd = "cap deploy 2>&1"
finish = Time.now
### ④ 実行結果の確認
out = `#{cmd}`
return_code = $? ? $?.exitstatus : 8929
### ⑤ 履歴の作成
DeployHistory.create!(:project => @project,
:changeset => latest_changeset,
:log => out,
:started_on => start,
:deployed_on => finish,
:deployer => User.current)
### ⑥ indexアクションに戻る
flash[:notice] = "デプロイに成功しました! リビジョン: #{latest_changeset.revision}"
redirect_to :action => "index", :project_id => params[:project_id]
end
だいぶ長いコードになりました。順々に説明していきます。
まず,
②では履歴の保存用にリポジトリの最新リビジョンを取得しています。注意しなければならないのは,
③, ④ではデプロイの実施と前後の処理時間を取得しています。Linuxのコマンドを実行しているだけなのでcapistranoである必要性は特になく,
そして⑤で履歴を作成し,
まだデプロイしてもアクティビティへ表示されるようにはなっていませんが,
また,
アクティビティへの表示
さて,
アクティビティ機能はメニューなどと同様にプラグインから利用する事が可能ですが,
- アクティビティの提供元となるモデルを指定する
- モデルに対してアクティビティを生成するための共通インターフェースを実装する
今回はもちろんDeployHistoryモデルが提供元です。
まず,
init.
activity_provider :deploy_histories, :class_name => "DeployHistory"
次にモデルで実装する共通インターフェースですが,
deploy_
acts_as_activity_provider :timestamp => "deployed_on",
:author_key => :deployer_id,
:find_options => { :include => :project } # ①
acts_as_event :title => Proc.new {|inst| "リビジョン#{inst.changeset.revision}番がデプロイされました。"},
:description => :log, # 120文字に短縮されます。
:datetime => :deployed_on,
:url => Proc.new {|inst| {:controller => 'deployments', :action => 'show', :id => inst.id, :project_id => inst.project_id }},
:author => :deployer
①ではfind_
これで完了です。再起動してアクティビティを見ると,
おわりに
今回はContinuousDeploymentの開発を通して,
ちなみにデプロイやビルドとRedmineとの連動,
最終回となる次回はプラグイン開発の落ち穂拾いと,