Jenkins-Xを使ってみたらやっぱりハマった

June 06, 2020

そろそろ安定してきたかな、と思い、前から気になっていたJenkins-Xを試してみました。実はしばらく前に試したことはあるのですが、まだいろいろ不具合があり様子見モードになっていました。今回は、こちらを参考にさせていただきオンプレミスなKubernetesクラスタにインストールしてみたのですが、それなりに安定して動いていることがわかりました。しかし、やはり予想通り、ハマってしまいました。

まず、アプリのプロジェクトをjx create quickstartで作成した後、パイプラインの中でプライベートなdockerレジストリにpushするところでエラーが発生。

error checking push permissions -- make sure you entered the correct tag name, and that you are authenticated correctly, and try again: getting tag for destination: repository can only contain the runes `abcdefghijklmnopqrstuvwxyz0123456789_-./`: /registry.XXXXXX:30443/********/**-app-2

Pipeline failed on stage 'from-build-pack' : container 'step-build-container-build'. The execution of the pipeline has stopped.

どうやらタグの名前のつけ方がおかしい、と言われているようです。で、いろいろ試行錯誤した結果、dev環境をインストールしたときに入力したレジストリの書き方がまずかったようです。具体的には、jx-requirements.ymlのcluster.registryとenv/parameters.yamlのdocker.urlで「https://registry.XXXXXX:30443/」と記載していたのですが、これがまずかったようです。どうまずかったかというと、ここにはURLスキームは含めず、レジストリのホスト名(とポート番号)だけ書けば良いようで、両方とも「registry.XXXXXX:30443」に変更すると上記のエラーはなくなりました。

次に、アプリのパイプラインが全部通った後、helmのchartがローカルのchartmuseumに登録されるところまでは成功したのですが、アプリをデプロイするためdev環境のパイプラインを走らせると下記のエラーが発生。  

error: failed to build the dependencies of chart '/tmp/**-helm-apply-002347732/env': failed to run 'helm dependency build' command in directory '/tmp/**-helm-apply-002347732/env', output: 'Error: no repository definition for http://jenkins-x-chartmuseum:8080, http://jenkins-x-chartmuseum:8080. Please add them via 'helm repo add''

Pipeline failed on stage 'release' : container 'step-install-jenkins-x'. The execution of the pipeline has stopped.

どうやら、jenkins-xのインストールのパイプライン実行時は、アプリのパイプラインのようにクラスタ内ではなく、クラスタ外からchartmuseumにアクセスするようです。結論としてはJenkins-Xインストール時に追加されたingressで設定されているchartmuseumのホスト名(chartmuseum.jx.XXX)をenv/requirements.yamlのrepositoryに指定すれば良いようです。このホスト名は下記のコマンドで取得可能。

kubectl get ingress -n jx | grep chartmuseum

ただ、この方法ですと、プロジェクトをバージョンアップ(promote)するたびに、requirements.yamlが編集されて、chartmuseumのホスト名も元に戻ってしまいますので、毎回修正してパイプライン を走らせる必要があります。そこで、このコメントにあるように、jx-requirements.ymlのclusterのchartRepositoryにchartmuseumのURLを設定すると、requirements.yamlに正しくホスト名が入るようになり、毎回修正しなくてもよくなりました。

以上でようやくjenkins-xのパイプラインが全部通り、アプリがdev環境で動作するようになりました。

情報が少なく、いろいろ躓くことが多いですが、jxコマンド一発で、全自動でプロジェクトのイメージのビルドからhelmチャートのアップロードまでやってくれるのは便利です。githubにpushするとwebhookで自動的にパイプラインが走るのもいいですね。

また、今回、quickstartでお試しアプリを作成してみたのですが、プロジェクトの中身をみたところ、skaffoldが使用されていることがわかりました。普通のJenkinsでもskaffoldを使ってみたことはあるのですが、イメージをビルドするためにいろいろ面倒な設定が必要だった記憶があります(Docker in Dockerなビルド用コンテナを作るとか)。しかしJenkins-Xは何もしなくてもいきなりskaffoldが使えるみたいです。さすがKubernetesに特化しているだけのことはありますね。

ところで最近「Kubernetes実践ガイド」という本を読み始めたのですが、結構細かく技術的なことが書かれていて、非常に参考になりました。どちらかというとKubernetes上でコンテナアプリを開発、運用する人向けの本かと思いますが、Kubernetesのマスターやワーカー ノードがどのような仕組みで動いているのかなど、バックグラウンドについても触れられているので読み応えがありました。