Google Cloud PlatformでJenkins Xを動かしてみた

# 何をやった？
Jenkins XをHello World的に触ってみました。
実現したのは以下です。

- Githubからのwebhookで
- GCP上のJenkins上にこしらえたビルドパイプラインが走り
- GCP上のk8sクラスタのステージングコンテナにデプロイされるようにした。

やってみたところ、2019年3月現在では初期設定などに関して日本語での情報がまだまだ少なかったので、備忘録がてら記事を書きました。

# 前提状態
- Githubのアカウントを持っている
  - リポジトリはなくてもOK
- インターネットに接続できる
  - GCPに接続したいので
- Windows 8
- Google Chrome

# Jenkins Xとは？
一言でいえば、
**Gitによるソースコード管理とKubernetes上でのコンテナベースのアプリケーションデプロイを前提としたCI/CDソリューション**
です。

:thinking:
要は、Gitでソースを管理していて、そのアプリをKubernetes上で立ち上げることを前提に、
Jenkinsを使ったCI/CDの仕組みをお手軽に構築できるというものです。
（もっといろいろできる気はしますが、最もシンプルな範囲で書いています）

# 手順

- GCPことはじめ
- jxのインストール
- k8sクラスタの作成と、クラスタへのJenkinsXのインストール
- アプリケーションのビルド・デプロイ


## GCPことはじめ
公式手順は[ココ](https://jenkins-x.io/getting-started/create-cluster/)です。

GCPを使ったことがない場合はさくっと登録をします。「GCP」とかでググれば一発です。
googleのアカウントさえ持っていれば、新たに入力する内容はほとんどないはずです。

GCPのダッシュボードまで表示できたら、最初は`My First Project`が選択されている（画面左上）はずですが、必要に応じて新しく自分のプロジェクトを作ります。

その後、右上のボタンを押してCloud Shellを立ち上げます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/344965/bad92d47-61a7-214a-7eb6-b9be8f4d2a2e.png)


## jxのインストール
公式手順は[ココ](https://jenkins-x.io/getting-started/create-cluster/#using-the-google-cloud-shell)です。

Jenkins Xに関する操作は主に`jx`コマンドを使って行います。
先ほど立ち上げたCloud Shell上で以下を叩くだけでインストールできます。

```
curl -L https://github.com/jenkins-x/jx/releases/download/v1.3.973/jx-linux-amd64.tar.gz | tar xzv 
sudo mv jx /usr/local/bin
```

なお、Cloud Shellを再起動すると、`/home/${Googleアカウント名}`以下のディレクトリ以外はリセットされてしまうらしいです。
再起動後に「`jx`使えねぇ」となったらこれが原因の可能性が高いので、素直にインストールしなおしましょう。

## k8sクラスタの作成と、クラスタへのJenkinsXのインストール
事前にGithubのアクセストークンを作っておきましょう。
スコープはこんな感じにします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/344965/6fa55f18-be91-028e-085b-ca2b06b56638.png)

その後、以下を叩きます。

```
jx create cluster gke --skip-login
```
途中でいろいろと聞かれますが、以下のように答えました。

- Select Jenkins installation type: static Jenkins
- workload build pack: Kubernetes Workloads: Automated CI+CD with GitOps Promotion
- Gitの情報を入力するところ: 自分の情報を入力
- それ以外: そのままEnter

完了する間際くらいにJenkinsのadmin passwordが生成されているのでメモしておきます。

これで、

- GCP上へのKubernetesクラスタの生成
- k8sクラスタへのJenkins Xのインストール
- Githubアカウントとの連携

をまとめて行った状態になります。

GCPから、k8s Engine → ワークロード → サービスの公開
にあるエンドポイントのURL(jenkins.jx.x.x.x.x.nip.io)にアクセスするとJenkinsが立ち上がっていることを確認できます。


## アプリケーションのビルド・デプロイ
Jenkins、Github、k8sの下準備ができたので、実際にアプリをビルドしたりしてみるという話です。
パターンはいくつかあって、

-  `jx import` コマンドで[既存プロジェクトに適用](https://jenkins-x.io/developing/import/)する
-  `jx create spring` コマンドで[Spring Bootのアプリを新規に作成](https://jenkins-x.io/developing/create-spring/)する
-  `jx create quickstart` コマンドで[テンプレートプロジェクトに適用](https://jenkins-x.io/developing/create-quickstart/)する

などです。ここではひとまず3つ目のパターンで試してみました。


Quick Startでは、ビルド対象としてJenkins X側でテンプレートとして用意されているQuick Startプロジェクトを使います。
[Github](https://github.com/jenkins-x-quickstarts)に、Spring BootやGoなどいくつかの形式のwebアプリプロジェクトが公開されています。

まず、CLoud Shellで以下を叩きます。

```
jx create quickstart
```

・・・やることは以上です

- 作成するリポジトリ名
- 使用するQuick Startプロジェクト名
- 初回コミットのコミットメッセージ

などを対話的に入力すると、指定した名前でGithubリポジトリが作成され、
push時に自動でビルドを走らせるwebhookの設定も自動で行われます。

さらに、自動で生成されたJenkinsfileをもとにパイプラインが走り始めます。
ビルド結果はJenkinsに反映され、アプリケーションはk8sクラスタ内にデプロイされます。

てきとうにコードを変更してpushすると、当然ながらwebhookにより再びビルドが走り始め、
変更を反映したアプリをデプロイする所まで勝手にやってくれる仕組みが整います。



ここまで一気に自動でいけるのはすごいです（小並感
※ビルド失敗時の通知については特に設定されないようなので、やりたければ自分の環境のものとつなぐ設定をする必要があります。失敗を通知するところまでがベストプラクティスのはず。