05 Jul 2020, 23:00

カスタマイズしたJenkinsを作成する方法 on OpenShift

こんにちは。もーすけです。
本日はRed Hatが提供しているKubernetesディストリビューションであるOpenShift上のJenkinsの管理に関するお話です。 OpenShift上でJenkinsを利用する際のプラグイン管理の方法やカスタマイズ方法などをご紹介します。 ハマリポイントもあり困っている方も見かけたのでお役に立てばと思います。

Jenkins本体ではなくJenkins agnetのカスタマイズに関しては以前に下記ブログを書いてますのでこちらをご参照ください。

課題

OpenShiftでは、Red Hatが作成したJenkinsイメージが内包されており、簡単にOpenShiftと連携したJenkinsをインストールすることが可能です。
一番手っ取り早く試す方法としては下記のようにoc new-appで、すでに用意されているテンプレートを用いて起動することです。

// OpenShift v4.4で用意されているイメージ
$ oc get is -n openshift | grep jenkins
jenkins                xxx.com/openshift/jenkins                2,latest       24 hours ago
jenkins-agent-maven    xxx.com/openshift/jenkins-agent-maven    latest,v4.0    24 hours ago
jenkins-agent-nodejs   xxx.com/openshift/jenkins-agent-nodejs   latest,v4.0    24 hours ago

// OpenShift v4.4で用意されているテンプレート
$ oc get template -n openshift | grep jenkins
jenkins-ephemeral               Jenkins service, without persistent storage....    8 (all set)     6
jenkins-ephemeral-monitored     Jenkins service, without persistent storage....    9 (all set)     7
jenkins-persistent              Jenkins service, with persistent storage....       10 (all set)    7
jenkins-persistent-monitored    Jenkins service, with persistent storage....       11 (all set)    8

// テンプレートを使って簡単に起動
$ oc new-app jenkins-persistent --param ENABLE_OAUTH=true --param MEMORY_LIMIT=2Gi --param VOLUME_CAPACITY=10Gi --param DISABLE_ADMINISTRATIVE_MONITORS=true

しかし、この状態のJenkinsを利用するにあたってはいくつかの問題があります。

  1. デフォルトで入っているプラグインが古いことがある
  2. 追加でプラグインをインストールしたい
  3. ジョブの定義をはじめからしておきたい
  4. Jenkinsを起動しているマニフェストを編集したい

GUIからプラグインをインストール・アップデートするのではだめか?

プラグインのインストールやアップデートについて、Jenkinsの起動後にGUIから行うのでもいいのではないか?そう思われる方も多いかもしれません。 しかしいくつかの観点で、GUIから行うことに問題があります。

問題その1:Jenkinsの複製ができない

GUIからプラグインをインストール・アップデートした場合には、そのJenkinsには当然ながらプラグイン管理ができますが、Jenkinsの作り直しや複製をしようとした場合に同じ作業を繰り返し行わなければいけません。
コンテナのメリットを活かした、再構築の容易性といったメリットを損なってしまいますのでイメージ化しておくことが重要です。

また、Jenkinsのプラグインのインストール・アップデートは、その後にJenkins自身の再起動が必要になりますので、正直かなり手間がかかるということです。

問題その2:特定の条件でインストールしたプラグインが消える

OpenShiftに内包されているJenkinsイメージには、ある特定の条件のときにイメージにもともと持っているプラグインに上書きするという処理があります。 Jenkinsのイメージのバージョンが上がった際などに、強制的に上書きするようになっています。 実際にあった例としては、OpenShiftのマイナーバージョンを上げたあとに、Jenkinsを再起動した際にforce_copy_pluginが実行されてアップデートしたプラグインなどがロールバックされてしまったなどです。

気になる方は、Jenkinsのイメージのコードを見てみるといいです。
ソースコードの改変により行数が変わっている可能性がありますが、force_copy_pluginで検索すると見つかると思います。

Github: jenkins/run at release-4.4 · openshift/jenkins

Jenkinsのイメージをカスタマイズする

上で見てきたとおり、いくつかの理由でJenkins自身にプラグインをインストールしたりアップグレードしたい場合には、イメージ化しておくことが重要です。 Jenkinsのイメージのカスタマイズは非常に簡単です。環境変数で指定できる項目もありますが、以下のドキュメントの通りイメージレベルで作ってしまったほうが運用が楽ではないかと思います。まずは以下のドキュメントを確かめてください。

サンプル実装

上のドキュメントを見ていただいて、すぐに理解できる方はよしなのですが、正直わかりづらい部分もあるかなと個人的に思います。 サンプル実装を以下においておきましたので合わせて参考にしてみてください。
plugins.txtでプラグインの管理をconfiguration/jobs/sample-job/config.xmlでジョブの設定を書いています。

おすすめのプラグインのアップデート

以下のプラグインはアップデートしておくことをおすすめします。(下の記述のバージョンは執筆時点のため確認の上修正してください)
JenkinsのKubernetesプラグインでDecralative記法を利用するのにバージョンが古くうまく動かないなどがあったためです。 Gitも最新にしておくとパイプラインの記述でエラーに遭遇することが減ると思います。

kubernetes:1.19.3
pipeline-model-definition:1.6.0
git:4.2.2
git-client:3.2.1

マニフェストをカスタマイズする

最後にマニフェストのカスタマイズについてです。
OpenShiftでは、Jenkinsを起動するためのテンプレートが用意されています。 冒頭でoc new-appでJenkinsを簡単に起動できるのもこのテンプレートが存在するおかげです。 しかし、実際にこのテンプレートを使ってJenkinsを起動していると、リソースの都合上Jenkinsが遅くてしょうがないというケースがただありました。 用意されているJenkinsのテンプレートでは、メモリーのリミットは設定できるのですが、CPU・メモリーのリクエスト値を設定しておきたいことがただあったのでテンプレートをカスタマイズして使います。

元のテンプレートは参考にしつつ、自分でカスタマイズできるようにしておくと良いでしょう。

$ oc get template jenkins-persistent -o yaml > my-jenkins-template.yaml

// 任意に変更して管理する
$ vim my-jenkins-template.yaml

まとめ

OpenShift上でJenkinsを使うときのプラグイン管理やカスタマイズなど注意すべき点を見てきました。 OpenShiftに内包されているJenkinsは、OpenShiftと連携しやすいようにカスタマイズされており、便利なのでぜひ使っていきたいのですが、そのままでみなさんのワークロードに合うとは正直思いません。
利用できる部分は利用しつつ、カスタマイズしていけるように準備しておくことが非常に重要と思っています。

また、KubernetesにおけるCI/CDの実装の観点について深堀りして理解したい方はぜひ下記のブログもご参照ください。

フィードバック・相談 (β機能)

本記事に対して、執筆者にフィードバックや聞きたいことがあればこちらのフォームからご記入ください。
執筆者に問い合わせてみる

関連する記事はこちら
  • TektonのOperatorによるインストールとHello World (2020/05/10)
  • イメージのプルの効率化を考える。kubernetes-image-puller の紹介 (2020/04/28)
  • Jenkins pipelineで複数のOpenShiftクラスタを扱う (2020/04/14)
  • KubernetesにおけるCI/CD実践の勘所まとめ (2020/03/04)
  • 運用課題の指南書、Kubernetesで実践するクラウドネイティブDevOps (2020/02/26)
  • comments powered by Disqus
    このエントリーをはてなブックマークに追加