てくてくテック☆

千里の道も一歩から。テック(Tech)の道をてくてく歩く。

Vagrant の Rsync Synced Folders を設定して、ホスト側とゲスト側のディレクトリを同期する

以下の「Vagrant と VirtualBox で自由に汚せるローカル環境を構築する」と「Vagrant と VirtualBox 作ったローカル環境に Ruby をインストールする」の続きです。

teku2tech.hateblo.jp

teku2tech.hateblo.jp   

Vagrant では Vagrantfile のあるディレクトリと Vagrant 上の /vagrant が同期されています。
Vagrant 上で触りたいファイルなどがあったら、Vagrantfile のあるディレクトリにコピー(または、移動)しておく必要があるのですが、Vagrantfile のあるディクレトリ以外で作業していた場合、ファイルに手を加えるたびにこれをやるのは結構めんどくさい!
(もちろん、コピーや移動しなくても、Vagrantfile と同じディレクトリで作業したり、最初から Vagrant 上で作業するという方法もありますが。。)

なので、VagrantRsync Synced Folders を使って、ホスト(MacWindows などのローカル)上の特定のディレクトリに変更があったら、自動でゲスト(Vagrant)上のディレクトリに同期されるようにしたいと思います。
 

VagrantFile の設定

VagrantFile で config.vm.synced_folder がコメントアウトされている箇所があるので、以下のとおり、設定を追加します。

Vagrant.configure("2") do |config|
  config.vm.synced_folder "~/vagrant", "/home/vagrant",
    type: "rsync",
    rsync__exclude: [".git/"]
end

config.vm.synced_folder の後に "ホスト側のパス"、"ゲスト側のパス" の順、type に "rsync" を指定すれば、ディレクトリの同期ができます。
上記の設定例だと、Mac 上の ~/vagrant に変更が入ったら、Vagrant 上の /home/vagrant に同期しますよ、という意味になります)

rsync__exclude はオプションなので、指定してもしなくてもどちらでも OK!
設定したい場合は以下を参考にしつつ、お好みでどうぞー。
(ちなみに rsync__exclude は同期の対象外にしたいものを指定できるオプションです。上記の設定例だと、~/vagrant/.git/ 内は /home/vagrant に同期されなくなります)

オプションに詳細についてはこちら↓

ディレクトリの同期

vagrant up すると、そのタイミングでホスト側とゲスト側のディレクトリが同期されます。

$ vagrant up

この後、同期しようとするたびに毎回 vagrant up するのは大変なので、ホスト側のディレクトリに変更が入ったら、自動でゲスト側のディレクトリにも同期するために、続けて以下のコマンドを実行します。

$ vagrant rsync-auto

 

たったこれだけでホスト上のファイルに何か変更が入るたびにゲスト上にも反映されるので、とっても便利ー!
 

参考

ちなみに、設定を行うにあたり、以下を参考にさせていただきました。
 

2017/12/19 追記:

type に rsync を指定した場合、ホストからゲストの一方向しか同期されないことが判明。。
ホスト側でしか作業しない(ホスト側を正としたい)場合はこれでもいいですが、ゲスト側で行った変更をホスト側にも反映したい(双方向で同期したい)場合は、Vagrantfile を以下のようにします。

Vagrant.configure("2") do |config|
  config.vm.synced_folder "~/vagrant", "/home/vagrant"
end

こうすると、vagrant rsync-auto しなくても自動でホスト側とゲスト側が双方向同期に!
 

Vagrant と VirtualBox 作ったローカル環境に Ruby をインストールする

以下の「Vagrant と VirtualBox で自由に汚せるローカル環境を構築する」の続きです。

teku2tech.hateblo.jp   

VagrantVirtualBox で構築したローカル環境に rbenv で Ruby をインストールしたいと思います。
なので、以下の作業は対象の環境で vagrant up と vagrant ssh をした後からの手順になります。
 

Git のインストール

rbenv をインストールするのに Git が必要なので、以下のコマンドを実行して、Git をインストールします。

$ sudo yum install git

 

rbenv のインストール

以下のコマンドを実行して、rbenv をインストールします。

$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

 

.bash_profile の追加

rbenv のインストールができたら、以下のとおり、パスを通しておきます。
(ついでに、シェルの起動時に rbenv を初期化されるようにして、設定ファイルの読み込み直しとシェルの再起動も行っています)

$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source ~/.bashrc
$ exec $SHELL -l

パスが通っているかを確認するために、以下のコマンドを実行します。
(rbenv のバージョンを確認するためのコマンドです)

$ rbenv -v
rbenv 1.1.1-6-g2d7cefe

rbenv のバージョンが表示されれば OK!
 

ruby-build のインストール

以下のコマンドを実行して、rbnev のプラグインである ruby-build をインストールします。
(インストールすると ruby install コマンドが使えるようになります)

$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

さらに、ruby-build を使うにあたり、推奨されているツール類もインストールしておきます。

$ sudo yum install -y gcc-6 bzip2 openssl-devel libyaml-devel libffi-devel readline-devel zlib-devel gdbm-devel ncurses-devel

※ 詳細はこちらを参照 → https://github.com/rbenv/ruby-build/wiki
 

Ruby のインストール仮想マシンの起動

以下のコマンドで、Ruby をインストールします。

$ rbenv install 2.3.1

インストール可能な ruby のバージョンは以下のコマンドで確認できます。

$ rbenv install -l

 

Ruby のインストールで BUILD FAILED になったら。。

Ruby のインストールで以下のようなエラーが出た場合は、ログファイルを確認します。

$ rbenv install 2.3.1
Downloading ruby-2.3.1.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.bz2
error: failed to download ruby-2.3.1.tar.bz2

BUILD FAILED (CentOS release 6.5 (Final) using ruby-build 20170914-5-gf41e847)

ログファイルを確認してみると

$ cat /tmp/ruby-build.20171028150413.2435.log 
/tmp/ruby-build.20171028150413.2435 ~/ruby_lessons
curl: (35) SSL connect error

curl でこけてることが判明。。orz

調べてみると、リポジトリから提供されている curl(libcurl) のバージョンが古いことが原因のよう。
ソースからインストールする方法もありますが、大変なので別のリポジトリを追加して、そこから curl をアップデートします。

$ sudo rpm -Uvh http://www.city-fan.org/ftp/contrib/yum-repo/city-fan.org-release-1-13.rhel6.noarch.rpm
$ sudo yum update --enablerepo=city-fan.org libcurl

※ 追加したリポジトリはこちら → http://www.city-fan.org/ftp/contrib/yum-repo/

curl をアップデートしたら、Ruby をインストールしてもエラーが出ないようになりました!

 

Ruby のバージョン指定

Ruby がインストールできたら、以下のコマンドで システム全体に適用したいバージョンを設定します。

$ rbenv global 2.3.1

バージョンが設定できているかを確認するために、以下のコマンドを実行します。
(* がついているのが、システム全体に適用されている Ruby のバージョンです)

$ rbenv versions
* 2.3.1 (set by /home/vagrant/.rbenv/version)

 

無事に Ruby がインストールできたので、まずはドットインストールの Ruby 入門 あたりをやってみようと思いますー

 

Git で作業中のブランチに他ブランチの特定の commit を反映する

これから作業予定のブランチで master に取り込まれ待ちの別ブランチの commit の内容が必要だったので、その commit をこれから作業予定のブランチにも持ってくることにしました。
 

今の状況

master に取り込まれ待ちの別ブランチが 【ブランチ A】 で、これから作業予定のブランチが 【ブランチ B】 です。
 

ブランチ A (master から作成)

フォルダ X とその配下にファイル A を作成して commit 済み
master に push し、取り込み待ちの状態
(ブランチ A の commit はゆくゆく master に merge されることは確定済み)
 

ブランチ B (master から作成)

フォルダ X の下にファイル B を作成して commit したい
でも、master にブランチ A の commit がまだ取り込まれていないので、ブランチ B 作成時点ではフォルダ X がない
かといってブランチ B でもフォルダ X を作ると、master に merge するときにコンフリクトを起こすはず。。
そのときは手動で merge すればいいだけの話だけど、なんとなく嫌だ!
 

cherry-pick コマンドでブランチ B にブランチ A の特定の commit を反映する

調べてみたら、こういうときは cherri-pick コマンドが使えるとわかったので、早速お試し。
以下、手順です。
 

ブランチ A の commit ID を調べる

これから作業予定のブランチ(ブランチ B)に持っていきたい別ブランチ(ブランチ A)の commit の commit ID を調べます。

$ git checkout branch-a
$ git log
commit 1234567890abcdefghij1234567890abcdefghij
Author: hogehoge <hogehoge@mail.com>
Date:   Wed Nov 1 12:34:56 2017 +0900

    add file-a.md

上記の 1234567890abcdefghij1234567890abcdefghij の部分をコピーしておきます。
 

ブランチ B にブランチ A の commit を反映する

これから作業予定のブランチ(ブランチ B)に切り替え、先ほど調べた commit ID を使って、cherry-pick コマンドを実行します。

$ git checkout branch-b
$ git cherry-pick 1234567890abcdefghij1234567890abcdefghij

これでブランチ B にブランチ A の commit 内容が適用されます。簡単!
あとは master に取り込まれるときに問題ないことが分かればバッチリ。
 


今回は cherry-pick コマンドを使ってみたけど、他にも方法があったりするのかなー??

もし、もっといい方法が見つかったら、また追記しようと思います。
 

2017/11/07 追記:

コンフリクトなどの問題が起きることなく、無事に master に取り込まれることを確認!

ちなみに、特定の commit ではなく、ブランチまるごと反映させたい場合は以下のコマンドでできます。
(ブランチ A をブランチ B に反映させてます)

$ git pull origin branch-a:branch-b

こちらの方法でも問題なく、master に取り込まれるのを確認済みです。
 

Vagrant と VirtualBox で自由に汚せるローカル環境を構築する

これまで自宅用 Mac に直接あれこれインストールしていて、どんどん環境が汚れていく?のが気になったので、Vagarnt と VirtualBox でローカル環境を作ってみることにしました。
 

VirtualBox のインストール

以下から VirtualBox をダウンロードして、インストールします。

https://www.virtualbox.org/wiki/Downloads

2017/10/28 現在の VirtualBox 最新バージョンは 5.2.0
 

Vagrant のインストール

以下から VirtualBox をダウンロードして、インストールします。

https://www.vagrantup.com/downloads.html

2017/10/28 現在の Vagrant 最新バージョンは 2.0.0
 
 

box ファイルの追加

以下のコマンドを実行して、Vagrant の box ファイルをダウンロードします。
(ダウンロードする box ファイルの OS やバージョンなどはお好みで)

$ vagrant box add CentOS_7.1 https://github.com/CommanderK5/packer-centos-template/releases/download/0.7.1/vagrant-centos-7.1.box

ちなみに box ファイルのダウンロードは結構時間がかかります。
(今回、CentOS 7.1 をダウンロードしたと見せかけて、後述の手順では過去にダウンロード済みだった CentOS 6.5 の box ファイルを使ってたり。。)
 

Vagrant の初期化

以下のコマンドを実行して、Vagrant を初期化します。 (vagrant init した場所に Vagrantfile が作られるので、コマンドを実行する前に cd などでディレクトリを移動しておく必要あり)

$ vagrant init CentOS_7.1

 

仮想マシンの起動

以下のコマンドで仮想マシンを起動します。
(Vagrantfile のある場所でコマンドを実行)

$ vagrant up

 

仮想マシンの起動時にエラーが出たら。。

vagrant up したときに以下のようなエラーが出た場合は、Vagrant が対応していないバージョンの VirtualBox をインストールしている可能性があります。

$ vagrant up
No usable default provider could be found for your system.

Vagrant relies on interactions with 3rd party systems, known as
"providers", to provide Vagrant with resources to run development
environments. Examples are VirtualBox, VMware, Hyper-V.

The easiest solution to this message is to install VirtualBox, which
is available for free on all major platforms.

If you believe you already have a provider available, make sure it
is properly installed and configured. You can see more details about
why a particular provider isn't working by forcing usage with
`vagrant up --provider=PROVIDER`, which should give you a more specific
error message for that particular provider.

 
以下のコマンドで対応している VirtualBox のバージョンを確認してみると、今回インストールした Vagrant 2.0 に VirtualBox 5.2.0 は対応していないことが判明。。orz

$ vagrant up --provider=virtualbox
The provider 'virtualbox' that was requested to back the machine
'default' is reporting that it isn't usable on this system. The
reason is shown below:

Vagrant has detected that you have a version of VirtualBox installed
that is not supported by this version of Vagrant. Please install one of
the supported versions listed below to use Vagrant:

4.0, 4.1, 4.2, 4.3, 5.0, 5.1

A Vagrant update may also be available that adds support for the version
you specified. Please check www.vagrantup.com/downloads.html to download
the latest version.

しょうがないので VirtualBox 5.1.30 を再インストールして、vagrant up したら無事に起動できました。
 

仮想マシンSSH ログイン

以下のコマンドで vagrant up した仮想マシンssh でログインできます。

$ vagrant ssh
[vagrant@localhost ~]$ 

 
仮想マシンssh を終了するには exit で!

[vagrant@localhost ~]$ exit

 

仮想マシンの終了

以下のコマンドで仮想マシンが終了できます。

$ vagrant halt
==> default: Attempting graceful shutdown of VM...

 

これで自由に汚してしまえる?ローカル環境が手に入ったので、いろいろ試してみたいと思いますー
 

関連記事

本記事に関連する記事です。よろしければどうぞー!

teku2tech.hateblo.jp

teku2tech.hateblo.jp

コマンドラインから GitHub のプルリクエストをする方法

add や push なんかはコマンドラインでできるのに、プルリクしたいと思ったら、 わざわざ GitHub のサイト開かなきゃいけないなんてめんどくさい!

そう思ったので、何か方法はないか探してみたら、hub コマンドっていう便利なものがありました!
使い方もめちゃ簡単!(詳細は以下を参照)

1. hub のインストール

以下のコマンドを実行する。 (ダウンロードには少し時間がかかるかも。。)

$ brew install hub --HEAD

このとき、以下のようなエラーが出ることが。

$ brew install hub --HEAD
Error: You have not agreed to the Xcode license. Please resolve this by running: sudo xcodebuild -license accept

そのときは大人しく、指示どおりに以下のコマンドを実行すれば OK!

$ sudo xcodebuild -license accept

2. 設定ファイルの変更

.bash_profile に以下を追記します。

eval "$(hub alias -s)"

3. コマンドラインからのプルリク

途中まではいつもどおりの Git コマンドの操作で、push した後から hub コマンドの出番です。

$ git checkout -b hub-test
$ git add .
$ git commit -m "add hub-test.md"
$ git push origin hub-test
$ hub pull-request

たったこれだけ!
GitHub のサイトで確認すると、ちゃんとプルリクが作られてます!

ちなみに、プルリクするときに誰かにアサインしたい場合は以下のコマンドでいけます。

$ hub pull-request -a hoge

hoge のところに GitHub のアカウント名を指定する感じです。

すばらしい!!
めんどくささがだいぶ軽減されたし、プルリク忘れも減りそう。。嬉しすぎる!

参考

  • 本家(hub コマンド)のサイト github.com  

2017/10/27 追記:

hub pull-request で -a オプションを使うには 2.3.0-pre1 以上のバージョンが必要なので、--HEAD オプションなしに brew install すると、-a オプションが使えない可能性が。。!
(新しい PC をセットアップするときに、ハマりました。。orz)

念のため、インストール後はバージョン確認してみてくださいー

$ hub --version

あと、試してないですが、hub 2.3.0-pre10 から hub pull-request でレビュアがアサインができるようになったみたいです!

hub pull-request -r PERSON1,PERSON2