Tektonを使ってAppsodyで作ったNodejsアプリケーションをK8sにデプロイする。

さて、
[Tektonを使ってAppsodyで作ったNodejsアプリケーションをK8sにデプロイする。(Tekton準備編)](https://qiita.com/motuo/items/8d768175abcb077067dc)で、`Tekton Dashboad`の用意ができたら、いよいよ`Appsody`で作った`Node.js`のモジュールをデプロイしていきます。

## 今回は私のリポジトリをクローンします。

```sh
$ git clone https://github.com/motuo1201/appsody-test-build.git
$ cd appsody-test-build/
```

## 一度、ローカルで動かしてみましょう。
[こちらの記事](https://qiita.com/motuo/items/1cde634a010e9e1d7d5a)にも書きましたが、下記のコマンドでローカルの稼働が確認できます。

```sh
$ appsody run
......
[Container] App started on PORT 3000
```

`http://localhost:3000`でアクセスが可能になります。文言自体は、`app.js`に書かれています。

スクリーンショット
![スクリーンショット 2020-01-24 9.05.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154110/0278ff04-53c0-7789-745f-7ab2941ae4e2.png)

app.jsの中身

```javascript
const app = require('express')()

app.get('/', (req, res) => {
  res.send("Hey! Hello Appsody!");
});
 
module.exports.app = app;
```

## では、これをいよいよTekton経由でデプロイしてみましょう。

### Docker Registoryとアクセスする情報を予め用意する。
Tektonはデプロイをする時に、`Docker Registory`を使います。そのため、事前に`Docker Hub`などに自分が操作できるDocker Registoryを用意しましょう！

こんな感じ。

![スクリーンショット 2020-01-24 9.15.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154110/b53221e8-06cb-e3db-1179-97b6f4a8e36b.png)

次に、Kubernetesに`docker hub`の認証情報を登録します。
`secret.yaml`という名前(何でも良いのですが、、、)のファイルを作って、認証情報を作成します。

```yaml
apiVersion: v1
kind: Secret
metadata:
  name: my-nodejs-dock
  annotations:
    tekton.dev/docker-0: https://index.docker.io/v1/
type: kubernetes.io/basic-auth
stringData:
  username: ********
  password: ********
```

このファイルを作成したら、Kubernetesに登録しましょう。

```sh
$ kubectl apply -f secret.yaml 
secret/my-nodejs-dock created
```

これによって、Tektonからも`my-nodejs-dock`という認証情報が登録されたことが確認できます。
![スクリーンショット 2020-01-24 9.21.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154110/a2400a14-3fe7-b7ab-5de3-31fd64d41bb8.png)


### Tektonを動かすための各種定義を行う。

#### 1.appsodyで作成したモジュールをTektonでデプロイするためのサンプルが既に用意されています。これをCloneしましょう。

```sh
$ git clone https://github.com/appsody/tekton-example
$ cd appsody-tekton/tekton-example/
```

#### 2.次にサービスアカウント作成と適切な権限を付けていきます。(特にファイルの修正はありません)

```sh
$ kubectl apply -f appsody-service-account.yaml
serviceaccount/appsody-sa created
$ kubectl apply -f appsody-cluster-role-binding.yaml
clusterrolebinding.rbac.authorization.k8s.io/appsody-admin created
```

#### 3.登録されたサービスアカウントに、先ほど作成した認証情報を紐づけていきます。

```sh
$ kubectl edit serviceaccount appsody-sa
```

これをするとファイルの修正画面が出るので、`secret`に先ほど作成した認証のnameを設定
(ここでは最終行に`- name: my-nodejs-dock`を追加しています。)

```
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
kind: ServiceAccount
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"ServiceAccount","metadata":{"annotations":{},"name":"appsody-sa","namespace":"default"}}
  creationTimestamp: "2020-01-24T00:24:36Z"
  name: appsody-sa
  namespace: default
  resourceVersion: "3056"
  selfLink: /api/v1/namespaces/default/serviceaccounts/appsody-sa
  uid: 257efc19-e7d4-400f-a32c-b758956172e6
secrets:
- name: appsody-sa-token-6tw82
- name: my-nodejs-dock
```

#### 4.Tektonのパイプラインおよび、タスクの登録をします。(特にファイルの修正はありません)

```sh
$ kubectl apply -f appsody-build-task.yaml
task.tekton.dev/appsody-build-task created
$ kubectl apply -f appsody-build-pipeline.yaml
pipeline.tekton.dev/appsody-build-pipeline created
```

#### 5.Tektonで使用するDockerとgitのリソースを登録します。
`appsody-pipeline-resources.yaml`にあるDockerのimageとgitのリポジトリを修正します。

```yaml
apiVersion: v1
items:
- apiVersion: tekton.dev/v1alpha1
  kind: PipelineResource
  metadata:
    name: docker-image
  spec:
    params:
    - name: url
      value: index.docker.io/yenomoto1201/appsody-deploy-nodejs #ここを修正
    type: image
- apiVersion: tekton.dev/v1alpha1
  kind: PipelineResource
  metadata:
    name: git-source
  spec:
    params:
    - name: revision
      value: master
    - name: url
      value: https://github.com/motuo1201/appsody-test-build #ここを修正
    type: git
kind: List
```
修正したら、この情報をKubernetesに登録

```sh
$ kubectl apply -f appsody-pipeline-resources.yaml
pipelineresource.tekton.dev/docker-image created
pipelineresource.tekton.dev/git-source created
```

この情報も`Tekton Dashboad`上で確認可能です。
![スクリーンショット 2020-01-24 9.33.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154110/0dc333a4-1862-82b6-a8a5-ac532fbe57f6.png)

docker-image
![スクリーンショット 2020-01-24 9.34.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154110/73850d5c-679a-24a4-37a1-92a0f5d34dee.png)

git-source

![スクリーンショット 2020-01-24 9.35.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154110/ccf08eaa-b3e8-5645-b309-dde15f8ed862.png)

#### 6.いよいよ、動かしてみましょう！
下記のコマンドを実行して、Tekton Pipelineを起動します。

```sh
$ kubectl apply -f appsody-pipeline-run.yaml 
pipelinerun.tekton.dev/appsody-manual-pipeline-run created
```

ダッシュボードのPipelineRunsで処理が実行されていることを確認できます。

![スクリーンショット 2020-01-24 9.37.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154110/4cbced1b-25b8-cb9d-d080-eb76ae549e46.png)

約5分くらいで処理が完了します。このように各ステップのログを確認することができます。

![スクリーンショット 2020-01-24 9.43.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154110/a37144e6-12c4-5730-9bd2-bb7c3386e02c.png)

Serviceを確認すると、きちんとデプロイできていることがわかります。

```sh
$ kubectl get svc
NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
appsody-test-build   NodePort    10.109.30.147   <none>        3000:32272/TCP   108s
kubernetes           ClusterIP   10.96.0.1       <none>        443/TCP          54m
```

ここで確認した、PORT:32272を元に、`http://localhost:32272/`にアクセスしてみます。
![スクリーンショット 2020-01-24 9.46.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154110/4729ffcc-3d14-7c04-062b-b162dbe33f57.png)

良い感じですね。
これで、Appsodyを使ったCI/CD環境を構築することができました！