はじめに
記載情報は CI/CD に関連します。
実務上関わった環境・機能を身近な情報としてお届けしたく、投稿をはじめました。
各学習上、お金のかからない方法を選択していきます。
以下の手順を実施することで、デプロイ作業担当者が Concourse-CI を利用し minikube(kubernetes) でコンテナを動かしてみる工程を模倣します。
触ってみた気が付き
もう頻繁な更新はなさそうなので「そういうものもある」という程度で動かしてみました。
ジョブとして稼働していく要素にコンテナイメージを指定できる点は、OpenShift Pipelines (Tekton)にもあったと思います。
カスタマイズ性が高い印象はある反面、動きはあまり軽快に感じられませんでした。(私の環境が良くないのもあるかもしれませんが)
また、ここでしか使わなそうな覚え事や、調べ事が出てきそうで、学習コストを考えると利用を躊躇してしまいます。
CI/CD 実現するのに「覚悟が必要な要素」は少ないに越したことがないのではないか、と強く感じます。
- さくっと動かさせてほしい
- 乗り換え容易であってほしい
- 前使っていたアレに似ているから、調べ毎は限定的で楽であってほしい
- 前使っていた shell script 資産があるから、そのまま突っ込ませてほしい
- 上の要望とセットでシークレット系情報の扱いが楽で簡単になっていてほしい
いまのところ業務で登場した Concourse-CI の動きの概要が分かったので、目的は果たせたと思います。
対象者と関連環境・機能
この記事は下記のような人を対象にしています。
- CI/CD 初学者
- プログラミング初学者
- 駆け出しエンジニア
記載している環境・機能は以下です。
- Concourse-CI
- minikube(kubernetes)
前提作業
-
Docker hub にイメージを登録済の前提で記載しております。詳細は以下をご参照ください。
-
minikube、kuectl のインストール
-
サンプルアプリケーションの配置
-
サンプルアプリケーションビルド時にマニフェストファイルのプッシュを連動させておく
-
minikube の起動
$ minikube start ・・・ $ minikube status minikube type: Control Plane host: Running kubelet: Running apiserver: Running kubeconfig: Configured
-
Concourse CI のインストール
concourse、concourse-db(postgres)の構成。
手元で動かしやすいよう Docker Compose で動かせるように準備してくれています。
Concourse CI のインストールが終わったら、CLI 操作ができるように fly というツールをインストールします。
インストールした Concourse CI の WEB UI にアクセスすると、ダウンロード出来るようになっていました。
これで、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 する
- Concourse CI でパイプラインとして稼働させるジョブを定義する
作成したパイプラインは以下。
実務上では各パラメータを外出し。
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からの流れのため、「-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 とは?
- Azure Devops (Artifacts) を無償、無料で使う
- Spring Tool Suite 4 インストール、Spring Initializr 、gradlew の利用
- Spring Boot Web アプリケーションを作る
- Jar の Library を作り、Azure Artifacts を利用して成果物を配布する
- ライブラリ開発者より指定されたバージョンを利用してアプリを作る
- アプリを Docker 、Docker Compose でコンテナを動かしてみる
- Azure Devops (PileLines) を無償、無料で使う
- Azure Devops (PileLines) でテスト、ビルド、イメージプッシュをする
- minikube(kubernetes) でコンテナを動かしてみる
- nginx のコンテナを Docker や minikube(kubernetes) で動かし、静的コンテンツ公開工程を模倣