GeekFactory

int128.hatenablog.com

Circle CIでSSHサーバを利用する際の注意点

Circle CIでテストコードからローカルのSSHサーバを利用する際の注意点をメモします。

背景

SSHクライアントのテストでSSHサーバが必要なので、CI環境で用意したい。具体的には、Gradle SSH PluginのテストでCircle CIのSSHサーバを利用したい。

課題と対策

Circle CIではデフォルトでSSHサーバが起動しており、ubuntuユーザに対して公開鍵認証でログインできるようになっています。

私が試した範囲では以下の課題がありました。

  1. 一定時間ごとにホスト鍵が変わる
  2. ubuntuユーザへのログインに時間が掛かる

まず、一定時間(1〜2分?)ごとにSSHサーバのホスト鍵が変わるようです。これにより known_hosts に書かれたホスト鍵が古くなるため、Host Key Checkingに失敗します。デフォルトで起動しているsshdに問題があるようなので、以下のように別のsshdを起動したら解決しました。

test:
  pre:
    - sudo /usr/sbin/sshd -D -e -p 8022:
        background: true

追記: 別のsshdを起動する方法でもホスト鍵が変わる場合があるようです。メモリを大量に使用した場合かもしれません。対策はまだ見つかっていません。

また、CIを実行しているユーザ(ubuntu)へのログインは異常に時間がかかるため、スローテストの原因になります。おそらくubuntuユーザのログイン時に何かやっているためと思われます。これは別のユーザを作成したら解決しました。

# configure public key authentication
ssh-keygen -t rsa -N '' -f ~/.ssh/id_ext
sudo useradd -m tester
sudo -u tester -i mkdir -p -m 700 .ssh
sudo -u tester -i tee .ssh/authorized_keys < ~/.ssh/id_ext.pub
sudo -u tester -i chmod 600 .ssh/authorized_keys

# configure sudo without password
echo "tester ALL=(ALL) NOPASSWD: ALL" > /tmp/tester
sudo chmod 440 /tmp/tester
sudo chown 0.0 /tmp/tester
sudo mv /tmp/tester /etc/sudoers.d

なお、2の解決策を実施することでCIの所要時間が約8分から約5分に短縮されました。あくまでもGradle SSH Pluginの例なので参考ですが。

別の選択肢

以下の選択肢もあります。

  1. Dockerコンテナでsshdを実行してログインする
  2. EC2などにログインする

1はdocker pullでやや時間がかかります。2はレイテンシの影響を受けます。