トップ 最新 追記

2013-06-04 [長年日記]

_ Windows + 公開鍵認証でCapistrano

できた。ハマるポイントがいくつかあったのでメモを残しておく。

確認したのは

  • Windows Vista/7
  • Ruby 1.9.3-p429
  • Capistrano というか net-ssh 2.6.7
  • Putty 0.6.2

password認証ならたぶん何も考えなくていい

でもねぇ。

経路にもよるけど公開している ssh サーバにパスワード認証で繋がないでしょ?

proxyは試してないのであしからず

ということです。

cygwinでやれるならそれでいいかも

Windows 環境とは別個の閉じた環境で Ruby も ssh(正確にはopenssl) も利用できれば openssh の公開鍵認証が普通に利用できるはず。

少なくとも mingw Ruby + cygwin + openssh 鍵の組み合わせならパスフレーズを聞かれて普通に認証できた。ただ、なぜこのような動作になったのかはイマイチ合点がいっていないことと、deploy のためだけに cygwin を入れるのはまったく目的に合ってないのでこれは深追いしていない。

cygwinなしの場合はpageant頼み

これはそもそもそういう設計になってる。

  • Net::SSH::KeyFactory の理解できる鍵は OpenSSL で理解できる鍵
  • PLATFORM を判別して :win32 の場合は pageant で処理するコードが読み込まれる
    • pageant とは Windows の API を通じてやりとりしているので要は起動してりゃオッケー。PATH が通っている必要なし。試したところ 32bit/64bit どちらでも同じように処理できるみたい。

というツクリになっている。まとめると

Windows では pageant に丸投げ

である。

Rubyは1.9以降で

Ruby 1.8 では OpenSSL 周りのエラーが出てまともに動かなかった。Windows では 1.9 の方が明らかに速いはずなので、素直に 1.9 以降を入れればいいと思う。

自分が試したのは RubyInstaller for Windows の 1.9.3-p429

:keysの設定が必須でしかもなんか変

config/deploy.rb で

ssh_options[:keys] = ["'~/.ssh/id_rsa'"]

あるいは

ssh_options[:keys] = %w('~/.ssh/id_rsa')

のように設定が必須だった。注意すべきは以下の3点。

  1. OpenSSH の鍵認証の場合は正しくデフォルトの鍵を認識してくれる
  2. OpenSSH の ssh-agent を使っている場合はそもそも鍵のパスを与える必要がない(サーバ側の公開鍵とのペアを agent が覚えている中から自動で探してくれる)
  3. :keys には「文字列の文字列の配列」を与える必要がある。

1, 2 は OpenSSH で十分な経験がある人がハマる罠。

3 は Ruby に慣れてる人がハマる罠。

コードを読んでみたが、なぜこのような挙動になるのかは理解できなかった。無念。

公開鍵がないことが原因ではない

上の設定をミスっていると

ArgumentError: Could not parse PKey: no start line

というエラーが出る。これの回答として対応する公開鍵がないからだというものが github などに上がっているんだけど、すでに見たように

公開鍵がないからとは限らない

ので注意が必要。


2013-06-15 [長年日記]

_ Kanazawa.rb meetup #10に飛び入りしてまたノースライドで喋ってきた

今回は実は以前から分かっていた個人的な事情とさらにやんごとなき事情が重なって、準備の手伝いもしてないし、不参加を最初から決めていたんだけど、どうもこれは企画の重さで大変なことになってないかな?と思い、無理矢理 meetup だけ 参加表明せずに参加してきた。

そう、つまり飲んでないのです。ビールクズの名折れ…。

そこで

  1. Git入門
  2. GitHub入門
  3. Pull-req入門

の話があったんですが、どうもこの 3 の pull-req の話の前に branch の話がこなれてなくて、branch, clone, fork, push, rebase, merge の話がやや渾然一体となった感じで受け止められている気がしたので、以下のような話を飛び入りでしました。

そして以下のような話を。

  • 「branch の正体を知るといいよ」「branch は commit の alias なんだよ!」「???」「branch は名前を付けた何かの commit、その commit に次の commit を重ねれば名前の指す先が変わる」「だから pull-req 用の branch を作って放置するのがベストプラクティス」

結局は Pro Git のこの話

Git - ブランチとは

なんですが。

で、atomic commit の話を少々。

  • 「”明日の自分”を含む他人が読んで分かることが大事」「読みやすく分かりやすい commit こそ受け入れられやすい。pull-req の話は結局それ」
  • 「branch って大げさに聞こえるけど git の (local)branch はとてもお手軽で便利」「だから”あれもこれも branch をうまく使えば実現できるよね?”と気づいたコミュニティのノウハウが多い」
  • 「”今からやる作業の名前を付けた branch”を作るという習慣」「余計な commit を入れにくくなる」「大きな commit は扱いにくい。小さく」

てな感じ。

Kanazawa.rb でがっつり Git の話をしたのは初めてで、今までにない面白さだった。普段から commit 単位とか branch の運用(これは学習機会など様々な要因で考え方が変わる)とか頭を悩ませているので、ここぞとばかりに喋ることができて

個人的には面白かった

んだけど、ちゃんとウケたのかどうか、そう言えばあんまり気にしてなかった…。

どうもすいません、またリベンジしましょう。