Git で Jenkins のバックアップをしてみる

先日突然会社で使ってる Jenkins が起動しなくなってしまいました。さすがにもう二度とそんな思いはしたくないので、バックアップを取ることにしました。
Backup Plugin - Jenkins - Jenkins Wiki を使ってもいいんですが、git 使えば差分バックアップになるし、好きな時点に戻せて素敵なんじゃないかと思って git を使ってバックアップを取ることにしてみました。

この記事はその時のメモみたいなものです。

リポジトリの作成

まずは git のリポジトリを作ります。せっかくなのでスクリプトコンソールを使ってみます。スクリプトコンソールを開いて、以下を実行します。

dir = System.properties["JENKINS_HOME"]
def git = { Object[] cmd ->
  println new ProcessBuilder(["git"] + cmd.toList() as String[]).directory(new File(dir)).start().text
}
git "init"
git "config", "user.name", "Jenkins Backup"
git "config", "user.email", "jenkins@${InetAddress.localHost.hostName}"
new File("${dir}/.gitignore").text = """\
*.log
*.log.?
*.log.??
jobs/*/workspace
jobs/*/builds
"""
git "add", "--all"
git "commit", "-m", "Initial commit"

これで /var/lib/jenkins に git のリポジトリができます。除外対象は workspace, builds とログファイルにしました。

バックアップの設定

次に Hudson環境のバックアップ - ふぞろいのGENGOたち を参考にして、Exclusive Execution Plugin を入れて backup job を作ります。job は以下のように設定します。

  • ビルドトリガ: 定期的に実行
    • スケジュール: @daily
  • ビルド環境:
    • ビルドを排他的に実行: ON
#!/bin/sh
cd $JENKINS_HOME
git add --all && git commit -m "$BUILD_TAG"
git gc

以上で準備完了です。あとはためしにビルド実行をしてみて、青くなればめでたしめでたしです。

直接 git を操作するとき

Jenkins をパッケージで入れている場合、多分Jenkins は jenkins ユーザのものになっていると思います。スクリプトコンソールで作ったリポジトリも jenkins ユーザーで作られているので、以下のように、sudo でユーザを指定してあげれば大丈夫だと思います。

sudo -u jenkins git ...

最後に

登録も自動化したければ jenkins-cli を使って groovy, install-plugin, create-job コマンドあたりを使えばできるはずです。
commit するだけではなくて、どこか別のサーバに push とかすれば、ミラーリングもできて完璧ですね。