Concourse-CI を利用してコンテナを動かしてみる

# はじめに

記載情報は CI/CD に関連します。  
実務上関わった環境・機能を身近な情報としてお届けしたく、投稿をはじめました。  
各学習上、お金のかからない方法を選択していきます。

以下の手順を実施することで、デプロイ作業担当者が Concourse-CI を利用し minikube(kubernetes) でコンテナを動かしてみる工程を模倣します。

## 触ってみた気が付き

もう頻繁な更新はなさそうなので「そういうものもある」という程度で動かしてみました。  
ジョブとして稼働していく要素にコンテナイメージを指定できる点は、OpenShift Pipelines (Tekton)にもあったと思います。  
カスタマイズ性が高い印象はある反面、動きはあまり軽快に感じられませんでした。（私の環境が良くないのもあるかもしれませんが）  
また、ここでしか使わなそうな覚え事や、調べ事が出てきそうで、学習コストを考えると利用を躊躇してしまいます。  
CI/CD 実現するのに「覚悟が必要な要素」は少ないに越したことがないのではないか、と強く感じます。

- さくっと動かさせてほしい
- 乗り換え容易であってほしい
- 前使っていたアレに似ているから、調べ毎は限定的で楽であってほしい
- 前使っていた shell script 資産があるから、そのまま突っ込ませてほしい
- 上の要望とセットでシークレット系情報の扱いが楽で簡単になっていてほしい

いまのところ業務で登場した Concourse-CI の動きの概要が分かったので、目的は果たせたと思います。

## 対象者と関連環境・機能

この記事は下記のような人を対象にしています。

- CI/CD 初学者
- プログラミング初学者
- 駆け出しエンジニア

記載している環境・機能は以下です。

- Concourse-CI
- minikube(kubernetes)

## 前提作業

- Docker hub にイメージを登録済の前提で記載しております。詳細は以下をご参照ください。

  - [アプリを Docker 、Docker Compose でコンテナを動かしてみる](https://qiita.com/wf-kenji-ikeda/items/e6604ea6ae257f3925a7)

- minikube、kuectl のインストール

  - [minikube Get Started!](https://minikube.sigs.k8s.io/docs/start/)
  - [Linux へ kubectl をインストールする](https://minikube.sigs.k8s.io/docs/handbook/kubectl/#Linux)

- サンプルアプリケーションの配置

  - [manifest-files 追加](https://github.com/oad3/application-springboot/tree/feature/add-manifest-files)

- サンプルアプリケーションビルド時にマニフェストファイルのプッシュを連動させておく

- minikube の起動

  ```minikube start
  $ minikube start
  ・・・
  $ minikube status
  minikube
  type: Control Plane
  host: Running
  kubelet: Running
  apiserver: Running
  kubeconfig: Configured
  ```

- Concourse CI のインストール

  - [Docker Compose Concourse](https://concourse-ci.org/quick-start.html#docker-compose-concourse)

  concourse、concourse-db(postgres)の構成。  
  手元で動かしやすいよう Docker Compose で動かせるように準備してくれています。

Concourse CI のインストールが終わったら、CLI 操作ができるように fly というツールをインストールします。
インストールした Concourse CI の WEB UI にアクセスすると、ダウンロード出来るようになっていました。

- [Install Fly](https://concourse-ci.org/quick-start.html#install-fly)

これで、Concourse CI でのパイプライン実行環境が整ってきました。
後は実際にここまで準備してきたものを組み込んで動かしてみようと思います。

## 必要作業

- 想定状態
  - サンプルアプリケーションのビルド・DockerImage プッシュは本記事で済んだ体としている
  - サンプルアプリケーションには app-deployment.yml、app-service.yml を含めている

上より、Concourse CI で試すのは minikube へのアプリデプロイ部位に限定しています。  
（ビルド・DockerImage プッシュ等も、進め方は類似する形です。）

- 想定作業内容
  - Concourse CI でパイプラインとして稼働させるジョブを定義する
    - ジョブ内で取り扱うリソースを定義しておく
    - ジョブを定義する
  - サンプルアプリケーションの deplyment を Concourse CI で k8s に apply する
  - サンプルアプリケーションの service を Concourse CI k8s に apply する

作成したパイプラインは以下。  
実務上では各パラメータを外出し。

```
resource_types:
  - name: k8s
    type: docker-image
    source:
      repository: kudohn/concourse-k8s-resource
      tag: 0.0.8

resources:
  - name: k8s
    type: k8s
    source:
      api_server_url: https://<local.ip>:8443
      api_server_cert: |
        -----BEGIN CERTIFICATE-----
        ・・・
        -----END CERTIFICATE-----
      # use client certificate
      client_cert: |
        -----BEGIN CERTIFICATE-----
        ・・・
        -----END CERTIFICATE-----
      client_key: |
        -----BEGIN RSA PRIVATE KEY-----
        ・・・
        -----END RSA PRIVATE KEY-----

      skip_tls_verify: false
      namespace: default

  - name: application-springboot
  type: git
    source:
      uri: https://github.com/oad3/application-springboot.git
      branch: feature/add-manifest-files

jobs:
  - name: apply-manifest
    plan:
      - get: application-springboot
      - put: k8s
        params:
          status_check_timeout: 60
          command_timeout: 30
          paths:
            - application-springboot/app-service.yml
            - application-springboot/app-deployment.yml
```

Concourse CI で実際にパイプラインを動かすには、上記のパイプライン、ジョブ定義を保存したうえで、以下の工程が必要になるようです。  
[Hello World Pipeline](https://concourse-ci.org/tutorial-hello-world.html)からの流れのため、「-t (Concourse target name)」は「tutorial」のまま進めています。

```
fly -t tutorial set-pipeline -p apply-files -c apply_manifest.yml　※ファイルの定義をパイプラインapply-filesとして登録設定する
fly -t tutorial unpause-pipeline -p apply-files　※動かせるようにパイプラインをunpause実施
fly -t tutorial trigger-job -j apply-files/apply-manifest -w　※パイプラインapply-filesのジョブapply-manifestを対象にジョブ開始指示
```

実行すると

```
$ fly -t tutorial trigger-job -j apply-files/apply-manifest -w
started apply-files/apply-manifest #15

selected worker: 809562beb2d7
INFO: found existing resource cache

initializing check: k8s
selected worker: 809562beb2d7
selected worker: 809562beb2d7
INFO: found existing resource cache

selected worker: 809562beb2d7
2022/06/12 08:17:34 clientset_util.go:44: using client certificate
2022/06/12 08:17:34 runner.go:70: ** kubectl flags **
2022/06/12 08:17:34 runner.go:72: - all -> false
2022/06/12 08:17:34 runner.go:72: - allow-missing-template-keys -> true
2022/06/12 08:17:34 runner.go:72: - cascade -> background
2022/06/12 08:17:34 runner.go:72: - dry-run -> none
2022/06/12 08:17:34 runner.go:72: - field-manager -> kubectl-client-side-apply
2022/06/12 08:17:34 runner.go:72: - filename -> [application-springboot/app-service.yml,application-springboot/app-deployment.yml]
2022/06/12 08:17:34 runner.go:72: - force -> false
2022/06/12 08:17:34 runner.go:72: - force-conflicts -> false
2022/06/12 08:17:34 runner.go:72: - grace-period -> -1
2022/06/12 08:17:34 runner.go:72: - kustomize ->
2022/06/12 08:17:34 runner.go:72: - openapi-patch -> true
2022/06/12 08:17:34 runner.go:72: - output ->
2022/06/12 08:17:34 runner.go:72: - overwrite -> true
2022/06/12 08:17:34 runner.go:72: - prune -> false
2022/06/12 08:17:34 runner.go:72: - prune-whitelist -> []
2022/06/12 08:17:34 runner.go:72: - record -> true
2022/06/12 08:17:34 runner.go:72: - recursive -> false
2022/06/12 08:17:34 runner.go:72: - selector ->
2022/06/12 08:17:34 runner.go:72: - server-side -> false
2022/06/12 08:17:34 runner.go:72: - template ->
2022/06/12 08:17:34 runner.go:72: - timeout -> 30s
2022/06/12 08:17:34 runner.go:72: - validate -> true
2022/06/12 08:17:34 runner.go:72: - wait -> false
2022/06/12 08:17:34 runner.go:74: ** kubectl args **
2022/06/12 08:17:34 runner.go:52: running apply command... []
service/springbootapp-service created
deployment.apps/springbootapp-deployment created
2022/06/12 08:17:39 main.go:55: check status for []
initializing check: k8s
selected worker: 809562beb2d7
INFO: found existing resource cache

selected worker: 809562beb2d7
2022/06/12 08:17:42 clientset_util.go:44: using client certificate
succeeded
```

```
$ kubectl get deployments -o wide
NAME                       READY   UP-TO-DATE   AVAILABLE   AGE    CONTAINERS      IMAGES                                         SELECTOR
springbootapp-deployment   1/1     1            1           83s    springbootapp   oad3jp999/application-springboot:0.0.1         io.kompose.service=springbootapp
$ kubectl get services -o wide
NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)           AGE    SELECTOR
kubernetes              ClusterIP   10.96.0.1       <none>        443/TCP           308d   <none>
springbootapp-service   NodePort    10.98.121.178   <none>        49161:30001/TCP   86s    io.kompose.service=springbootapp
$ minikube service springbootapp-service --url
http://<local.ip>:30001
$ curl http://<local.ip>:30001
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Hello SpringBoot Web Page</title>
</head>
<body>
    <H1>Hello SpringBoot Web Page</H1>
    </br>
    <form method="post" action="/result">
        Please input name<br>
        <input type="text" name="inputvalue"/>
        <input type="submit" value="submit" />
    </form>
</body>
```

## 関連記事

- [CI/CD とは?](https://qiita.com/wf-kenji-ikeda/items/bfb6d5e21b33d0cca83b)
- [Azure Devops (Artifacts) を無償、無料で使う](https://qiita.com/wf-kenji-ikeda/items/9c21859d8b5b6a63246e)
- [Spring Tool Suite 4 インストール、Spring Initializr 、gradlew の利用](https://qiita.com/wf-kenji-ikeda/items/d00766da8a4076ec43ed)
- [Spring Boot Web アプリケーションを作る](https://qiita.com/wf-kenji-ikeda/items/1e64e44094ce8a1d997f)
- [Jar の Library を作り、Azure Artifacts を利用して成果物を配布する](https://qiita.com/wf-kenji-ikeda/items/696bda335a8933abfcb3)
- [ライブラリ開発者より指定されたバージョンを利用してアプリを作る](https://qiita.com/wf-kenji-ikeda/items/5bf06ce19c52e73a5463)
- [アプリを Docker 、Docker Compose でコンテナを動かしてみる](https://qiita.com/wf-kenji-ikeda/items/e6604ea6ae257f3925a7)
- [Azure Devops (PileLines) を無償、無料で使う](https://qiita.com/wf-kenji-ikeda/items/451838da3b4ac45a8d65)
- [Azure Devops (PileLines) でテスト、ビルド、イメージプッシュをする](https://qiita.com/wf-kenji-ikeda/items/5ddf6158bb98c4174db9)
- [minikube(kubernetes) でコンテナを動かしてみる](https://qiita.com/wf-kenji-ikeda/items/95604d83850a17b91c46)
- [nginx のコンテナを Docker や minikube(kubernetes) で動かし、静的コンテンツ公開工程を模倣](https://qiita.com/wf-kenji-ikeda/items/bf6cb1b7a047f562d309)