[[406227]] 先ほど作成した 2 つのタスク「テスト」と「ビルドとプッシュ」が完了しました。これら 2 つのタスクをパイプラインに整理するパイプラインを作成することもできます。ここで使用する Pipeline の CRD オブジェクトを示します。 パイプラインの作成たとえば、ここでのパイプライン プロセスでは、最初にテスト タスクを実行し、それが成功した場合は、後続のビルドおよびプッシュ タスクを実行します。次に、次の内容を含む test-pipeline.yaml という名前のリソース オブジェクトを作成します。 - # テストパイプライン.yaml
- apiバージョン: tekton.dev/v1beta1
- 種類: パイプライン
- メタデータ:
- 名前: テストパイプライン
- 仕様:
- リソース: # タスクの入力および出力リソース宣言を提供する
- -名前: デモgit
- タイプ: git
- -名前: 港のイメージ
- タイプ: 画像
- タスク: #パイプラインにタスクを追加する
- # アプリケーションテストを実行する
- -名前: テスト
- タスク参照:
- 名前: テスト
- リソース:
- 入力:
- - name : repo # タスク入力名
- resource: demo-git # パイプラインリソース名
- # Dockerイメージをビルドしてプッシュする
- -名前: ビルドとプッシュ
- タスク参照:
- 名前: ビルドとプッシュ
- 実行後:
- - test # テストタスクが実行された後
- リソース:
- 入力:
- - name : repo # 入力gitリポジトリリソースを指定します
- リソース: デモgit
- 出力: #出力画像リソースを指定する
- -名前: 組み込みイメージ
- リソース: 港のイメージ
まず、パイプラインに必要なリソース(入力リソースまたは出力リソース)を定義する必要があります。ここで入力されるのは、repo という名前のアプリケーション ソース コードの GitHub リポジトリの 1 つだけです。次に、タスクを定義します。各タスクは taskRef を通じて参照され、タスクに必要な入力パラメータが渡されます。 このリソース オブジェクトを直接作成することもできます。 - $ kubectl apply -f テストパイプライン.yaml
- pipeline.tekton.dev/test-pipeline が作成されました
先ほど、TaskRun を作成して Task タスクをトリガーするのと同様に、PipelineRun オブジェクトを作成してパイプラインを実行できることを説明しました。ここでは、パイプラインを実行するために、test-pipelinerun.yaml という名前の PipelineRun オブジェクトを作成します。ファイルの内容は次のとおりです。 - apiバージョン: tekton.dev/v1beta1
- 種類: PipelineRun
- メタデータ:
- 名前: test-pipelinerun
- 仕様:
- サービスアカウント名: build-sa
- パイプライン参照:
- 名前: テストパイプライン
- リソース:
- - name : demo-git # 入力gitリポジトリリソースを指定します
- リソース参照:
- 名前: デモgit
- - name : harbor-image #出力画像リソースを指定する
- リソース参照:
- 名前: 港のイメージ
定義方法はTaskRunとほぼ同じです。 ServiceAccount オブジェクトは serviceAccountName 属性を通じて指定され、pipelineRef はパイプライン オブジェクトに関連付けられます。同様に、このリソースを直接作成することもできます。これにより、作成後にパイプライン タスクがトリガーされます。 - $ kubectl apply -f テストパイプラインrun.yaml
- pipelinerun.tekton.dev/test-pipelinerun が作成されました
- $ github kubectl ポッドを取得します | grep テストパイプライン実行
- test-pipelinerun-build- and -push-62g65-pod-6jqqf 0/4 初期化:1/2 0 3秒
- test-pipelinerun-test-c4r9m-pod-j7jjd 0/2 完了 0 12秒
- $ tkn pipelinerun でテストパイプラインの実行を記述します
- 名前: test-pipelinerun
- 名前空間:デフォルト
- パイプライン参照: test-pipeline
- サービスアカウント: build-sa
- タイムアウト: 1時間0分0秒
- ラベル:
- tekton.dev/pipeline=テストパイプライン
-
- 🌡️ ステータス
-
- 開始期間ステータス
- 47秒前 22秒 成功しました
-
- 📦 リソース
-
- 名前リソース参照
- ∙ デモ git デモ git
- ∙ 港のイメージ 港のイメージ
-
- ⚓ パラメータ
-
- パラメータなし
-
- 📝 結果
-
- 結果なし
-
- 📂 ワークスペース
-
- ワークスペースなし
-
- 🗂 タスクラン
-
- 名前タスク名開始 所要時間 ステータス
- ∙ test-pipelinerun-build- and -push-62g65 build- and -push 38秒前 13秒 成功しました
- ∙ test-pipelinerun-test-c4r9m テスト 46秒前 8秒 成功
これは、パイプラインが正常に実行されたことを証明します。 Kubernetes クラスターに Tekton をインストールし、タスクを定義し、YAML マニフェストと Tekton CLI を使用して TaskRun を作成してテストしました。私たちは 2 つのタスクで構成される Tektok パイプラインを作成しました。最初のタスクは GitHub からコードを複製してアプリケーション テストを実行し、2 番目のタスクは Docker イメージをビルドして Docker Hub にプッシュします。 結果を使用してデータを渡す上記のように、イメージをビルドするときに、イメージタグがハードコードされているか、実行されるたびにパラメータを介して渡す必要があるため、面倒です。では、画像タグを自動的に生成する方法はあるのでしょうか?たとえば、タイムスタンプに基づいてビルド ID を生成します。 ここでタスクを定義し、スクリプトを使用してデータを取得し、結果に渡すことができます。これらの結果データをパイプライン内の他のタスクに渡すことができます。たとえば、git コミットの SHA 値を取得したり、ミラー タグとしてランダム ID を生成したりします。たとえば、ここでは generate-build-id という名前のタスクを作成し、get-timestamp と get-buildid という 2 つのステップを定義します。 1 つはタイムスタンプを生成するために使用され、もう 1 つは基本バージョンを含む結果値を生成するために使用され、その結果が結果に追加されます。 - # ビルドID.yamlを生成する
- apiバージョン: tekton.dev/v1beta1
- 種類: タスク
- メタデータ:
- 名前: ビルドIDを生成する
- 仕様:
- 説明: >-
- ベースバージョンを指定すると、このタスクは、次のコードを追加して一意のビルドIDを生成します。
- ベースバージョンを現在の タイムスタンプ。
- パラメータ:
- -名前: ベースバージョン
- 説明: 基本製品バージョン
- タイプ: 文字列
- デフォルト: "1.0"
- 結果:
- -名前:タイムスタンプ
- 説明:現在の タイムスタンプ
- -名前:ビルドID
- 説明:現在のビルドのID
- 手順:
- -名前: get-タイムスタンプ
- イメージ: bash:5.0.18
- スクリプト: |
- #!/usr/bin/env バッシュ
- ts=`日付 「+%Y%m%d-%H%M%S」 `
- echo "現在のタイムスタンプ: ${ts}"
- ${ts} をエコーします | tr -d "\n" | tee $(結果.タイムスタンプ.パス)
- -名前: get-buildid
- イメージ: bash:5.0.18
- スクリプト: |
- #!/usr/bin/env バッシュ
- ts=`cat $(results. timestamp .path)`
- ビルドId=$(inputs.params.base-version)-${ts}
- ${buildId} をエコーします | tr -d "\n" |ティー $(結果.ビルドID.パス)
上記のタスクを直接作成します。 - kubectl apply -f ビルドID.yaml を生成します
作成が完了したら、パイプラインでこのタスクを使用してビルド ID を生成できるようになります。 test-pipeline.yaml を変更し、generate-build-id タスクを追加します。 - # テストパイプライン.yaml
- apiバージョン: tekton.dev/v1beta1
- 種類: パイプライン
- メタデータ:
- 名前: テストパイプライン
- 仕様:
- リソース: # タスクの入力および出力リソース宣言を提供する
- -名前: デモgit
- タイプ: git
- -名前: 港のイメージ
- タイプ: 画像
- パラメータ:
- -名前:画像タグ
- タイプ: 文字列
- タスク: #パイプラインにタスクを追加する
- # アプリケーションテストを実行する
- -名前: テスト
- タスク参照:
- 名前: テスト
- リソース:
- 入力:
- - name : repo # タスク入力名
- resource: demo-git # パイプラインリソース名
- -名前: ビルドIDを取得
- タスク参照:
- 名前: ビルドIDを生成する
- パラメータ:
- -名前: ベースバージョン
- 値: $(params.image-tag)
- # Dockerイメージをビルドしてプッシュする
- -名前: ビルドとプッシュ
- タスク参照:
- 名前: ビルドとプッシュ
- 実行後:
- - test # テストタスクが実行された後
- リソース:
- 入力:
- - name : repo # 入力gitリポジトリリソースを指定します
- リソース: デモgit
- 出力: #出力画像リソースを指定する
- -名前: 組み込みイメージ
- リソース: 港のイメージ
- パラメータ:
- -名前: イメージタグ
- 値: "$(tasks.get-build-id.results.build-id)"
次に、ビルド アンド プッシュ タスクで、「$(tasks.get-build-id.results.build-id)」を通じてビルド ID を取得し、この ID をタスクにパラメーターとして渡します。そのため、ビルド アンド プッシュ タスクに build-id パラメーターも追加する必要があります。 - # タスクビルドプッシュ.yaml
- apiバージョン: tekton.dev/v1beta1
- 種類: タスク
- メタデータ:
- 名前: ビルドとプッシュ
- 仕様:
- リソース:
- 入力: #入力リソースを定義する
- - name : repo #GitHub上のリポジトリであるリソースを入力します
- タイプ: git
- 出力: #出力リソースを定義する
- - name :builtImage # 出力イメージ名
- タイプ: 画像
- パラメータ:
- - name : pathToDockerfile #リポジトリ内のdockerfileの場所を指定します
- タイプ: 文字列
- デフォルト: $(resources.inputs.repo.path)/Dockerfile # リポジトリリソースへのパス
- 説明:ビルドするdockerfileへのパス
- - name : pathToContext #ウェアハウス内のdockerfileの場所を指定します
- タイプ: 文字列
- デフォルト: $(resources.inputs.repo.path) # リポジトリリソースのパス
- 説明: dockerデーモンが使用するビルドコンテキスト
- -名前: イメージタグ
- タイプ: 文字列
- デフォルト: "v0.2.0"
- 説明: Docker イメージタグ
- 手順:
- -名前: ビルドとプッシュ
- イメージ: docker:stable
- スクリプト: |
- #!/usr/bin/envsh
- docker ログインharbor.k8s.local
- docker ビルド -t $(resources.outputs.builtImage.url):$(params.imageTag) -f $(params.pathToDockerfile) $(params.pathToContext)
- docker push $(resources.outputs.builtImage.url):$(params.imageTag) # ここでのパラメータは入力と出力で定義されます
- ボリュームマウント:
- - name : dockersock #docker.sock ファイルをマウントし、ホストの docker デーモンを使用してイメージを構築します
- マウントパス: /var/run/docker.sock
- ボリューム:
- -名前: dockersock
- ホストパス:
- パス: /var/run/docker.sock
次に、builtImage 出力リソースの URL 定義からイメージ タグを削除し、PipelineRun オブジェクトに image-tag パラメータを追加する必要があります。 - # テストパイプライン実行.yaml
- apiバージョン: tekton.dev/v1beta1
- 種類: PipelineRun
- メタデータ:
- 名前: test-pipelinerun
- 仕様:
- サービスアカウント名: build-sa
- パイプライン参照:
- 名前: テストパイプライン
- リソース:
- - name : demo-git # 入力gitリポジトリリソースを指定します
- リソース参照:
- 名前: デモgit
- - name : harbor-image #出力画像リソースを指定する
- リソース参照:
- 名前: 港のイメージ
- パラメータ:
- -名前:画像タグ
- 値: "v0.3.0"
すべての変更が完了したら、パイプライン全体を再実行できます。 - $ tkn pipelinerun ログ test-pipelinerun
- [test : git-source-repo-g68nd] { "level" : "info" , "ts" :1623934515.6170688, "caller" : "git/git.go:169" , "msg" : "https://github.com.cnpmjs.org/cnych/tekton-demo @ 5e1e3a1d0f167b9b639df5b802a0f0f81064d21e (grafted、HEAD、origin/master) をパス /workspace/repo に正常にクローンしました" }
- [テスト: git-source-repo-g68nd] { "level" : "info" , "ts" :1623934515.6349964, "caller" : "git/git.go:207" , "msg" : "パス/workspace/repoのサブモジュールが正常に初期化され、更新されました" }
-
- [テスト: run-test] 合格
- [テスト: run-test] ok _/workspace/repo 0.002秒
-
- [get-build-id : get- timestamp ]現在 タイムスタンプ: 20210617-125634
- [ビルドIDの取得:タイムスタンプの取得] 20210617-125634
-
- [ビルドIDの取得: ビルドIDの取得] v0.3.0-20210617-125634
-
-
- [build- and -push : git-source-repo-v2lhk] { "level" : "info" , "ts" :1623934601.68953, "caller" : "git/git.go:169" , "msg" : "https://github.com.cnpmjs.org/cnych/tekton-demo @ 5e1e3a1d0f167b9b639df5b802a0f0f81064d21e (grafted、HEAD、origin/master) をパス /workspace/repo に正常にクローンしました" }
- [build- and -push : git-source-repo-v2lhk] { "level" : "info" , "ts" :1623934601.7080255, "caller" : "git/git.go:207" , "msg" : "パス /workspace/repo のサブモジュールが正常に初期化され、更新されました" }
-
- [build- and -push : build- and -push]既存の資格情報を使用して認証しています...
- [build- and -push : build- and -push] ログインに成功しました
- [ビルドとプッシュ: ビルドとプッシュ] 警告!パスワードは暗号化されずに/root/.docker/config.jsonに保存されます。
- [build- and -push : build- and -push]この警告を削除するには、資格情報ヘルパーを構成します。見る
- [ビルドとプッシュ: ビルドとプッシュ] https://docs.docker.com/engine/reference/commandline/login/#credentials-store
- [ビルドとプッシュ: ビルドとプッシュ]
- [build- and -push : build- and -push] ビルドコンテキストをDocker デーモンに送信しています 154.1kB
- [ビルドとプッシュ: ビルドとプッシュ] ステップ 1/6: FROM golang:1.14-alpine
- ......
- [ビルドとプッシュ: ビルドとプッシュ] 2358e77bbe0e が正常にビルドされました
- [build- and -push : build- and -push] harbor.k8s のタグ付けに成功しました。ローカル/course/tekton-demo:v0.3.0-20210617-125634
- [build- and -push : build- and -push] プッシュはリポジトリ [harbor.k8s]を参照します。ローカル/course/tekton-demo]
- [ビルドとプッシュ: ビルドとプッシュ] f9a271a3fb3c: 準備中
- ......
- [ビルドとプッシュ: ビルドとプッシュ] 26ec43d351f2: プッシュされました
- [ビルドとプッシュ: ビルドとプッシュ] v0.3.0-20210617-125634: ダイジェスト: sha256:68be388e3f85dd10a6689a986eb2f7f7f5a5c89bb03f40c3db3178e0ce242752サイズ: 2198
-
- [build- and -push: image-digest-exporter-t54fb] { "severity" : "INFO" 、 "timestamp" : "2021-06-17T12:56:46.54052284Z" 、 "caller" : "logging/config.go:116" 、 "message" : "ロガーが正常に作成されました。" }
- [build- and -push: image-digest-exporter-t54fb] { "severity" : "INFO" 、 "timestamp" : "2021-06-17T12:56:46.541010181Z" 、 "caller" : "logging/config.go:117" 、 "message" : "ログレベルが info に設定されました" }
- [build- and -push: image-digest-exporter-t54fb] { "severity" : "INFO" 、 "timestamp" : "2021-06-17T12:56:46.541254959Z" 、 "caller" : "imagedigestexporter/main.go:59" 、 "message" : "builtImage の index.json が見つかりません" 、 "commit" : "7ca5d61" }
get-build-id タスクでは、v0.3.0-20210617-125634 などのミラー タグが生成され、最終的に結果を通じて次のビルド タスクに渡され、ミラー タグも更新されていることがわかります。 テクトンカタログもちろん、これらのタスクは実際には非常に普遍的です。このため、Tekton はいくつかの一般的なタスクを提供するカタログ サービスを公式に提供しています。たとえば、Git Commit に関する関連情報を取得したい場合は、https://artifacthub.io/packages/tekton-task/tekton-catalog-tasks/git-clone にあるカタログを使用できます。この文書には関連する使用手順も記載されています。 これまで、Tekton を使用して CI/CD パイプラインを作成する簡単な例を完了しましたが、この例は比較的単純です。次に、少し複雑なアプリケーションを使用して、以前の Jenkins パイプラインを完成させます。 |