Capistranoの仕組みを理解する

まず、deploy のディレクトリに移動します。
cap install でcapistanoのファイルをインストールします
[vagrant@localhost deploy]$ cap install
mkdir -p config/deploy
create config/deploy.rb
create config/deploy/staging.rb
create config/deploy/production.rb
mkdir -p lib/capistrano/tasks
create Capfile
Capified

こんな感じでファイルが作られます。

config/deploy.rb

# config valid for current version and patch releases of Capistrano
lock "~> 3.11.0"

set :application, "my_app_name"
set :repo_url, "git@example.com:me/my_repo.git"

# Default branch is :master
# ask :branch, `git rev-parse --abbrev-ref HEAD`.chomp

# Default deploy_to directory is /var/www/my_app_name
# set :deploy_to, "/var/www/my_app_name"

# Default value for :format is :airbrussh.
# set :format, :airbrussh

# You can configure the Airbrussh format using :format_options.
# These are the defaults.
# set :format_options, command_output: true, log_file: "log/capistrano.log", color: :auto, truncate: :auto

# Default value for :pty is false
# set :pty, true

# Default value for :linked_files is []
# append :linked_files, "config/database.yml"

# Default value for linked_dirs is []
# append :linked_dirs, "log", "tmp/pids", "tmp/cache", "tmp/sockets", "public/system"

# Default value for default_env is {}
# set :default_env, { path: "/opt/ruby/bin:$PATH" }

# Default value for local_user is ENV['USER']
# set :local_user, -> { `git config user.name`.chomp }

# Default value for keep_releases is 5
# set :keep_releases, 5

# Uncomment the following to require manually verifying the host key before first deploy.
# set :ssh_options, verify_host_key: :secure

set:application, set :repo_urlでgitのレポジトリを書く

CentOSにCapistranoをinstall

1. rubyが入っているかバージョン確認

[vagrant@localhost ~]$ ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]

2. 続いてcapistranoが入っているか確認

[vagrant@localhost ~]$ cap --version
-bash: cap: コマンドが見つかりません

3. Capistranoをinstall
gem install capistrano とします。
[vagrant@localhost deploy]$ gem install capistrano
Fetching: net-ssh-5.0.2.gem (100%)
Successfully installed net-ssh-5.0.2
Fetching: net-scp-1.2.1.gem (100%)
Successfully installed net-scp-1.2.1
Fetching: sshkit-1.18.0.gem (100%)
Successfully installed sshkit-1.18.0
Fetching: airbrussh-1.3.1.gem (100%)
Successfully installed airbrussh-1.3.1
Fetching: concurrent-ruby-1.1.4.gem (100%)
Successfully installed concurrent-ruby-1.1.4
Fetching: i18n-1.2.0.gem (100%)

HEADS UP! i18n 1.1 changed fallbacks to exclude default locale.
But that may break your application.

Please check your Rails app for ‘config.i18n.fallbacks = true’.
If you’re using I18n 1.1.x and Rails (< 6.0), this should be 'config.i18n.fallbacks = [I18n.default_locale]'. If not, fallbacks will be broken in your app by I18n 1.1.x. For more info see: https://github.com/svenfuchs/i18n/releases/tag/v1.1.0 Successfully installed i18n-1.2.0 Fetching: capistrano-3.11.0.gem (100%) Successfully installed capistrano-3.11.0 Parsing documentation for net-ssh-5.0.2 Installing ri documentation for net-ssh-5.0.2 Parsing documentation for net-scp-1.2.1 Installing ri documentation for net-scp-1.2.1 Parsing documentation for sshkit-1.18.0 Installing ri documentation for sshkit-1.18.0 Parsing documentation for airbrussh-1.3.1 Installing ri documentation for airbrussh-1.3.1 Parsing documentation for concurrent-ruby-1.1.4 Installing ri documentation for concurrent-ruby-1.1.4 Parsing documentation for i18n-1.2.0 Installing ri documentation for i18n-1.2.0 Parsing documentation for capistrano-3.11.0 Installing ri documentation for capistrano-3.11.0 Done installing documentation for net-ssh, net-scp, sshkit, airbrussh, concurrent-ruby, i18n, capistrano after 21 seconds 7 gems installed
4. Capistranoのバージョン確認
[vagrant@localhost deploy]$ cap –version
Capistrano Version: 3.11.0 (Rake Version: 12.3.2)

capistranoを実行

config/deploy/development.rb

role :app, %w{vagrant@locahost}
role :web, %w{vagrant@locahost}
role :db, %w{vagrant@locahost}

server 'localhost', user: 'vagrant', roles: %w{web app}

task :first_task do
	run_locally do
		execute "echo hello world"
	end
end

[vagrant@localhost capistrano]$ cap development first_task
00:00 first_task
01 echo hello world
01 hello world
✔ 01 vagrant@localhost 0.026s

なんじゃこりゃーーーーーーーーーーーーーーーーーーーー?
はああああああああああああああ?

run_locally executeなので、localにログインらしい。。
ちょっとまてよ。なんだこれは。

capistranoのタスクの例

git cloneは git init、リモートリポジトリの各種設定(※)、git pullを一気に実行

set :application, 'finalge_sample_app'
set :repo_url, 'git@github.com:mumoshu/finagle_sample_app.git'

task :update do
	run_locally do
		application = fetch :application
			if test "[ -d #{application} ]"
				execute "cd #{application}; git pull"
			end
		else
			execute "git clone #{fetch :repo_url} #{application}"
		end
	end
end
task :archive => :update do
	run_locally do
		sbt_output = capture "cd #{fetch :application}; sbt pack-archive"

		sbt_output_without_escape_sequences = sbt_output.lines.map { |line| line.gsub(/\e\[\d{1,2}m/, '')}.join

		archive_relative_path = sbt_output_without_escape_sequences.match(/\[info\] Generating (?<archive_path>.+\.tar\.gz)\s*$/)[:archive_path]
		archive_name = archive_relative_path.match(/(?<archive_name>[^\/]+\.tar\.gz)$/)[:archive_name]
		archive_absolute_path = File.join(capture("cd #{fetch(:application)}; pwd").chomp, archive_relative_path)

		info archive_absolute_path
		info archive_name

		set :archive_absolute_path, archive_absolute_path
		set :archive_name, archive_name
	end
end
task :deploy => :archive do
	archive_path = fetch :archive_absolute_path
	archive_name = fetch :archive_name
	release_path = File.join(fetch(:deploy_to), fetch(:application))

	on roles(:web) do
		unless test "[ -d #{release_path} ]"
			execute "mkdir -p #{release_path}"
		end

		upload! archive_path, release_path

		execute "cd #{release_path}; tar -zxvf #{archive_name}"

		ここでアプリケーションの起動
	end
end

尋常じゃねー 差がありすぎて、追い付ける気が全くしねー
だいたいscalaなんて、全然やりこんでねーぞ。。。
capistranoの理解は若干進んだが、後退している気しかしねー

config/deploy.rb

ステージ間共通の設定を書く
– アプリケーション名
– レポジトリ名
– 利用するSCM
– タスク
– それぞれのタスクで実行するコマンド

※SCMとは?
Software Configuration Management(ソフトウェア構成管理)の略。 ソフトウェア開発プロジェクトの成果物を管理する方法論。

set :repo_url, 'git@github.com:mumoshu/finagle_sample_app'

fetch :repo_url

task

task: uptime do
	task somthing
end
task :uptime do
	run_locally do
		localmachine command
	end
	on server do
		server command
	end
end

task :uptime do
	run_locally do
		localmachine command
	end
	on roles(:web) do
		server command
	end
end

executeによるコマンド実行

task :uptime do
	run_locally do
		localmachine command
		execute "uptime"
	end
	on roles(:web) do
		server command
		execute "uptime"
	end
end

caputerによるコマンド実行結果の取得
output = caputer “uptime”
infoによるログ出力
output = caputer “uptime”
info output

config/deploy/${stagename}.rb

config/deploy/${stagename}.rb

-そのステージで作業対象サーバ
-そのステージだけで実行するタスク

ステージの意味がわからん。タスクのひとまとまりって解釈でOK?

作業対象サーバ例
-ホスト名、サーバーロール、ログインユーザ、SSH設定、その他、そのサーバに紐づく任意の設定

server 'localhost', user: 'vagrant', roles: %w{web}

localhostを対象に、webサーバーというロールを与え、vagrantでログインする

cap install後のconfigファイルを見てみよう

ディレクトリです

config/deploy/test.rb
-作業サーバの設定を行う

config/deploy.rb
-capistranoデフォルトタスクの消去
-タスク「ソースコードの取得」の定義
-タスク「ビルドとアーカイビング・パッケージング」の定義
-タスク「アプリケーションのビルドとインストール」「アプリケーションの起動と停止の定義」

うおーrubyの文法忘れた~
deploy.rb

framework_tasks = [:starting, :started, :updating, :updated, :publishing, :published, :finishing, :finished]

framework_tasks.each do |t|
	Rake::Task["deploy:#{t}"].clear
end

Rake::Task[:deploy].clear

capistranoを使おう

[vagrant@localhost capistrano]$ gem list
capistrano (3.11.0)

既に入ってますね。

cap installでインストールします。
[vagrant@localhost capistrano]$ cap install
mkdir -p config/deploy
create config/deploy.rb
create config/deploy/staging.rb
create config/deploy/production.rb
mkdir -p lib/capistrano/tasks
create Capfile
Capified

Capistranoとは

Ruby製の自動デプロイツール
デプロイ作業をコマンド数行で実行

Capistranoタスク自体は「コマンドを順番に実行する」だけ

覚えること
-Capistranoのモデル
-Capistranoのワークフロー
-Capistranoの設定ファイルの書き方

capistranoを理解する為に必要なこと
-Capistrano
-ライブラリ
-設定ファイル
-ホスト

Capistranoの要素
-capコマンド
-Capistranoのライブラリ
-デフォルトのデプロイタスク

ライブラリやデフォルトタスクを利用して設定ファイルを記述し、capコマンドで事項する。

ライブラリ
Capistranoはフレームワークでライブラリを利用できる。具体的には以下。
-Rubyライブラリ
-Capistrano拡張

設定ファイル
一度だけ使う設定はライブラリではなく、設定ファイルに記述する。
– config/deploy.rb
– config/deploy/任意のステージ名.rb

ホスト
デプロイにあたって、実行する対象マシンは「ローカルマシン」と「サーバー」の二つ

Capistranoのワークフロー
– capitstranoインストール
– 設定ファイルのひな形をつくる
– 設定ファイルのカスタマイズ
– capコマンドを実行

config/deploy/stage.rb

server 'localhost', user: 'vagrant', roles: %w{web}
set :repo_url, 'git@github.com:mumoshu/finagle_sample_app'

fetch :repo_url
#=> "git@github.com:mumoshu/finagle_sample_app"

task :uptime do
	run_locally do
		output = capture "uptime"
	end
	on roles(:web) do
		output = caputer "uptime"
	end
end

# ソースコードの取得
set :application, 'finalge_sample_app'
set :repo_url, 'git@github.com:mumoshu/finagle_sample.git'

task :update do
	run_locall do
		application = fetch :application
		if test "[ -d #{application} ]"
			execute "cd #{application}; git pull"
		end
	else
		execute "git clone #{fetch :repo_url} #{application}"
	end
  end
end

task :archive => :update do
	run_locally do
		sbt_output = capture "cd #{fetch :application}; sbt pack-archive"

		sbt_output_without_escape_sequences = sbt_output.lines.map {|line| line.gsub(/\e\[\d{1,2}m/,''])}.join

		archive_relative_path = sbt_output_without_escape_sequences.match(/\[info\] Generating (?<archive_path>.+\.tar\.gz)\s*$[:archive_path]
		archive_name =archive_relative_path.match(/(?<archive_name>[^\/]+\.tar\.gz)$/)[:archive_name]
		archive_absolute_path = File.join(capter("cd #{fetch(:application)}; pwd").chomp, archive_relative_path)

		info archive_absolute_path
		info archive_name

		set :archive_absolute_path, archive_absolute_path
		set :archive_name, archive_name
	end
end 

task :deploy => :archive do
	archive_path = fetch :archive_absolute_path
	archive_name = fetch :archive_name
	release_path = File.join(fetch(:deploy_to), fetch(:application))

	on roles(:web) do
		unless test "[ -d #{release_path} ]"
			execute "mkdir -p #{release_path}"
		end

		upload! archive_path, release_path

		execute "cd #{relase_path}; tar -zxvf #{archive_name}"

	end
end