Jenkins を Docker 移行した

Jenkins を VM で動かしていたのを Docker に移行した。このタイミングで Jenkins 自体のバージョンも変わり、いくつか対応が必要だったのでメモ。

  • Docker イメージは、 Docker Hub の jenkins/jenkins で配布されている、 latest-jdk11 タグのものを利用した。(追記: jdk8 にしないと動かないプラグインがあった: Error Installing ruby runtime in Jenkins – Stack Overflow。依存関係で入っていたが、とにかく動かさないと削除すらできなかったので一度 jdk8 のイメージにした。jdk11 のイメージで起動した後 jdk8 に下げても問題はなかった。)
  • 旧 Jenkins の /var/lib/jenkins を丸ごとコピーし、新 Jenkins の /var/jenkins_home として見えるように Docker の volume で指定した。ただし、パーミッションの問題があったので、 UID を 1000 に chown -R した。パス、 UID についてはdocker/README.md at master · jenkinsci/dockerに書かれているもの。
    • Jenkins は思ったよりこの構造について保持されているらしく、これでユーザーもスレーブも鍵も、一通り必要なデータは移行されていそうに見えた。
  • スレーブへの ssh 接続が Java からのエラーでうまくいかない(解消してしまったのでログが見当たらない……)になる問題が発生した。見えているプラグインを全て自動更新すると解消した。参考:Jenkins をアップデートしたら SSH Build Agents で登録していたエージェントがつながらなくなった。プラグインアップデートしたら直った。 – Qiita
  • タイムゾーンが UTC になった。jenkins in docker – how to change timezone – Stack Overflowなどを参考に、 JAVA_OPTS の環境変数を "-Duser.timezone=Asia/Tokyo" とした。
  • Android Emulator Plugin が参照する、スレーブ側に置かれるファイルのパスが変わっているようだった。設定ファイルにある Android SDK パスを設定してもうまくいかなかった。個人的にもうこのプラグインはほぼ使わない予定(他の CI を設定したが、もうしばらく旧ビルド環境を残しておきたい程度)だったので、スレーブ側で ln -s /home/jenkins/.android/ /var/jenkins_home/.android として逃げた。

画面上には様々な警告が表示されており、色々対応が必要そうだが、一旦はこの変更で手元では動きそうだった。/var/jenkins_home/ (前は /var/lib/jenkins だった?)にあるファイルをそのままコピーして UID を合わせればとりあえず動くようなので、あとはプラグインごとに対応ということになりそうだ。