CIサービスであるwerckerはGitHubやBitbucketなどのプライベートレポジトリも フリーで扱えます。
CIサービスだとTravis CIも有名ですがTravis CIだとプライベートレポジトリは有料なので プライベートレポジトリを扱いたい時はwerckerを使っています。
OctopressのブログのソースコードをBitbucketにおいてそれをwerckerでビルド、 GitHubへ送る、みたいなことをしてるのですが、それが突然deployに失敗していた件について。
- werckerを使ってBitbucketのプライベートレポジトリからOctopressを自動デプロイする
- 起こった問題
- add-to-known_hosts
- ssh-keygenの
-E
オプション - Envoronmentにある鍵について
werckerを使ってBitbucketのプライベートレポジトリからOctopressを自動デプロイする
ここにあるようにOctopressの元のコードはBitbucketのプライベートレポジトリにおいて、
そこにpush
するとwerckerが働いてビルドする仕組みになっています。
ビルドされたものはwerckerによってGitHubへdeployされ公開されます。
起こった問題
新しくポストを書いて送った所、何故かアップデートされないな、と思ったら deployのところで
## Pushing generated ./_deploy website
Host key verification failed.
fatal: Could not read from remote repository.
みたいなエラーが出ていました。 ただ、これはOctopressのRakefileの仕様が悪いですが、 このエラーが起こってもそのままスクリプトが進む仕組みになっていて werckerはエラーになってませんでした。
なのでログ読んで初めて実際にはGitHubに送られてなかったということが分かるという。。。
add-to-known_hosts
それはともかく、このエラーは少なくとも数日前には出てなかったようなんですが
なんだろうと思って調べていくと、
これを行う前のadd-to-known_hosts
の所で
unknown option -- E
の様なエラーが出ていました。
werckerにはStepsという仕組みがあり、 その中で既に出来上がったひとかたまりのステップを使うことが出来、 それらを使うと複雑な作業もいくつかの変数を定義するだけで出来たりします。
steps serach とかから必要なものが探せます。
今回問題があったのはstep-add-to-known というステップで、 デプロイ先のGitHubなどのホストをknown_hostsファイルに登録するステップです。
このレポジトリを見てみると最近 コアスクリプトである run.sh に変更があり
ssh_key_fingerprint=$(ssh-keygen -l -f "$ssh_key_path" -E md5 | awk '{print $2}')
の様な行が追加されています。
この変更が追加されたのが3日前です。
この-E
オプションがな言うことでエラーを起こしています。
で、どうしたもんか、と思って調べてるうちについさっきまたアップデートがあり、
if [ "$WERCKER_ADD_TO_KNOWN_HOSTS_USE_MD5" = "true" ]; then
ssh_key_fingerprint=$(ssh-keygen -l -f "$ssh_key_path" -E md5 | awk '{print $2}')
else
ssh_key_fingerprint=$(ssh-keygen -l -f "$ssh_key_path" | awk '{print $2}')
fi
な感じにuse_md5
という値をtrue
にしない限りは以前のまま-E
を使わない様に変更されました。
これによってさっきまでエラーを起こしてたdeployプロセスをそのままやり直すだけで上手くdeploy出来る様になりました。
ssh-keygenの-E
オプション
この-E
オプションはkey fingerprint(鍵指紋)のアルゴリズムを指定するオプションで
md5
かsha256
が選べますが
このオプションが導入されたのはOpenSSH 6.8からです。
これ自体は2年くらい前にリリースされてますが
古い環境だと古いOpenSSHがインストールされていてssh-keygen
に-E
が付いてなかったりします。
(ssh -V
でバージョン確認。)
また、6.8より前ではmd5
を使っていたのに対し、
6.8以降はsha256
がデフォルトになったので
同じ鍵指紋を使いたい場合には-E md5
が必要になります。
一方、werckerは現在Dockerベースになっていて読んでくるbox
によって環境が代わりますが、
使っているのはruby
というboxでこれに入ってるOpenSSHが古いようです。
boxによっては新しいOpenSSHが入っている環境もあるので、
その場合にはuse_md5: true
を指定するかsha256な鍵指紋を与える必要があります。
ただ現状のadd-to-known_hostsだとその辺自分で先に調べておかないといけないのでちょっと不便かもしれません。
OpenSSHのバージョンが6.7以前なら-E
使わずにmd5を使うだけにするとかスクリプトに足すとか。
この辺変更があったばっかなのですぐにアップデートされるかもしれないのでちょっと様子見で、
アップデートされそうならちょっとpull requestでも出してみます。
追記: 2017/12/29
werckerのruby boxがアップデートされてOpenSSH 7.0が使われる様になりました。
なのでuse_md5
を使わないとSHA256の方が使われる様になったので
SHA256の値に置き換えておきました。
追記ここまで
Envoronmentにある鍵について
werckerからGitHubにデプロイするのにこれ以外にデプロイ用の鍵が必要ですが、 鍵はwerckerのWebインターフェースから作ることが出来ます。
作ると各アプリケーションページのEnvironmentの所に登録されるんですが、 今見た所ここに何もありません。
最初、鍵が勝手に消えてしまったためにデプロイに失敗したのだと思って作り直して 登録し直したりしましたが上手く行かず、色々やってるうちに上にあるように出来る様になったわけです。
もう一つ別のレポジトリが同様に以前鍵を作っていて鍵が消えたままの状態でしたが こちらは鍵を作り直さずにadd-to-known_hostsが治った段階で上手くいったので どうも以前の鍵が消えてるわけでは無さそう。
werckerのインターフェースや仕組み自体も大分大きく変わったので それ以前に作っていた鍵はこの欄から消えている? (そうすると新たに公開鍵を渡したりは出来ないわけですが その場合はまた新しく作れば良い、ということか。。。?)