2

以前は .NET を使用していましたが、CruiseControl.NETと呼ばれるナイトリー ビルド システム (継続的インテグレーション)を使用して、アプリケーションをステージング環境に毎晩自動的にデプロイすることを楽しんでいました。

Ruby on Rails と GitHub にジャンプした今、同等の自動化されたナイトリー ビルド システムをセットアップする方法について少し混乱していることに気付きました。Railsのやり方で物事を正しく行いたいのですが、正しい方向へのプッシュを使用できます。

これが私が使用しているものです...

  • Ruby on Rails 3.2.9 (アセット パイプラインあり)
  • RVM
  • アパッチ + パッセンジャー
  • MySQL
  • Ubuntu 12.04 (ステージング サーバー OS)
  • GitHub (SCM)

これらの要件を満たすシステム/ソリューションを探しています: (理想的には Capistrano を利用しています...)

  • GitHub リポジトリの「マスター」ブランチから最新のコミットをステージング サーバーにデプロイします。
  • ワンクリック ビルド オンデマンド: ボタンまたはリンクをクリックして、いつでもデプロイ (または再デプロイ) を強制したい
  • デプロイの一部として、ステージング サーバー上でカスタム コマンドを実行する機能があります (つまり、「バンドル インストール」、Apache の再起動など...)。
  • 毎日または GitHub でのコミット後に自動デプロイ (オプション)

そして、最初に調査を行わずにこの質問をすることは決してなかったので、ここに私が見つけた関連リソースをいくつか示しますが、解読できませんでした:

提案、誰か?ありがとう!

  • デビッド
4

3 に答える 3

4

さて、この目的のためにカピストラーノを使用する方法については、多くの良い情報があることがわかりました ( Prakash のリファレンスを含む) が、完全に包括的であるようには見えません。

フォーラムの後、スタックオーバーフローの質問の後、ガイドを何時間も選んだ後、私は目標のほとんどを達成することができました. 他の人のために時間を節約するために、最初の質問の文脈で見つけた回答と情報を提供しようとします.


更新

私はずっとJenkinsを探していたことがわかりました。これは、私が以前に使用した CruiseControl ビルド サーバー アプリケーションの完璧な (さらに改善された) 類似物です。Jenkins は、スケジュールに基づいてビルドを開始したり、プラグインを使用してイベントをコミットしたりする Web アプリケーションです。Rails アプリを実際にデプロイする機能は含まれていないため、Capistrano が介入します。Jenkins の「シェル実行」ビルド タスクを使用して Capistrano デプロイをトリガーすることで、上記のすべての目標を達成することができました。

詳細については、このガイドをご覧ください。


元の投稿:

まず、Capistrano はビルド システムの目的で機能しますが、CruiseControl とはまったく異なります。

CruiseControl は次のとおりです。

  • 「ビルド サーバー」として機能するマシン上で実行される Web アプリケーション
  • すべてのユーザーが Web アプリにアクセスしてビルドを実行できます。ユーザーは、自分の側で何もセットアップまたは構成する必要はありません...それは単なるWebページです。
  • インターフェイスは、ログ、非難、スケジュールされたビルドなどの機能も提供します...

カピストラーノは:

  • アプリケーションやサービスではなく、次のように機能する宝石rakeです。これは、デプロイの目的で CruiseControl によって使用される Ant および Nant スクリプトと同様の機能を備えています。
  • Capistrano はユーザーのローカル マシン (通常は Rails アプリ フォルダー) で実行され、実行するにはユーザー側で構成が必要です。
  • ユーザーのマシンから SSH 経由でリモート サーバーに直接接続して展開を実行します (リモート サーバーへの SSH アクセスをユーザーに許可したくない場合、これは好ましくない場合があります)。
  • コマンドはコンソールを介して実行されますcap deploy(これは、「ワンクリック」デプロイと同じくらい近いです)。
  • ログの生成、ロールバックの実行などを行います。
  • スケジュールされたビルドを単独で開始することはありません (cron の使用が推奨されました)。

私の最初の要件に関して...

GitHub リポジトリの「マスター」ブランチから最新のコミットをステージング サーバーにデプロイします。

Capistrano の deploy.rb ファイルを構成すると、これが実現します。

ワンクリック ビルド オンデマンド: ボタンまたはリンクをクリックして、いつでもデプロイ (または再デプロイ) を強制したい

すべての Capistrano デプロイは「force」によって行われます。コンソールで「cap deploy」を手動で実行します。

デプロイの一部として、ステージング サーバー上でカスタム コマンドを実行する機能があります (つまり、「バンドル インストール」、Apache の再起動など...)。

Capistrano の deploy.rb ファイルを構成すると、これが実現します。これらのコマンドのほとんどは、すぐに使用できるように含まれています。

毎日または GitHub でのコミット後に自動デプロイ (オプション)

私はまだこれを理解していません... cron ジョブがこれを行うための最良の方法かもしれません。

カピストラーノの設定

まず、 GitHubのこのチュートリアルから始めてください。Rails App フォルダーには、Capfileandconfig/deploy.rbファイルが作成されます。

時間を節約するために、これらのファイルをコピーして貼り付け、必要に応じて設定を微調整してください。以下のファイルは、次のように構成されています。

  • テスト環境へのデプロイ
  • GitHub
  • RVM ベースの Rails
  • 明示的なバージョンの Ruby と gemset を使用する
  • database.yml追跡されていないファイル (つまり、 SCM にコミットしていないファイル) を含める
  • Rails アセット パイプラインの使用
  • デプロイごとに移行とシードを実行する
  • デプロイごとに Apache ベースの Passenger を再起動する

キャップファイル

# Set this if you use a particular version of Ruby or Gemset
set :rvm_ruby_string, 'ruby-1.9.3-p286@global'
#set :rvm_ruby_string, ENV['GEM_HOME'].gsub(/.*\//,"") # Read from local system

require "bundler/capistrano"
# Uncomment this if you're using RVM
require "rvm/capistrano"

load 'deploy'
# Uncomment if you are using Rails' asset pipeline
load 'deploy/assets'
load 'config/deploy' # remove this line to skip loading any of the default tasks

config/deploy.rb

# BEGIN RUBY CONFIG
# You can manually override path variables here
# set :default_environment, {
#     'PATH' => "/usr/local/bin:/bin:/usr/bin:/bin:/<ruby-dir>/bin",
#     'GEM_HOME' => '<ruby-dir>/lib/ruby/gems/1.8',
#     'GEM_PATH' => '<ruby-dir>lib/ruby/gems/1.8',
#     'BUNDLE_PATH' => '<ruby-dir>/lib/ruby/gems/1.8/gems'  
# }
# This changes the default RVM bin path
# set :rvm_bin_path, "~/bin"

# If your remote server doesn't have a ~/.rvm directory, but is installed
# at the /usr/local/rvm path instead, use this line
set :rvm_type, :system
# END RUBY CONFIG

default_run_options[:pty] = true  # Must be set for the password prompt
                                  # from git to work

# BEGIN MULTIPLE ENVIRONMENT DEPLOYS
# Read the following URL if you need to deploy to different environments (test, development, etc)
# https://github.com/capistrano/capistrano/wiki/2.x-Multistage-Extension
# set :stages, %w(production test)
# set :default_stage, "test"
# require 'capistrano/ext/multistage'
# END MULTIPLE ENVIRONMENT DEPLOYS

# BEGIN APPLICATION VARS
set :application, "yourapp"
set :rails_env, 'test'
# END APPLICATION VARS

# BEGIN PATH DEFINITIONS
set(:releases_path)     { File.join(deploy_to, version_dir) }
set(:shared_path)       { File.join(deploy_to, shared_dir) }
set(:current_path)      { File.join(deploy_to, current_dir) }
set(:release_path)      { File.join(releases_path, release_name) }
# END PATH DEFINITIONS

# BEGIN SCM VARS
set :repository, "git@github.com:yourgithubuser/yourrepository.git"  # Your clone URL
set :scm, "git"
set :scm_username, "yourgithubuser"
set :scm_password, proc{Capistrano::CLI.password_prompt('GitHub password:')}  # The deploy user's password
set :branch, "master"
# END SCM VARS


# BEGIN SERVER VARS
set :user, "ubuntu"  # The server's user for deploys
role :web, "dev.#{application}" # The location of your web server i.e. dev.myapp.com
role :app, "dev.#{application}" # The location of your app server i.e. dev.myapp.com
role :db, "dev.#{application}", :primary => true  # The location of your DB server i.e. dev.myapp.com

set :deploy_to, "/home/#{user}/www/#{application}"
set :deploy_via, :remote_cache
# Uncomment this if you want to store your Git SSH keys locally and forward
# Else, it uses keys in the remote server's .ssh directory
# ssh_options[:forward_agent] = true
# END SERVER VARS

# BEGIN ADDITIONAL TASKS
before "deploy:start" do
  deploy.migrate
  deploy.seed
end

before "deploy:restart" do
  deploy.migrate
  deploy.seed
end

# Some files that the Rails app needs are too sensitive to store in SCM
# Instead, manually upload these files to your <Rails app>/shared folder
# then the following code can be used to generate symbolic links to them,
# so that your rails app may use them.
# In this example below, I link 'shared/config/database.yml' and 'shared/db/seed_data/moderators.csv'
before "deploy:assets:precompile" do
  run ["ln -nfs #{shared_path}/config/settings.yml #{release_path}/config/settings.yml",
       "ln -nfs #{shared_path}/config/database.yml #{release_path}/config/database.yml",
       "mkdir -p #{release_path}/db/seed_data",
       "ln -nfs #{shared_path}/db/seed_data/moderators.csv #{release_path}/db/seed_data/moderators.csv",
       "ln -fs #{shared_path}/uploads #{release_path}/uploads"
  ].join(" && ")
end

namespace :deploy do
  # Define seed task (call 'cap deploy:seed')
  desc "Reload the database with seed data"
  task :seed do
    run "cd #{current_path}; bundle exec rake db:seed RAILS_ENV=#{rails_env}"
  end

  # If you are using Passenger mod_rails uncomment this:
  task :start do ; end
  task :stop do ; end
  task :restart, :roles => :app, :except => { :no_release => true } do
    run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}"
  end
end
# END ADDITIONAL TASKS
于 2013-01-16T08:45:23.837 に答える
1

展開部分にはCapistranoを使用すると思います。

CI 部分 (git push を実行するときにビルド) は、travis (Github を使用している場合) や Jenkins (プライベート リポジトリを使用している場合) などの CI サーバーを使用して実装するのが最適です。

ワンクリック ビルドの場合は、capistrano を直接 (cap deployコマンド ラインから) 使用するか、すべてのテストを実行してから を実行するシンプルな CI フックを使用しますcap deploy

于 2013-01-16T08:42:26.497 に答える
1

はい。Capistranoあなたが探しているツールです。Capistranoシステムで使用するとcron、上記の 4 つの要件すべてを備えたビルド/デプロイ システムを実装できるはずです。むしろ簡単です。

Capistrano について学ぶのに最適なリソースは、Deploying Rails book です。Capistrano については 2 つの章があり、最初の章では基本的な使用方法を説明し、2 番目の章ではいくつかの高度な使用方法の概念を説明します。最後に Capistrano のケース スタディもあり、実際のデプロイ スクリプトの例を使用して、さらに構成オプションを探っています。

参考までに: 私は昨日 2 つの章を数時間で読み終え、それについてツイートしました;-)

于 2013-01-15T07:58:16.353 に答える