Tekton を使用した自動化パイプラインのリファクタリング

Tekton を使用した自動化パイプラインのリファクタリング

[[407592]]

先ほど、Jenkins パイプラインを使用して Kubernetes アプリケーションに CI/CD を実装する方法について説明しました。それでは、このパイプラインを Tekton に移行しましょう。実際、全体的な考え方は同じで、ワークフロー全体をさまざまなタスクに分割して実行します。これまでのワークフロー ステージは、次のステージに分かれています: コードのクローン作成 -> ユニット テスト -> Golang のコンパイルとパッケージ化 -> Docker イメージのビルド/プッシュ -> Kubectl デプロイメント サービス。

Tekton では、これらのステージを Task タスクに直接変換できます。 Tekton のクローン コードでは、タスクを積極的に定義する必要はありません。実行されたタスクに入力コード リソースを指定するだけで済みます。次に、上記のワークフローを段階的に Tekton パイプラインに変換します。コード リポジトリは引き続き http://git.k8s.local/course/devops-demo.git です。

クローンコード

コードを複製するために別のタスクを定義する必要はありませんが、git タイプの入力リソースを直接使用できます。ここには多くのタスクが関係しており、多くの場合、操作する前にコードを複製する必要があるため、コードを複製し、ワークスペースを通じて他のタスクと共有するのが最善の方法です。ここでは、カタログ git-clone を直接使用してこのタスクを実装できます。ニーズに応じてカスタマイズすることも可能です。対応するタスクは次のとおりです。

  1. # タスククローン.yaml
  2. apiバージョン: tekton.dev/v1beta1
  3. 種類: タスク
  4. メタデータ:
  5. 名前: git-clone
  6. 仕様:
  7. ワークスペース:
  8. -名前:出力 
  9. 説明: Git リポジトリは、このワークスペースをバックアップするボリュームにクローンされます。
  10. -名前: 基本認証
  11. オプション: true  
  12. 説明: |
  13. .gitconfigおよび.git-credentials ファイルを含むワークスペース。これら
  14. gitコマンドが実行される前に、ユーザーホームコピーされますどれでも 
  15. このワークスペース内の他のファイルは無視されます。強くお勧めます
  16. 可能な限り基本認証ではなくssh-directoryを使用する 縛る
  17. 他のボリューム タイプよりもこのワークスペース秘密です
  18. パラメータ:
  19. -名前: URL
  20. 説明:クローンリポジトリ URL
  21. タイプ: 文字列
  22. -名前: リビジョン
  23. 説明: チェックアウトするリビジョン。 (ブランチ、タグ、sha、ref など)
  24. タイプ: 文字列
  25. デフォルト ""  
  26. -名前: 参照仕様
  27. 説明: Refspec リビジョンをチェックアウトする前に取得します
  28. デフォルト ""  
  29. -名前: サブモジュール
  30. 説明: 初期化し  Git サブモジュールを取得します
  31. タイプ: 文字列
  32. デフォルト: "true"  
  33. -名前: 深さ
  34. 説明:最新の N コミットのみを取得して、浅いクローンを実行します。
  35. タイプ: 文字列
  36. デフォルト: "1"  
  37. -名前: sslVerify
  38. 説明: `http.sslVerify`グローバルGit 設定を設定します。これを false 設定する  Git リモートを信頼できると確信していない限り、推奨されません
  39. タイプ: 文字列
  40. デフォルト: "true"  
  41. -名前: サブディレクトリ
  42. 説明:リポジトリをクローンする` output ` ワークスペース内のサブディレクトリ
  43. タイプ: 文字列
  44. デフォルト ""  
  45. -名前: sparseCheckoutDirectories
  46. 説明:スパースチェックアウトを実行するときに一致または除外するディレクトリパターンを定義ます。
  47. タイプ: 文字列
  48. デフォルト ""  
  49. -名前: 既存のものを削除
  50. 説明:クローン作成前に宛先ディレクトリがすでに存在する場合は、その内容削除します
  51. タイプ: 文字列
  52. デフォルト: "true"  
  53. -名前: 詳細
  54. 説明: `git-clone` の操作中に実行されるコマンドをログに記録します。
  55. タイプ: 文字列
  56. デフォルト: "true"  
  57. -名前: gitInitImage
  58. 説明:このタスクが実行するgit-initバイナリを提供するイメージ。
  59. タイプ: 文字列
  60. デフォルト: 「cnych/tekton-git-init:v0.24.1」  
  61. -名前: ユーザーホーム
  62. 説明: |
  63. ユーザーのホームディレクトリへの絶対パス非ルートユーザーとしてイメージを実行している場合は、これを明示的に設定します または上書きした
  64. カスタムユーザー設定を含むイメージを含むgitInitImage パラメータ
  65. タイプ: 文字列
  66. デフォルト: "/root"  
  67. 結果:
  68. -名前:コミット 
  69. 説明:このタスクによって取得された正確なコミットSHA
  70. -名前: URL
  71. 説明:このタスクによって取得された正確な URL。
  72. 手順:
  73. -名前:クローン
  74. 画像: "$(params.gitInitImage)"  
  75. 環境:
  76. -名前: HOME
  77. 値: "$(params.userHome)"  
  78. -名前: PARAM_URL
  79. 値: $(params.url)
  80. -名前: PARAM_REVISION
  81. 値: $(params.revision)
  82. -名前: PARAM_REFSPEC
  83. 値: $(params.refspec)
  84. -名前: PARAM_SUBMODULES
  85. 値: $(params.submodules)
  86. -名前: PARAM_DEPTH
  87. 値: $(params.depth)
  88. -名前: PARAM_SSL_VERIFY
  89. 値: $(params.sslVerify)
  90. -名前: PARAM_SUBDIRECTORY
  91. 値: $(params.subdirectory)
  92. -名前: PARAM_DELETE_EXISTING
  93. 値: $(params.deleteExisting)
  94. -名前: PARAM_VERBOSE
  95. 値: $(params.verbose)
  96. -名前: PARAM_SPARSE_CHECKOUT_DIRECTORIES
  97. 値: $(params.sparseCheckoutDirectories)
  98. -名前: PARAM_USER_HOME
  99. 値: $(params.userHome)
  100. -名前: WORKSPACE_OUTPUT_PATH
  101. 値: $(ワークスペース.出力.パス)
  102. -名前: WORKSPACE_BASIC_AUTH_DIRECTORY_BOUND
  103. 値: $(workspaces.basic-auth.bound)
  104. -名前: WORKSPACE_BASIC_AUTH_DIRECTORY_PATH
  105. 値: $(workspaces.basic-auth.path)
  106. スクリプト: |
  107. #!/usr/bin/envsh
  108. セット-eu
  109.  
  110. [ "${PARAM_VERBOSE}" = "true"の場合;それから 
  111. -xを設定する
  112. フィ
  113.  
  114. [ "${WORKSPACE_BASIC_AUTH_DIRECTORY_BOUND}" = "true"の場合;それから 
  115. cp "${WORKSPACE_BASIC_AUTH_DIRECTORY_PATH}/.git-credentials"   "${PARAM_USER_HOME}/.git-credentials"  
  116. cp "${WORKSPACE_BASIC_AUTH_DIRECTORY_PATH}/.gitconfig"   "${PARAM_USER_HOME}/.gitconfig"  
  117. chmod 400 "${PARAM_USER_HOME}/.git-credentials"  
  118. chmod 400 "${PARAM_USER_HOME}/.gitconfig"  
  119. フィ
  120.  
  121. CHECKOUT_DIR = "${WORKSPACE_OUTPUT_PATH}/${PARAM_SUBDIRECTORY}"  
  122.  
  123. クリーンディレクトリ() {
  124. 消去 リポジトリ ディレクトリ既存のコンテンツ(存在する場合)。
  125. #
  126. # ${CHECKOUT_DIR} が"/"である可能性があるため、単に"rm -rf ${CHECKOUT_DIR}" を実行するだけでは不十分です。  
  127. #またはマウントされたボリュームルート
  128. [ -d "${CHECKOUT_DIR}" ] の場合;それから 
  129. #隠しファイルディレクトリを削除する
  130. rm -rf "${CHECKOUT_DIR:?}" /*
  131. #始まるファイルディレクトリを削除します。ただし除きます。
  132. rm -rf "${CHECKOUT_DIR}" /.[!.]*
  133. # .. とその他文字始まるファイルディレクトリを削除します 
  134. rm -rf "${CHECKOUT_DIR}" /..?*
  135. フィ
  136. }
  137.  
  138. [ "${PARAM_DELETE_EXISTING}" = "true"の場合;それから 
  139. クリーンディレクトリ
  140. フィ
  141.  
  142. /ko-app/git-init \
  143. -url= "${PARAM_URL}" \
  144. -リビジョン= "${PARAM_REVISION}" \
  145. -refspec= "${PARAM_REFSPEC}" \
  146. -path= "${CHECKOUT_DIR}" \
  147. -sslVerify= "${PARAM_SSL_VERIFY}" \
  148. -submodules= "${PARAM_SUBMODULES}" \
  149. -depth= "${PARAM_DEPTH}" \
  150. -sparseCheckoutDirectories= "${PARAM_SPARSE_CHECKOUT_DIRECTORIES}"  
  151. cd "${CHECKOUT_DIR}"  
  152. RESULT_SHA = "$(git rev-parse HEAD)"  
  153. EXIT_CODE = "$?"  
  154. [ "${EXIT_CODE}" != 0 ] の場合;それから 
  155. 終了"${EXIT_CODE}"  
  156. フィ
  157. printf "%s"   "${RESULT_SHA}" > "$(results.commit.path)"  
  158. printf "%s"   "${PARAM_URL}" > "$(results.url.path)"  

一般的に言えば、永続化コード用の出力ワークスペースと、URL およびリビジョン パラメータのみを指定し、その他についてはデフォルトを使用します。

ユニットテスト

ユニットテストフェーズは比較的単純です。通常は、テスト コマンドを単純に実行するだけです。ここでは実際にユニットテストは実行しないので、簡単なテストで十分です。以下のようにタスクを記述します。

  1. # タスクテスト.yaml
  2. apiバージョン: tekton.dev/v1beta1
  3. 種類: タスク
  4. メタデータ:
  5. 名前: テスト
  6. 仕様:
  7. 手順:
  8. -名前: テスト
  9. イメージ: golang:1.14-alpine
  10. コマンド: [ 'echo' ]
  11. args: [ 'これはテストタスクです' ]

コンパイルとパッケージ化

2 番目の段階は、コンパイルとパッケージ化の段階です。私たちのプロジェクトの Dockerfile はマルチステージ構築を使用していないため、タスクを使用してアプリケーションをコンパイルし、バイナリ ファイルにパッケージ化し、コンパイルされたファイルをイメージ構築の次のタスクに渡す必要があります。

この段階で何をする必要があるかを明確に定義したので、タスクを記述するのは簡単です。次のタスクを作成するには、まずワークスペースを定義してクローン タスク内のコードを関連付ける必要があります。

  1. # タスクビルド.yaml
  2. apiバージョン: tekton.dev/v1beta1
  3. 種類: タスク
  4. メタデータ:
  5. 名前: ビルド
  6. 仕様:
  7. ワークスペース:
  8. -名前: go-repo
  9. マウントパス: /workspace/repo
  10. 手順:
  11. -名前:ビルド
  12. イメージ: golang:1.14-alpine
  13. 作業ディレクトリ: /workspace/repo
  14. スクリプト: |
  15. ビルド -v -o アプリ
  16. 環境:
  17. -名前: GOPROXY
  18. 値: https://goproxy.cn
  19. -名前:GOOS
  20. 値: Linux
  21. -名前: GOARCH
  22. 値: amd64

このビルドタスクも非常に簡単です。必要な環境変数を env を通じて直接挿入するだけです。もちろん、スクリプトに直接書き込むことも、コマンドを使用してタスクを直接実行することもできます。次に、生成されたアプリのバイナリ ファイルをビルドし、コードのルート ディレクトリに保存して、ワークスペースを通じて共有できるようにします。

Docker イメージ

次のステップは、Docker イメージをビルドしてプッシュすることです。これまで、Kaniko、DooD、DinD という 3 つのイメージ構築モードを紹介してきました。ここでは、DinD モードを直接使用します。ここで構築したいイメージ Dockerfile は非常にシンプルです。

  1. アルパインから
  2. ワークディレクトリ /home
  3.  
  4. # アルパインソースをAlibaba Cloudに変更
  5. 実行 sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories && \
  6. apkアップデート&& \
  7. apk アップグレード && \
  8. apk ca-certificatesを追加&& -ca-certificatesを更新&& \
  9. apk追加  --tzdata を更新 && \  
  10. rm -rf /var/cache/apk/*
  11.  
  12. アプリをコピー /home/
  13. ENV TZ=アジア/上海
  14.  
  15. エクスポーズ8080
  16.  
  17. エントリポイント ./app

コンパイルされたバイナリ ファイルをイメージに直接コピーできるため、以前のビルド タスクの成果物を取得するために Workspace も使用する必要があります。もちろん、DinD モードを使用してイメージをビルドするには、サイドカー機能を使用して、以下に示すようにタスクを作成する必要があります。

  1. #タスクDocker.yaml
  2. apiバージョン: tekton.dev/v1beta1
  3. 種類: タスク
  4. メタデータ:
  5. 名前: docker
  6. 仕様:
  7. ワークスペース:
  8. -名前: go-repo
  9. パラメータ:
  10. -名前:画像
  11. 説明:ドッカーが生成するイメージ参照。
  12. -名前: registry_mirror
  13. 説明: Dockerレジストリミラーを指定します
  14. デフォルト ""  
  15. -名前: レジストリURL
  16. 説明: プライベート Docker イメージ レジストリ URL
  17. 手順:
  18. - name : docker-build # ビルド手順
  19. イメージ: docker:stable
  20. 環境:
  21. - name : DOCKER_HOST # TLSを使用してTCP経由でサイドカーに接続します
  22. 値: tcp://localhost:2376
  23. - name : DOCKER_TLS_VERIFY # TLSを検証する
  24. 値: "1"  
  25. - name : DOCKER_CERT_PATH # サイドカーデーモンによって生成された証明書を使用する
  26. 値: /certs/client
  27. -名前: DOCKER_PASSWORD
  28. 値:
  29. シークレットキーリファレンス:
  30. 名前: ハーバー認証
  31. キー:パスワード 
  32. -名前: DOCKER_USERNAME
  33. 値:
  34. シークレットキーリファレンス:
  35. 名前: ハーバー認証
  36. キー: ユーザー名
  37. 作業ディレクトリ: $(workspaces.go-repo.path)
  38. スクリプト: | # docker ビルドコマンド
  39. docker ログイン $(params.registry_url) -u $DOCKER_USERNAME -p $DOCKER_PASSWORD
  40. イメージをコピーして、Docker イメージをビルドします。  
  41. docker push $(params.image)
  42. volumeMounts: #マウント証明書ディレクトリを宣言する
  43. - マウントパス: /certs/client
  44. 名前: dind-certs
  45. sidecars: # サイドカー モード、docker デーモン サービスを提供し、真の DinD モードを実現します
  46. - イメージ: docker:dind
  47. 名前: サーバー
  48. 引数:
  49. - --ストレージドライバー=vfs  
  50. - --userland-proxy=false  
  51. - --デバッグ 
  52. - --insecure-registry=$(params.registry_url)  
  53. - --registry-mirror=$(params.registry_mirror)  
  54. セキュリティコンテキスト:
  55. 特権: true  
  56. 環境:
  57. - name : DOCKER_TLS_CERTDIR #生成された証明書をクライアントと共有するパスに書き込みます
  58. 値: /certs
  59. ボリュームマウント:
  60. - マウントパス: /certs/client
  61. 名前: dind-certs
  62. readinessProbe: # dindデーモンがクライアントと共有する証明書を生成するのを待ちます
  63. 期間秒数: 1
  64. 実行:
  65. コマンド: [ "ls" , "/certs/client/ca.pem" ]
  66. ボリューム: # emptyDir を使用する
  67. -名前:dind-certs
  68. 空ディレクトリ: {}

このタスクの重要なポイントは、ワークスペースを宣言することです。タスクを実行するときは、上記でコンパイルされたアプリのバイナリ ファイルを取得できるように、前のビルド タスクと同じワークスペースを使用する必要があります。

展開する

次のデプロイメント段階では、以前の Jenkins パイプラインの実装を参照することもできます。プロジェクトには Helm Chart パッケージが含まれているため、Helm を直接使用してデプロイできます。もちろん、Helm デプロイメントを実装するには、まず helm コマンドを含むイメージが必要です。もちろん、そのようなタスクを自分で作成することもできます。さらに、カタログを見つけるために hub.tekton.dev に直接アクセスすることもできます。そこには、helm-upgrade-from-source タスクなど、私たちのニーズを完全に満たす一般的なタスクが多数あるためです。

ヘルムテクトン

カタログには完全な使用方法のドキュメントも含まれています。タスクを直接ダウンロードし、以下に示すように、独自のニーズに応じてカスタマイズされた変更を加えることができます。

  1. # タスクデプロイ.yaml
  2. apiバージョン: tekton.dev/v1beta1
  3. 種類: タスク
  4. メタデータ:
  5. 名前: デプロイ
  6. 仕様:
  7. パラメータ:
  8. -名前: charts_dir
  9. 説明:ソース内のHelmチャートを含むディレクトリ
  10. -名前:リリース名
  11. 説明: Helm リリース 
  12. -名前: リリース名前空間
  13. 説明: Helm リリース名前空間
  14. デフォルト ""  
  15. -名前: 上書き値
  16. 説明: 「上書きしたい値をカンマ区切りで指定します: autoscaling.enabled=true,replicas=1」  
  17. デフォルト ""  
  18. -名前: values_file
  19. 説明: 「使用する値ファイル」  
  20. デフォルト: "values.yaml"  
  21. -名前: helm_image
  22. 説明: 「使用する helm イメージ」  
  23. デフォルト: "docker.io/lachlanevenson/k8s-helm:v3.3.4@sha256:e1816be207efbd342cba9d3d32202e237e3de20af350617f8507dc033ea66803" #タグ: v3.3.4
  24. ワークスペース:
  25. -名前: ソース
  26. 結果:
  27. -名前: ヘルムステータス
  28. 説明: Helm デプロイステータス
  29. 手順:
  30. -名前: アップグレード
  31. 画像: $(params.helm_image)
  32. 作業ディレクトリ: /workspace/source
  33. スクリプト: |
  34. 現在インストールされている Helm リリースをエコーし​​ます
  35. helm list --namespace "$(params.release_namespace)"  
  36.  
  37. echo helm チャートをインストールしています...
  38. helm アップグレード--install --wait --values ​​"$(params.charts_dir)/$(params.values_file)" --create-namespace --namespace "$(params.release_namespace)" $(params.release_name) $(params.charts_dir) --debug --set "$(params.overwrite_values)"  
  39.  
  40. ステータス = `helm status $(params.release_name) --namespace "$(params.release_namespace)" | awk '/STATUS/ {$2 を印刷}'`  
  41. ${ステータス} をエコーし​​ます | tr -d "\n" |ティー $(results.helm-status.path)

Helm Chart テンプレートはコード リポジトリにあるため、Chart Repo リポジトリから取得する必要はありません。チャートのパスを指定するだけです。その他の構成可能なパラメータは、非常に柔軟な params パラメータを通じて公開されます。最後に、Helm デプロイメントのステータスも取得し、それを Results に書き込み、後続のタスク処理を容易にします。

ロールバック

最後に、アプリケーションがデプロイされた後、デプロイされたアプリケーションにエラーが発生する可能性があるため、ロールバックが必要になる場合があります。もちろん、このロールバックは自分でトリガーするのが最善ですが、Helm のデプロイメントが明らかに失敗した場合など、一部のシナリオでは自動的にロールバックできるため、ロールバックを実行する前にデプロイメントが失敗したタイミングを特定する必要があります。つまり、このタスクは必ずしも発生するわけではなく、特定のシナリオでのみ発生します。 WhenExpressions を使用して、パイプラインでこの関数を実装できます。条件は以前のバージョンで使用されていましたが、廃止されました。特定の条件が満たされた場合にのみタスクを実行するには、when フィールドを使用してタスクの実行を保護します。これにより、WhenExpressions への一連の参照をリストできます。

WhenExpressions は入力、演算子、値で構成されます。

  • Input は WhenExpressions の入力であり、静的入力または変数 (Params または Results) にすることができます。入力が指定されていない場合は、デフォルトで空の文字列になります。
  • 演算子は、入力と値の関係を表す演算子です。有効な演算子にはin、notinなどがある。
  • 値は文字列の配列です。空でない値の配列を指定する必要があります。静的な値や変数(Params、Results、Workspacesバインディング)も含めることができます。

タスク内で WhenExpressions が設定されている場合、宣言された WhenExpressions はタスクの実行前に評価されます。結果が True の場合、タスクが実行されます。 False の場合、タスクは実行されません。

ここで作成したロールバック タスクは次のとおりです。

  1. # タスクロールバック.yaml
  2. apiバージョン: tekton.dev/v1beta1
  3. 種類: タスク
  4. メタデータ:
  5. 名前:ロールバック 
  6. 仕様:
  7. パラメータ:
  8. -名前:リリース名
  9. 説明: Helm リリース 
  10. -名前: リリース名前空間
  11. 説明: Helm リリース名前空間
  12. デフォルト ""  
  13. -名前: helm_image
  14. 説明: 「使用する helm イメージ」  
  15. デフォルト: "docker.io/lachlanevenson/k8s-helm:v3.3.4@sha256:e1816be207efbd342cba9d3d32202e237e3de20af350617f8507dc033ea66803" #タグ: v3.3.4
  16. 手順:
  17. -名前:ロールバック 
  18. 画像: $(params.helm_image)
  19. スクリプト: |
  20. エコーロールバック 現在インストールされている Helm リリース
  21. helmロールバック$(params.release_name) --namespace $(params.release_namespace)  

組立ライン

ワークフロー タスク全体が作成されたので、これらすべてのタスクを連続して接続し、Pipeline パイプラインを形成できます。上記で定義したいくつかのタスクをパイプラインに参照します。もちろん、タスクで使用されるリソースまたはワークスペースも宣言する必要があります。

  1. # パイプライン.yaml
  2. apiバージョン: tekton.dev/v1beta1
  3. 種類: パイプライン
  4. メタデータ:
  5. 名前: パイプライン
  6. 仕様:
  7. ワークスペース: # ワークスペースを宣言する
  8. -名前: go-repo-pvc
  9. パラメータ:
  10. # コードリポジトリを定義する
  11. -名前: git_url
  12. -名前: リビジョン
  13. タイプ: 文字列
  14. デフォルト: "master"  
  15. # 画像パラメータを定義する
  16. -名前:画像
  17. -名前: レジストリURL
  18. タイプ: 文字列
  19. デフォルト: "harbor.k8s.local"  
  20. -名前: registry_mirror
  21. タイプ: 文字列
  22. デフォルト: "https://ot2k4d59.mirror.aliyuncs.com/"  
  23. # Helmチャートパラメータを定義する
  24. -名前: charts_dir
  25. -名前:リリース名
  26. -名前: リリース名前空間
  27. デフォルト: "デフォルト"  
  28. -名前: 上書き値
  29. デフォルト ""  
  30. -名前: values_file
  31. デフォルト: "values.yaml"  
  32. タスク: #パイプラインにタスクを追加する
  33. -名前:クローン
  34. タスク参照:
  35. 名前: git-clone
  36. ワークスペース:
  37. -名前:出力 
  38. ワークスペース: go-repo-pvc
  39. パラメータ:
  40. -名前: URL
  41. 値: $(params.git_url)
  42. -名前: リビジョン
  43. 値: $(params.revision)
  44. -名前: テスト
  45. タスク参照:
  46. 名前: テスト
  47. - name : build # バイナリプログラムをコンパイルする
  48. タスク参照:
  49. 名前: ビルド
  50. runAfter: # テストタスクの実行後にビルドタスクを実行する
  51. - テスト
  52. - クローン
  53. ワークスペース: # ワークスペースを渡す
  54. -名前: go-repo
  55. ワークスペース: go-repo-pvc
  56. - name : docker # Dockerイメージをビルドしてプッシュする
  57. タスク参照:
  58. 名前: docker
  59. 実行後:
  60. - 建てる
  61. ワークスペース: # ワークスペースを渡す
  62. -名前: go-repo
  63. ワークスペース: go-repo-pvc
  64. params: # パラメータを渡す
  65. -名前:画像
  66. 値: $(params.image)
  67. -名前: レジストリURL
  68. 値: $(params.registry_url)
  69. -名前: registry_mirror
  70. 値: $(params.registry_mirror)
  71. - name : deploy # アプリケーションをデプロイする
  72. タスク参照:
  73. 名前: デプロイ
  74. 実行後:
  75. - ドッカー
  76. ワークスペース:
  77. -名前: ソース
  78. ワークスペース: go-repo-pvc
  79. パラメータ:
  80. -名前: charts_dir
  81. 値: $(params.charts_dir)
  82. -名前:リリース名
  83. 値: $(params.release_name)
  84. -名前: リリース名前空間
  85. 値: $(params.release_namespace)
  86. -名前: 上書き値
  87. 値: $(params.overwrite_values)
  88. -名前: values_file
  89. 値: $(params.values_file)
  90. -名前:ロールバック# ロールバック
  91. タスク参照:
  92. 名前:ロールバック 
  93. いつ
  94. - 入力: "$(tasks.deploy.results.helm-status)"  
  95. 演算子: in  
  96. : [ "失敗" ]
  97. パラメータ:
  98. -名前:リリース名
  99. 値: $(params.release_name)
  100. -名前: リリース名前空間
  101. 値: $(params.release_namespace)

全体的なプロセスは比較的簡単です。パイプラインでは、ワークスペース、リソース、パラメーターなどの使用するリソースを宣言し、宣言したデータをタスクに渡す必要があります。最後のロールバックタスクでは、前回のデプロイタスクの結果に基づいてタスクを実行するかどうかを決定する必要があることに注意してください。そのため、ここでは when 属性を使用して、$(tasks.deploy.results.helm-status) を通じてデプロイステータスを取得します。

実行パイプライン

これで、パイプラインを実行して、独自の要件を満たしているかどうかを確認できます。まず、Workspace に対応する PVC や、GitLab および Harbor の認証情報など、関連するその他のリソース オブジェクトを作成する必要があります。

  1. # その他の.yaml
  2. APIバージョン: v1
  3. 種類: 秘密
  4. メタデータ:
  5. 名前: gitlab-auth
  6. 注釈:
  7. tekton.dev/git-0: http : //git.k8s.local  
  8. タイプ: kubernetes.io/basic-auth
  9. 文字列データ:
  10. ユーザー名: root
  11. パスワード: admin321
  12.  
  13. ---  
  14.  
  15. APIバージョン: v1
  16. 種類: 秘密
  17. メタデータ:
  18. 名前: ハーバー認証
  19. 注釈:
  20. tekton.dev/docker-0: http : //harbor.k8s.local  
  21. タイプ: kubernetes.io/basic-auth
  22. 文字列データ:
  23. ユーザー名: admin
  24. パスワード: Harbor12345
  25.  
  26. ---  
  27. APIバージョン: v1
  28. 種類: サービスアカウント
  29. メタデータ:
  30. 名前: tekton-build-sa
  31. 秘密:
  32. -名前: harbor-auth
  33. -名前: gitlab-auth
  34.  
  35. ---  
  36.  
  37. apiバージョン: rbac。認証.k8s.io/v1
  38. 種類: ClusterRoleBinding
  39. メタデータ:
  40. 名前: tekton-clusterrole-binding
  41. ロールリファレンス:
  42. apiGroup : rbac.authorization.k8s.io
  43. 種類: ClusterRole
  44. 名前: 編集
  45. 科目:
  46. - 種類: サービスアカウント
  47. 名前: tekton-build-sa
  48. 名前空間:デフォルト 
  49.  
  50. ---  
  51. APIバージョン: v1
  52. 種類: PersistentVolumeClaim
  53. メタデータ:
  54. 名前: go-repo-pvc
  55. 仕様:
  56. リソース:
  57. リクエスト:
  58. ストレージ: 1Gi
  59. ボリュームモード: ファイルシステム
  60. storageClassName: nfs-storage # StorageClassを使用してPVを自動的に生成します
  61. アクセスモード:
  62. -一度だけ読み書き可能

これらの関連リソース オブジェクトが作成された後、上記の ServiceAccount にアクセス許可をバインドする必要もあります。 Helm コンテナ内でいくつかのクラスター リソースを操作する必要があるため、最初に権限を宣言する必要があります。ここで、tekton-build-sa を編集 ClusterRole にバインドできます。

次に、パイプライン ビルドをトリガーする PipelineRun リソース オブジェクトを作成します。

  1. # パイプライン実行.yaml
  2. apiバージョン: tekton.dev/v1beta1
  3. 種類: PipelineRun
  4. メタデータ:
  5. 名前: パイプライン実行
  6. 仕様:
  7. サービスアカウント名: tekton-build-sa
  8. パイプライン参照:
  9. 名前: パイプライン
  10. ワークスペース:
  11. -名前: go-repo-pvc
  12. 永続ボリュームクレーム:
  13. クレーム名: go-repo-pvc
  14. パラメータ:
  15. -名前: git_url
  16. 値: http://git.k8s。ローカル/course/devops-demo.git
  17. -名前:画像
  18. 値: "harbor.k8s.local/course/devops-demo:v0.1.0"  
  19. -名前: charts_dir
  20. 値: "./helm"  
  21. -名前:リリース名
  22. 値: devops-demo
  23. -名前: リリース名前空間
  24. 値: "kube-ops"  
  25. -名前: 上書き値
  26. 値: "image.repository=harbor.k8s.local/course/devops-demo,image.tag=v0.1.0"  
  27. -名前: values_file
  28. 値: "my-values.yaml"  

Pipeline パイプラインを実行するには、上記のリソース オブジェクトを作成するだけです。

  1. $ kubectl apply -f パイプライン実行.yaml
  2. $ tkn pr パイプライン実行を記述する
  3. 名前: pipelinerun
  4. 名前空間:デフォルト 
  5. パイプライン参照: パイプライン
  6. サービスアカウント: tekton-build-sa
  7. タイムアウト: 1時間0分0秒
  8. ラベル:
  9. tekton.dev/pipeline=パイプライン
  10.  
  11. 🌡️ ステータス
  12.  
  13. 開始期間ステータス
  14. 1前 1成功しました(完了)
  15.  
  16. 📦 リソース
  17.  
  18. リソースなし
  19.  
  20. ⚓ パラメータ
  21.  
  22. 名前
  23. ∙ git_url http://git.k8s.ローカル/course/devops-demo.git
  24. ∙ 画像 harbor.k8s。ローカル/course/devops-demo:v0.1.0
  25. ∙ charts_dir ./helm
  26. ∙ リリース名 devops-demo
  27. ∙ release_namespace kube-ops
  28. ∙ overwrite_values ​​image.repository=harbor.k8s。ローカル/course/devops-demo、image.tag=v0.1.0
  29. ∙ values_file my- values ​​.yaml
  30.  
  31. 📝 結果
  32.  
  33. 結果なし
  34.  
  35. 📂 ワークスペース
  36.  
  37. 名前サブパス ワークスペース バインディング
  38. ∙ go-repo-pvc --- PersistentVolumeClaim (claimName=go-repo-pvc)  
  39.  
  40. 🗂 タスクラン
  41.  
  42. 名前タスク開始 所要時間 ステータス
  43. ∙ pipelinerun-deploy-zpmg9 デプロイ 33 秒前 15 秒 成功
  44. ∙ pipelinerun-docker-rkhxq docker 1前 45秒 成功
  45. ∙ pipelinerun-build-gnnsp ビルド 1前 15 秒 成功
  46. ∙ pipelinerun-test-z5ppb テスト 1前 5 秒 成功
  47. ∙ pipelinerun-clone-xdrjh クローン 1前 8 秒 成功
  48.  
  49. # デプロイメントに成功しました
  50. $ curl devops- demo.k8s.localを実行します。  
  51. { "msg" : "Kubernetes での DevOps へようこそ" }

ダッシュボードでは、パイプラインが正常に実行できることも確認できます。デプロイメントは成功したため、ロールバック タスクは無視されます。

パイプラインを展開

トリガー

パイプライン全体が正常に実行されました。次の最後のステップは、Gitlab と Tekton を接続すること、つまり、Tekton Trigger を通じてビルドを自動的にトリガーすることです。 Tekton Trigger の使用方法についてはすでに詳しく説明したので、ここでは詳しく説明しません。もちろん、使用する前にインターセプターをデプロイする必要があります。

  1. kubectl apply -f https://storage.googleapis.com/tekton-releases/triggers/previous/v0.14.2/interceptors.yaml

まず、Gitlab Webhook アクセス用のシークレット トークンを追加します。また、この Secret を上記で使用した ServiceAccount に関連付け、対応する RBAC 権限の追加を続けます。

  1. # その他の.yaml
  2. # ......
  3. APIバージョン: v1
  4. 種類: 秘密
  5. メタデータ:
  6. 名前: gitlab-secret
  7. タイプ: 不透明
  8. 文字列データ:
  9. シークレットトークン: "1234567"  
  10.  
  11. ---  
  12.  
  13. APIバージョン: v1
  14. 種類: サービスアカウント
  15. メタデータ:
  16. 名前: tekton-build-sa
  17. 秘密:
  18. -名前: harbor-auth
  19. -名前: gitlab-auth
  20. -名前: gitlab-secret
  21.  
  22. ---  
  23. apiバージョン: rbac。認証.k8s.io/v1
  24. 種類: 役割
  25. メタデータ:
  26. 名前: tekton-triggers-gitlab-minimal
  27. ルール:
  28. #イベントリスナー フェッチ すべての名前空間リソース
  29. - apiグループ: [ "triggers.tekton.dev" ]
  30. リソース: [ "イベントリスナー" "トリガーバインディング" "トリガーテンプレート" "トリガー" ]
  31. 動詞: [ 「取得する」 「一覧表示する」 「見る」 ]
  32. -apiグループ: [ "" ]
  33. #ログ設定を更新するにはconfigmapsが必要です
  34. リソース: [ "configmaps" ]
  35. 動詞: [ 「取得する」 「一覧表示する」 「見る」 ]
  36. #権限 関連するトリガーテンプレートリソースを作成する
  37. -apiグループ: [ "tekton.dev" ]
  38. リソース: [ "pipelineruns" "pipelineresources" "taskruns" ]
  39. 動詞: [ "作成する" ]
  40. -apiグループ: [ "" ]
  41. リソース: [ "serviceaccounts" ]
  42. 動詞: [ 「なりすます」 ]
  43. -apiGroups: [ "ポリシー" ]
  44. リソース: [ "podsecuritypolicies" ]
  45. resourceNames: [ "tekton-triggers" ]
  46. 動詞: [ "使用する" ]
  47. ---  
  48. apiバージョン: rbac。認証.k8s.io/v1
  49. 種類: RoleBinding
  50. メタデータ:
  51. 名前: tekton-triggers-gitlab-binding
  52. 科目:
  53. - 種類: サービスアカウント
  54. 名前: tekton-build-sa
  55. ロールリファレンス:
  56. apiGroup : rbac.authorization.k8s.io
  57. 種類: 役割
  58. 名前: tekton-triggers-gitlab-minimal
  59. ---  
  60. 種類: ClusterRole
  61. apiバージョン: rbac。認証.k8s.io/v1
  62. メタデータ:
  63. 名前: tekton-triggers-gitlab-clusterrole
  64. ルール:
  65. #イベントリスナー フェッチ 任意のクラスタートリガーバインディング
  66. - apiグループ: [ "triggers.tekton.dev" ]
  67. リソース: [ "clustertriggerbindings" "clusterinterceptors" ]
  68. 動詞: [ 「取得する」 「一覧表示する」 「見る」 ]
  69. ---  
  70. apiバージョン: rbac。認証.k8s.io/v1
  71. 種類: ClusterRoleBinding
  72. メタデータ:
  73. 名前: tekton-triggers-gitlab-clusterbinding
  74. 科目:
  75. - 種類: サービスアカウント
  76. 名前: tekton-build-sa
  77. 名前空間:デフォルト 
  78. ロールリファレンス:
  79. apiGroup : rbac.authorization.k8s.io
  80. 種類: ClusterRole
  81. 名前: tekton-triggers-gitlab-clusterrole

次に、次に示すように、Gitlab の Push Event イベントを受信するための EventListener リソース オブジェクトを作成できます。

  1. # gitlab-リスナー.yaml
  2. apiバージョン: triggers.tekton.dev/v1alpha1
  3. 種類: イベントリスナー
  4. メタデータ:
  5. name : gitlab-listener # このイベントリスナーはel-gitlab-listenerという名前のサービスオブジェクトを作成します
  6. 仕様:
  7. サービスアカウント名: tekton-build-sa
  8. トリガー:
  9. -名前: gitlab-push-events-トリガー 
  10. 迎撃機:
  11. - 参照:
  12. 名前: gitlab
  13. パラメータ:
  14. - name : secretRef # gitlab-secret の Secret オブジェクト内の secretToken の値を参照します
  15. 価値:
  16. シークレット名: gitlab-secret
  17. シークレットキー: シークレットトークン
  18. -名前: イベントタイプ
  19. 価値:
  20. - プッシュフック # GitLab プッシュイベントのみを受信する
  21. バインディング: #TriggerBinding を定義し、パラメータを構成する
  22. -名前: gitrevision
  23. 値: $(body.checkout_sha)
  24. -名前: gitリポジトリURL
  25. 値: $(body.repository.git_http_url)
  26. テンプレート:
  27. 参照: gitlab-テンプレート

上記では、TriggerBinding を通じて gitrevision と gitrepositoryurl の 2 つのパラメータを定義しました。これら 2 つのパラメータの値は、Gitlab から送信された POST リクエストから取得でき、その後、これら 2 つのパラメータを TriggerTemplate オブジェクトに渡すことができます。ここでのテンプレートは、実際には上で定義した PipelineRun オブジェクトのテンプレートであり、以下に示すように、主に 2 つのパラメーター git_url と mirror TAG を置き換えます。

  1. # gitlab-テンプレート.yaml
  2. apiバージョン: triggers.tekton.dev/v1alpha1
  3. 種類: トリガーテンプレート
  4. メタデータ:
  5. 名前: gitlab-template
  6. 仕様:
  7. params: #TriggerBinding と一致するパラメータを定義します
  8. -名前: gitrevision
  9. -名前: gitリポジトリURL
  10. resourcetemplates: #リソーステンプレートを定義する
  11. - apiバージョン: tekton.dev/v1beta1
  12. kind: PipelineRun # パイプラインテンプレートを定義する
  13. メタデータ:
  14. generateName: gitlab-run- # TaskRun 名のプレフィックス
  15. 仕様:
  16. サービスアカウント名: tekton-build-sa
  17. パイプライン参照:
  18. 名前: パイプライン
  19. ワークスペース:
  20. -名前: go-repo-pvc
  21. 永続ボリュームクレーム:
  22. クレーム名: go-repo-pvc
  23. パラメータ:
  24. -名前: git_url
  25. 値: $(tt.params.gitrepositoryurl)
  26. -名前:画像
  27. 値: "harbor.k8s.local/course/devops-demo:$(tt.params.gitrevision)"  
  28. -名前: charts_dir
  29. 値: "./helm"  
  30. -名前:リリース名
  31. 値: devops-demo
  32. -名前: リリース名前空間
  33. 値: "kube-ops"  
  34. -名前: 上書き値
  35. 値: "image.repository=harbor.k8s.local/course/devops-demo,image.tag=$(tt.params.gitrevision)"  
  36. -名前: values_file
  37. 値: "my-values.yaml"  

上記で作成したリソース オブジェクトを作成するだけです。これにより、Webhook リクエストを受信するためのイベント リスト サービスが作成されます。

  1. $ kubectl イベントリスナーを取得する
  2. 名前住所 利用可能理由 準備完了理由
  3. gitlab-listener http://el-gitlab-listener.デフォルトは.svc.cluster です。ローカル:8080 True MinimumReplicasAvailable True  

したがって、Gitlab リポジトリで Webhook を必ず設定してください。

GitLabウェブフック

このようにして、トリガーとリスナー全体が構成されます。次に、プロジェクト コードを変更してコードを送信します。通常の送信後、パイプラインを実行するための PipelinRun オブジェクトがクラスター内に作成されます。

  1. $ kubectl パイプライン実行を取得します
  2. 名前成功 理由 開始時間 完了時間
  3. gitlab-run-kx6zr完了 2分14秒50秒
  4. $ curl devops- demo.k8s.localを実行します。  
  5. { "msg" : "こんにちは、Tekton" }

パイプラインが正常に実行されると、アプリケーションが新しく送信したコードが正常にデプロイされたことがわかります。この時点で、Tekton を使用してプロジェクトをリファクタリングするパイプラインが完了しました。

<<:  Redisson 分散ロック ソースコード 1: 再入可能ロック

>>:  / と /* の違いが思い出せませんか?私の答えはあなたにとって忘れられないものになるでしょう

推薦する

InterServer: 75% オフ、年間 25 ドル、無制限の Web ホスティング、22 年の信頼のブランド

InterServer は今年、ブラックフライデーとサイバーマンデーの黄金期間に、最大 75% の割...

クラウドからデータセンターへの移行におけるネットワークの考慮事項

パフォーマンス、セキュリティ上の懸念、高コストは、組織がワークロードをクラウドからデータセンターに移...

ウェブサイトを構築するのに最適な時期は10年前、2番目に最適な時期は現在です

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています昨今、多く...

ゲーム株は全面的に急落し、1日で1457億ドル以上が消失した。

ここ 2 日間、屋上は非常に混雑しています。** が上がるとすぐに、株式投機家がそれに続きます。米中...

グループ購入ウェブサイトの統合が第一陣に広がる

注目を集める資金調達、狂気じみた拡大、そしてサイトの縮小を経て、共同購入業界の再編は今年4月から加速...

SEOチャット

SEO Chat は強力なキーワード ツールです。Google キーワード サジェスト ツールは、G...

Yibaixun Technologyは「職人精神」を活用して、さまざまな業界の顧客のWebサイト構築を支援します

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています現在、イン...

なぜ今がオンプレミスのインフラストラクチャをプライベートクラウドに置き換える時期なのか

オンプレミス展開の課題を克服することで、企業はパフォーマンス、コスト、セキュリティを組み合わせて正確...

クラウドネイティブアプリケーション開発を始める方法

翻訳者 |陸新王校正 |孫淑娟、梁策1200億ドル。 Forrester のレポートによると、これが...

百度のニュース - 元記事が再び論争を巻き起こす

はじめに:Lu Songsong のブログ - 独創性は Baidu の支持を得られない宋達達氏のこ...

Tencent 広告「広告を削除」

2018年頃、モバイルインターネット界全体が「トラフィック枯渇」「ボーナス消滅」「いよいよ後半戦」と...

SEOの道を再び歩むと、世界は以前と同じではなくなる

2年前、家族のファームステイのウェブサイトのために、SEOについて何も知らない素人から、A5やSEO...

SEO実践者の将来のキャリア開発の方向性と計画について

多くの人にとって、SEO は比較的簡単なスキルです。コンテンツ + 外部リンクで、基本的に SEO ...

「クラウドコンピューティング」は現在、「フォグコンピューティング」は未来?

過去 10 年間のテクノロジーにおける最大のトレンドの 1 つは、企業間でクラウド コンピューティン...

企業が百科事典プラットフォームを推進することはもはや困難ではない

中国ではインターネットの普及はピークに達したと言え、企業によるマーケティングへのインターネットの活用...