GeekFactory

int128.hatenablog.com

Gradle SSH Plugin 2.4.0をリリースした

Gradle SSH Plugin 2.4.0、Groovy SSH 2.4.0をリリースしました。

github.com

2.4.0の変更点

New features:

  • Host key checking for gateway access
  • Put files filtered by given closure
  • Get files filtered by given closure
  • Add ssh.runtime object in CLI

Bug fixes:

  • Skip lecture message from sudo result
  • Specify null as UserInfo to prevent changing known_hosts

Host key checking for gateway access

ゲートウェイサーバを経由して多段接続する場合でも known_hosts が使えるようになりました。例えば、localhost→A→Bのように踏み台Aを経由してBに接続する場合、Bは実際にはポートフォワードの接続先(localhost:xxxxx)に見えるため、ホスト鍵の検証に失敗する問題がありました。2.4.0からは known_hosts に含まれるBをポートフォワードの接続先に読み替える実装を追加しました。

Get/Put files filtered by given closure

これまで get put メソッドはすべてのファイルを再帰的に転送する機能しか提供していませんでしたが、2.4.0からはクロージャでフィルタする機能も提供するようになりました。

get from: '/remote/folder', into: buildDir, filter: { it.name =~ /\.xml$/ }

put from: buildDir, into: '/remote/folder', filter: { it.name =~ /\.xml$/ }

SFTP/SCP×GET/PUTのすべての組み合わせに手を入れる必要があったため、実装は随分と骨の折れる作業になりました。

Add ssh.runtime object in CLI

Groovy SSHスタンドアロンJARを利用する場合に ssh.runtime.jar でJAR自身を参照できるようになりました。これにより、リモートホストにJARを転送してスクリプトを実行する処理を簡単に記述できます。まあ、スタンドアロンJARのテストでうれしいだけかもしれませんが。

ssh.run {
    session(ssh.remotes.tester) {
        put from: ssh.runtime.jar, into: '.'
        execute 'java -jar gssh.jar --version'
        execute 'java -jar gssh.jar --help'
    }
}

Skip lecture message from sudo result

sudoコマンドを実行して最初にlecture messageが表示された場合に、コマンドの実行結果にlecture messageが含まれてしまう問題を修正しました。

振り返り

ここに書いている以外にもOS Integration TestをすべてEC2に追い出すとか、Circle CIへの移行に取り掛かるといった改善をやっていました。ビルドやCIの改善に手を付け始めるとあっという間に時間を使ってしまい、気が付けば2.4.0のリリースが月末になってしまいました。

現状ではCIに7〜8分を要しているので、以下の改善に手を付けたいです。

  • DockerのSSHコンテナを利用してOS Integration Testを実行する(EC2は廃止)
  • Plugin Integration Testの対象バージョンを1系に限定する
  • 効率的なキャッシュ