はじめに
- やりたかったことはシンプルで、ssh-agent/ssh-addをSSHの設定を入れようとしただけです
- Gemfileのソースにプライベートリポジトリを指定していたため、設定しなければgit cloneに失敗するのです
- そのため、SSHの設定をしなければならなかったのです
- ちなみに、~.netrcに書いてhttp経由でgit cloneする方法は試して問題なくできていましたが、TravisではやりたくなかったのでSSH経由を考えました
なんら困らない書き方
- .travis.ymlに以下のようにべた書きする
.travis.yml
...
before_install:
- eval `ssh-agent -s`
- ssh-add [key path] #ex) .travis/travis_key
...
今回はまった書き方
- .travis.ymlにすべてを書きつくせば1ファイルですみますが、ドエライ量になります
- おまけに、ここは条件分岐、ここは関数でと考えていけば複雑になってきて1ファイルでは辛くなってきますよね
- そこで、私はRAILS_ROOTに.travisディレクトリを作って、その下にスクリプトファイルを突っ込んで.travis.ymlではそれを実行するようにしました
- すると以下のようになります
.travis.yml
...
before_install: ruby .travis/before_install.rb
...
.travis/before_install.rb
[ 'eval `ssh-agent -s`',
'ssh-add .travis/travis_key'
].each {|c| system(c)}
- その他にも色々なコマンドをこの形式で書いていたので、これで大丈夫だと思ったのですがダメでした
- どうダメだったかというと、エラーなどは出ることなくAGENT PIDも出力されていたのですがSSHで失敗するのです
- 余談ですが、.travis/xxxx.rbのファイル名はbefore_script.rb/after_success.rbなど.travis.yml内に登場するものと一致させておいたらどこに何がかいてあるか一目瞭然ですね!
追っかけてみた
-
echo $SSH_AGENT_PID
を追加してeval `ssh-agent -s`
の前後で比べてみる - 「なんら困らない書き方」のほうはssh-agentで出力されたPIDが$SSH_AGENT_PIDになっていた
- 一方、「今回はまった書き方」のほうは$SSH_AGENT_PIDが変更されていなかった。。
- すなわち、ssh-agent/ssh-addが効いていないm(__)m
- Rubyのsystem()とか使わず、Shellのファイルで実行すればと思ったのですが結果は同じでした
- おそらくはシステムの環境変数絡みのものはTravisの親プロセス(.travis.yml側)で書かなければならないのかなと
結論
- 私はどっぷり1日はまっていたので、ほかの人そうならず幸せになれればと思い記事に残しました
- そして、この1行くらい.travis.ymlに書けばいいじゃない!キリッという結論に至りました
- そう、長ったらしいコマンドでもなくパッと見て意味の分からないコマンドでもないのだから
参考文献
- http://www.gfd-dennou.org/arch/morikawa/memo/ssh-agent.txt
- http://tipspc.blogspot.jp/2010/02/ssh-agent.html
~ただの宣伝~
- 全国のSeleniumer必読
- Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください