rcmdnk's blog

プリミティブby Kathy Deployディッシュタオル

CIサービスであるwerckerはGitHubやBitbucketなどのプライベートレポジトリも フリーで扱えます。

CIサービスだとTravis CIも有名ですがTravis CIだとプライベートレポジトリは有料なので プライベートレポジトリを扱いたい時はwerckerを使っています。

OctopressのブログのソースコードをBitbucketにおいてそれをwerckerでビルド、 GitHubへ送る、みたいなことをしてるのですが、それが突然deployに失敗していた件について。

Sponsored Links

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(鍵指紋)のアルゴリズムを指定するオプションで md5sha256が選べますが このオプションが導入されたのはOpenSSH 6.8からです。 これ自体は2年くらい前にリリースされてますが 古い環境だと古いOpenSSHがインストールされていてssh-keygen-Eが付いてなかったりします。 (ssh -Vでバージョン確認。)

openssh release-6.8

また、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でも出してみます。

Envoronmentにある鍵について

werckerからGitHubにデプロイするのにこれ以外にデプロイ用の鍵が必要ですが、 鍵はwerckerのWebインターフェースから作ることが出来ます。

作ると各アプリケーションページのEnvironmentの所に登録されるんですが、 今見た所ここに何もありません。

最初、鍵が勝手に消えてしまったためにデプロイに失敗したのだと思って作り直して 登録し直したりしましたが上手く行かず、色々やってるうちに上にあるように出来る様になったわけです。

もう一つ別のレポジトリが同様に以前鍵を作っていて鍵が消えたままの状態でしたが こちらは鍵を作り直さずにadd-to-known_hostsが治った段階で上手くいったので どうも以前の鍵が消えてるわけでは無さそう。

werckerのインターフェースや仕組み自体も大分大きく変わったので それ以前に作っていた鍵はこの欄から消えている? (そうすると新たに公開鍵を渡したりは出来ないわけですが その場合はまた新しく作れば良い、ということか。。。?)

Sponsored Links
Sponsored Links

« Homebrewで直接インストールしたか依存関係でインストールされたか確認出来る様になった stow-getでコマンドラインパッケージのインストール方法を簡単に確認出来る様にした »