はじめに
TektonでCloud Native Buildpacksを使ってビルドをしてみます。
TektonとCloud Native Buildpacksの基本的なことについては下記を参照してください。


TektonでCloud Native Buildpacks
TektonでCloud Native Buildpacksを使う場合、下記2つのCatalogが用意されています。
- buildpacks:
creator
を実行してイメージを作成するTask(公式はこちらをおすすめしている) - buildpacks-phases: lifecycleの各フェーズを1つずつ実行するTask
Lifecycleについては下記を参考にしてください。

それぞれのTaskではいくつかのバージョンがあり、それぞれにREADMEに必要なパラメータなどが説明されています。
Gradleアプリをビルドしてみる
Paketo Buildpacksが用意しているGradleのサンプルアプリを使って、ビルドしてDocker HubにプッシュするPipelineを作成してみます。
用意するファイルは下記の通りです。
.
├── buildpacks.yaml
├── git-clone.yaml
├── pipeline.yaml
├── pipelinerun.yaml
├── serviceaccount.yaml
└── volume.yaml
Secretの作成
Docker Hubにプッシュするときに必要な認証情報を持つSecretを作成します。
kubectl create secret docker-registry docker-registry \
--docker-server=https://index.docker.io/v1/ \
--docker-username=<DockerHubのアカウント名> \
--docker-password=<DockerHubのパスワード> \
--docker-email=<DockerHubのメールアドレス>
ServiceAccountの作成
先ほどのSecretを利用するServiceAccountを作成します(serviceaccount.yaml
)。
apiVersion: v1
kind: ServiceAccount
metadata:
name: buildpacks-service-account
secrets:
- name: docker-user-pass
kubectl apply -f serviceaccount.yaml
PVとPVCの作成
アプリのソースコードを配置するworkspaceのためのPersistentVolumeを作成します(volume.yaml
)。
apiVersion: v1
kind: PersistentVolume
metadata:
name: buildpacks-source-pv
spec:
capacity:
storage: 500Mi
accessModes:
- ReadWriteOnce
hostPath:
path: /tmp
type: Directory
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: buildpacks-source-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 500Mi
kubectl apply -f volume.yaml
git-clone Taskの作成
git-clone TaskはCatalogから下記を利用します。
kubectl apply -f git-clone.yaml
buildpacks Taskの作成
buildpacks TaskはCatalogから下記を利用します。
kubectl apply -f buildpacks.yaml
Pipelineの作成
Pipelineを作成します(pipeline.yaml
)。
git-clone Taskでソースコードをクローンし、buildpacks Taskでビルドし、最後に結果を表示するPipelineになります。
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
name: buildpacks-pipeline
spec:
params:
- name: image
type: string
description: image URL to push
workspaces:
- name: source-workspace
tasks:
- name: fetch-repository # ソースコードをクローン
taskRef:
name: git-clone
workspaces:
- name: output
workspace: source-workspace
params:
- name: url
value: https://github.com/paketo-buildpacks/samples
- name: build # Cloud Native Buildpacksでビルド
taskRef:
name: buildpacks
runAfter:
- fetch-repository
workspaces:
- name: source
workspace: source-workspace
params:
- name: APP_IMAGE
value: "$(params.image)"
- name: SOURCE_SUBPATH
value: "java/gradle"
- name: BUILDER_IMAGE
value: paketobuildpacks/builder:base
- name: display-results # 結果を表示
runAfter:
- build
taskSpec:
steps:
- name: print
image: docker.io/library/bash:5.1.4@sha256:b208215a4655538be652b2769d82e576bc4d0a2bb132144c060efc5be8c3f5d6
script: |
#!/usr/bin/env bash
set -e
echo "Digest of created app image: $(params.DIGEST)"
params:
- name: DIGEST
params:
- name: DIGEST
value: $(tasks.build.results.APP_IMAGE_DIGEST)
kubectl apply -f pipeline.yaml
PipelineRunの作成
Pipelineを実行するためのPipelineRunを作成します(pipelinerun.yaml
)。
apiVersion: tekton.dev/v1beta1
kind: PipelineRun
metadata:
name: buildpacks-pipeline-run
spec:
serviceAccountName: buildpacks-service-account
pipelineRef:
name: buildpacks-pipeline
workspaces:
- name: source-workspace
subPath: source
persistentVolumeClaim:
claimName: buildpacks-source-pvc
params:
- name: image
value: monda00/sample-gradle # イメージをpushするリポジトリ
kubectl apply -f pipelinerun.yaml
実行結果の確認
PipelineRunのログを確認すると、buildpackでビルドしていることが確認できます。
❯ tkn pr logs
...
[build : create] monda00/sample-gradle
[build : results] sha256:5a17548e20d92eabe51f71b287b5ab7c809b18ad5705965e16952ffe919a1b3bmonda00/sample-gradle
[display-results : print] Digest of created app image: sha256:5a17548e20d92eabe51f71b287b5ab7c809b18ad5705965e16952ffe919a1b3b