JenkinsでRancherのKubernetes環境のアプリを更新〜EHW2018「開発環境整備⑩」


# 概要

このエントリは、「Enterprise "hello, world" 2018 Advent Calendar 2018」の12/24向けのものです。このAdvent Calendarでは、複数個のエントリにまたがる話の流れも鑑みつつ、なるべく1エントリで１つのトピックをカバーできるようにする予定です。

このエントリで記載するトピックは、JenkinsでRancherのKubernetes環境のアプリを更新することです。

下図のような世界で、JenkinsからKubernetes環境のアプリを更新します。

|![EHW2018DevEnv(1)(1)(1)(1)(1).png](https://qiita-image-store.s3.amazonaws.com/0/65002/3178ccaa-6b8d-eb83-58f5-f3a9fd163c9e.png)|
|:---:|


# 前提

## おことわり

- このEnterpfise "hello, world"シリーズは、ネタのためのエントリです。実環境でそのまま利用ことを目的とはしていません。
- 動かしやすさを優先してセキュリティを意図的に低くする設定など入れてありますのでご注意ください。

## 想定読者

「Enterprise "hello, world" 2018」的なネタとしては、下記のような状況を想定しています。

> GitLabのCIの結果をDocker Private Registryに配備したので、Kubernetes環境のアプリを更新しなければいけない。ただし、このステップはユーザがGUIから指示できるようにする。

# JenkinsでRancher-cliを動かす

## Rancher-cliをJenkinsコンテナで動かせるようにする

[Rancher-cliのリリースページ](https://github.com/rancher/cli/releases)から、対応するバイナリを入手します。

作業フォルダを適当に決めます。本エントリでは、Jenkinsコンテナの中で、/var/jenkins-home/rancher-cliというディレクトリを作りました。

そのディレクトリの中で、rancher-cliを入手し、展開します。

```
$ ~/rancher-cli$ wget https://github.com/rancher/cli/releases/download/v2.2.0-rc9/rancher-linux-amd64-v2.2.0-rc9.tar.gz
$ ~/rancher-cli$ tar zxvf rancher-linux-amd64-v2.2.0-rc9.tar.gz 
```

## アクセス用のTokenを入手する

RancherのUIにログインし、右上のアカウントのアイコンをクリック、「API & Keys」をクリックします。

![Screenshot_2019-02-17_13-08-28.png](https://qiita-image-store.s3.amazonaws.com/0/65002/a1d3d403-6284-2a66-69bb-3a4ff7b8bdbd.png)

右上の「Add Key」をクリックし、ダイアログでキーに適当な名前をつけます。本エントリでは「jenkins-cd」としました。

![Screenshot_2019-02-17_13-10-43.png](https://qiita-image-store.s3.amazonaws.com/0/65002/6a8c8507-a780-2219-24cb-4dcc8ba91486.png)

「Create」ボタンをクリックすると、APIの情報が表示されます。この画面でしか表示されない情報を含むので、どこかにメモしておきます。

![Screenshot_2019-02-17_13-12-59.png](https://qiita-image-store.s3.amazonaws.com/0/65002/2c307a52-4160-fbeb-c613-cae274b19a2e.png)

「Close」ボタンをクリックすると一覧画面に戻り、いま作成したキーが表示されています。

![Screenshot_2019-02-17_13-17-09.png](https://qiita-image-store.s3.amazonaws.com/0/65002/18461a3c-a657-e543-b6ec-7a35e28c8cc3.png)

### ログイン

rancher-cliのloginコマンドで、上記で入手したbearer-tokenの文字列を用いて、ログインします。

```shell-session
~/rancher-cli$ ./rancher-v2.2.0-rc9/rancher login https://192.168.3.221:8443/v3 --token "token-79hvq:gc(省略)"

(表示されるメッセージは省略)

Do you want to continue connecting (yes/no)? yes
INFO[0089] Saving config to /var/jenkins_home/.rancher/cli2.json 
```

### kubectlのインストール

[kubectlインストールに関する説明サイト](https://kubernetes.io/docs/tasks/tools/install-kubectl/)に従ってkubectlコマンドをJenkinsコンテナ内にインストールします。

サイトではいくつかの方法が示されていますが、このエントリでは、バイナリをcurlコマンドで手元に落としてくる方法を使います。落としてきたkubectlコマンドに実行権限をつけて(chmod +x)います。

```
~/rancher-cli$ curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
~/rancher-cli$ chmod +x kubectl 
```

## Jenkinsからアプリを更新するためのパイプラインを作成

### フォルダを作成

Jenkinsでジョブ軍をわかりやすくせいりするためのフォルダについて、本エントリでは下記のように作りました。

```
ehw2018>deployment>update-front-app
```

![Screenshot_2019-02-17_23-20-42.png](https://qiita-image-store.s3.amazonaws.com/0/65002/7de079b3-cc33-396f-b966-be1e67d8def8.png)

### パイプラインを作成

以下のようなパイプラインを作成しました。

ごくかんたんなスクリプトですが、ポイントは、

- 上記でインストールしたコマンド（rancher-cli, kubectl）へのパスをpipeline中のenvironmentで指定している
- コンテナのみの更新であるため、Kubernates上でのアプリに関するメタデータの一部を時刻の文字列で更新し、リポジトリからコンテナを再読込させている [参考: rancherのコミュニティサイト](https://forums.rancher.com/t/service-upgrade-image-pull-via-the-api/11494/6)

```groovy
node {
}

pipeline {
    agent any
    environment {
        PATH = "/var/jenkins_home/rancher-cli/rancher-v2.2.0-rc9:/var/jenkins_home/rancher-cli:$PATH"
    }
    stages {
        stage('show os information') {
            steps {
                sh 'cat /etc/os-release'
                // sh 'rancher kubectl get all'
                sh """
                rancher kubectl patch deployment front-test -p   "{\\"spec\\":{\\"template\\":{\\"metadata\\":{\\"labels\\":{\\"date\\":\\"`date +'%s'`\\"}}}}}"
                """
            }
        }
    }
}
```

# ソースを書き換えてPush〜デプロイまで

## 実行前のWEBサイト

![Screenshot_2019-02-17_23-31-49.png](https://qiita-image-store.s3.amazonaws.com/0/65002/066fe849-959b-ca84-a36f-76bed657cf01.png)

## ソースを書き換える

index.htmlで、タイトル部分を書き換えます。

![Screenshot_2019-02-17_23-35-07.png](https://qiita-image-store.s3.amazonaws.com/0/65002/a11a71f5-31e5-e8bc-e21e-656fe2459127.png)

## Pushから新しいイメージ作成まで

書き換えたindex.htmlをcommitしてpushすると、[別のエントリ](https://qiita.com/hrkt/items/4c1968959f31b527da15)で紹介した流れで、GitLab runnerでテストが実施され、新しいコンテナのイメージが作成され、Git Private Repositoryに格納されます。

## Jenkinsからアプリを更新

Jenkinsで、パイプラインのメニューから「Build Now」を実行すると、Rancher上のWorkloadが更新され（一時的にScaleが1から2になり、また1に戻るのが観察できるでしょう）

WEBサイトを再読込すると、タイトル部分の文字列が変更されているはずです。

![Screenshot_2019-02-17_23-43-45.png](https://qiita-image-store.s3.amazonaws.com/0/65002/956a9cbd-351d-eb80-a9a4-69c97bdad54e.png)



# まとめ

このエントリでは、「Enterprise "hello, world" 2018 Advent Calendar 2018」(EHW2018)の24日目として、JenkinsでRancherのKubernetes環境のアプリを更新することをトピックとして取り上げました。