ことさら−古都プログラマーの更級日記

京都でお寺を回りながら御朱印集めをしていたり、LoLをしたり試合を見に行ったりしているエンジニアのブログです。技術的なはなしとか日常的なはなし、カメラやLoLや競馬の話も書きます。右メニューに検索やらカテゴリーやらがあるので、見たい記事だけ見てね!

Jenkinsの初期化をするGroovyファイルを書いてjenkins起動時に実行することで必要なプラグインとかをインストールできるやつの解説とAnsibleでのデプロイ方法

もくじ

f:id:yoshiki_utakata:20180129210057p:plain

背景

Jenkinsのプラグインの設定とかをAnsibleで管理したいないという要望はあるかと思います。Jenkinsを立てるたびにプラグインをポチポチ入れるのは面倒。ではどうしようと行った時に、groovyでinitスクリプトを書くという方法があることを知りました。

Groovyとは

Java系のプログラミング言語です。Jenkinsのいろんなところで使えます。

例えば、/var/lib/jenkins/init.groovy.d/ ディレクトリ以下に Groovy で書かれたファイルを置いておくと、Jenkins起動時に実行してくれます。

init.groovy.d を書いてみる

今回使用したJenkinsのバージョンは 2.89.3 です

以下の記事を参考にしながら「プラグインのインストールを実施する」やつを書きます。

qiita.com

以下のファイルを、 /var/lib/jenkins/init.groovy.d/init.groovy とかに置きます。

import jenkins.model.*

def instance  = Jenkins.getInstance()
def plugins   = ["workflow-aggregator"]

pm = instance.getPluginManager()
uc = instance.getUpdateCenter()

uc.updateAllSites()

def enablePlugin(pluginName) {
  if (! pm.getPlugin(pluginName)) {
    deployment = uc.getPlugin(pluginName).deploy(true)
    deployment.get()
  }

  def plugin = pm.getPlugin(pluginName)
  if (! plugin.isEnabled()) {
    plugin.enable()
  }

  plugin.getDependencies().each {
    enablePlugin(it.shortName)
  }
}

plugins.each {
  def plugin = pm.getPlugin(it)
  enablePlugin(it)
}

Jenkinsを再起動します。

service jenkins restart

プラグイン一覧でプラグインが増えていると思います。

実行ログが見てみたい

init.groovy がうまく行かなかった場合など、実行ログが見たい場合があるかと思います。

/var/log/jenkins/jenkins.log がログファイルなので、service restartしてこのログを見てみるといいでしょう。

groovyの中で print("hogehoge") などと書くとそのままログが出力されるので、これらを使って原因箇所を特定するのがいいかも。

Ansibleでgroovyをデプロイしてみる

こういった初期化用のスクリプトはAnsibleを使って管理したいもの。 roles/jenkins/files/init.groovy とかに上記initスクリプトを置いて、 roles/jenkins/tasks/ で以下のように定義してデプロイしてみます。

- name: create init script directory
  file:
    path: /var/lib/jenkins/init.groovy.d
    state: directory
    owner: jenkins
    group: jenkins

- name: deploy init.groovy
  copy:
    src: InstallPlugin.groovy
    dest: /var/lib/jenkins/init.groovy.d/init.groovy
    owner: jenkins
    group: jenkins
    mode: 0755

- name: jenkinsをrestartして設定を反映
  service: name=jenkins state=restarted

init.groovy.d ディレクトリを作成したうえで、スクリプトを配置し、jenkinsをrestartすることでスクリプトが実行されてプラグインがインストールされます。

実物は以下のリポジトリにあるのでみてみてください。

github.com

Ansibleにjenkins_script_moduleというものがあるらしい

Ansibleのjenkins_script_moduleというのがあり、groovyを手動で配置するよりも、こういったものを使ったほうが綺麗にAnsibleが書けるかもしれません。

jenkins_script - Executes a groovy script in the jenkins instance — Ansible Documentation

今度詳しく調べてみようかと思います。

参考