Vagrant の Rsync Synced Folders を設定して、ホスト側とゲスト側のディレクトリを同期する
以下の「Vagrant と VirtualBox で自由に汚せるローカル環境を構築する」と「Vagrant と VirtualBox 作ったローカル環境に Ruby をインストールする」の続きです。
Vagrant では Vagrantfile のあるディレクトリと Vagrant 上の /vagrant
が同期されています。
Vagrant 上で触りたいファイルなどがあったら、Vagrantfile のあるディレクトリにコピー(または、移動)しておく必要があるのですが、Vagrantfile のあるディクレトリ以外で作業していた場合、ファイルに手を加えるたびにこれをやるのは結構めんどくさい!
(もちろん、コピーや移動しなくても、Vagrantfile と同じディレクトリで作業したり、最初から Vagrant 上で作業するという方法もありますが。。)
なので、Vagrant の Rsync Synced Folders を使って、ホスト(Mac や Windows などのローカル)上の特定のディレクトリに変更があったら、自動でゲスト(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
に同期されなくなります)
オプションに詳細についてはこちら↓
- RSync - Synced Folders - Vagrant by HashiCorp(公式ドキュメント)
https://www.vagrantup.com/docs/synced-folders/rsync.html
ディレクトリの同期
vagrant up すると、そのタイミングでホスト側とゲスト側のディレクトリが同期されます。
$ vagrant up
この後、同期しようとするたびに毎回 vagrant up するのは大変なので、ホスト側のディレクトリに変更が入ったら、自動でゲスト側のディレクトリにも同期するために、続けて以下のコマンドを実行します。
$ vagrant rsync-auto
たったこれだけでホスト上のファイルに何か変更が入るたびにゲスト上にも反映されるので、とっても便利ー!
参考
ちなみに、設定を行うにあたり、以下を参考にさせていただきました。
Vagrantのsynced_folderはrsyncで
http://lealog.hateblo.jp/entry/2016/04/16/145107
Vagrant RSync でローカル開発環境を作る際に注意すべきこと
http://blog.hotolab.net/entry/vagrant_rsync
Vagrantでゲストとホストのフォルダを共有する
http://koltatt.net/programing/vagrant_dirsync/
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 で自由に汚せるローカル環境を構築する」の続きです。
Vagrant と VirtualBox で構築したローカル環境に 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 ~]$
[vagrant@localhost ~]$ exit
仮想マシンの終了
以下のコマンドで仮想マシンが終了できます。
$ vagrant halt ==> default: Attempting graceful shutdown of VM...
これで自由に汚してしまえる?ローカル環境が手に入ったので、いろいろ試してみたいと思いますー
関連記事
本記事に関連する記事です。よろしければどうぞー!
コマンドラインから 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