GitLabがTektonタスクビルドをトリガーする

GitLabがTektonタスクビルドをトリガーする

[[407261]]

以前は、TaskRun または PipelineRun オブジェクトを作成してタスクをトリガーしていました。しかし、実際の作業では、開発者はコードを送信した後にタスクをトリガーすることがよくあります。このとき、Tekton のトリガーの概念が必要になります。

Tekton トリガーワークフロー

Triggers は、次の CRD オブジェクトを通じて Tekton を拡張します。

  • TriggerTemplate: PipelineResource や PipelineRun などのリソースを作成するためのテンプレート
  • TriggerBinding: イベントをチェックし、関連するフィールド属性を抽出します
  • ClusterTriggerBinding: TriggerBindingに似ていますが、グローバルです
  • インターセプター: カスタム検証またはフィルタリングのイベントを処理する
  • EventListener: TriggerBinding と TriggerTemplate をイベント レシーバーに接続し、各 TriggerBinding から抽出されたパラメーターを使用して TriggerTemplate で指定されたリソースを作成し、インターセプター フィールドを通じてイベント属性を前処理する外部サービスも指定します。

Tekton Triggers を使用するには、対応するコントローラーもインストールする必要があります。これは、次のコマンドに示すように、tektoncd/triggers の GitHub リポジトリの指示に従って直接インストールできます (バージョン v0.14.2 では、2 つのリソース リストをインストールする必要があることに注意してください)。

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

次のコマンドを使用すると、トリガーの関連コンポーネントがすべて実行状態になるまでのインストール ステータスを表示できます。

  1. $ kubectl ポッドを取得します--namespace tekton-pipelines  
  2. 名前準備完了 ステータス 再起動 年齢
  3. tekton-dashboard-6fcbd956f4-vvlrz 1/1 実行中 4 15d
  4. tekton-pipelines-controller-795dd94d96-lkbxt 1/1 実行中 5 17d
  5. tekton-pipelines-webhook-6b8964445d-mp4k6 1/1 実行中 5 17d
  6. tekton-triggers-controller-989875ff7-tlc4v 1/1 実行中 0 3h16m
  7. tekton-triggers-core-interceptors-6494c8cfc4-hb8sk 1/1 実行中 0 2分10秒
  8. tekton-triggers-webhook-787849d8db-ch28w 1/1 実行中 0 3時間16分

ここで、以前の Jenkins Pipeline パイプラインを変換して、ビルドに Tekton を使用するようにします。コードは、http://git.k8s.local/course/devops-demo.git にあるプライベート リポジトリ GitLab にプッシュされています。

まず、トリガーの設定を完了する必要があります。ソースコードを GitLab に送信するときは、Tekton タスクの実行をトリガーする必要があるため、まずこのトリガーを完了する必要があります。これは、EventListener リソース オブジェクトを通じて実行できます。 gitlab-listener という名前の EventListener リソース オブジェクトを作成します。ファイルの内容は次のとおりです。

  1. # gitlab-push-listener.yaml
  2. apiバージョン: triggers.tekton.dev/v1alpha1
  3. 種類: イベントリスナー
  4. メタデータ:
  5. name : gitlab-listener # このイベントリスナーはel-gitlab-listenerという名前のサービスオブジェクトを作成します
  6. 仕様:
  7. サービスアカウント名: tekton-triggers-gitlab-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. バインディング:
  22. - 参照: devops-demo-binding
  23. テンプレート:
  24. 参照: devops-デモテンプレート

EventListener が作成されると、イベント応答を受信するために公開されるリスナー サービスが生成されます。たとえば、上記で作成したオブジェクトの名前は gitlab-listener です。作成後、el-gitlab-listener という名前の Service オブジェクトが生成されます。 GitLab 自体はクラスター内にあるため、Service の DNS 形式を使用して EventListener にアクセスできます。クラスターの外部に公開する場合は、NodePort または Ingress を使用できます。

注目すべきもう 1 つの点は、組み込みの GitLab インターセプターを持つ上記の EventListener オブジェクトに interceptors プロパティを追加したことです。 GitLab インターセプターには、GitLab からのリクエストを検証およびフィルタリングするためのロジックが含まれています。たとえば、Secret オブジェクトを通じて導入できる WebHook の Secret Token を設定できます。

  1. 迎撃機:
  2. - 参照:
  3. 名前: gitlab
  4. パラメータ:
  5. - name : secretRef # gitlab-secret の Secret オブジェクト内の secretToken の値を参照します
  6. 価値:
  7. シークレット名: gitlab-secret
  8. シークレットキー: シークレットトークン
  9. -名前: イベントタイプ
  10. 価値:
  11. - プッシュフック # GitLab プッシュイベントのみを受信する

対応する Secret リソース オブジェクトは次のとおりです。1 つは WebHook の Secret Token 用で、もう 1 つは GitLab ログイン認証用です。

  1. # gitlab-secret.yaml
  2. APIバージョン: v1
  3. 種類: 秘密
  4. メタデータ:
  5. 名前: gitlab-secret
  6. タイプ: 不透明
  7. 文字列データ:
  8. シークレットトークン: '1234567'  
  9. ---  
  10. APIバージョン: v1
  11. 種類: 秘密
  12. メタデータ:
  13. 名前: gitlab-auth
  14. 注釈:
  15. tekton.dev/git-0: http : //git.k8s.local  
  16. タイプ: kubernetes.io/basic-auth
  17. 文字列データ:
  18. ユーザー名: root
  19. パスワード: admin321

EventListener オブジェクトは他のリソース オブジェクトにアクセスする必要があるため、RBAC は次のように宣言する必要があります。

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

次に最も重要なのは、TriggerBinding オブジェクトと TriggerTemplate オブジェクトです。上記の EventListener オブジェクトでは、2 つのオブジェクトを結合します。

  1. バインディング:
  2. - ref: gitlab-push-binding # TriggerBinding オブジェクト
  3. テンプレート:
  4. ref: gitlab-echo-template # TriggerTemplate オブジェクト

これにより、TriggerBinding 内のパラメータをテンプレート用の TriggerTemplate オブジェクトに渡すことができます。たとえば、ここでは TriggerBinding オブジェクトを以下のように定義します。

  1. apiバージョン: triggers.tekton.dev/v1alpha1
  2. 種類: トリガーバインディング
  3. メタデータ:
  4. 名前: devops-demo-binding
  5. 仕様:
  6. パラメータ:
  7. -名前: gitrevision
  8. 値: $(body.checkout_sha)
  9. -名前: gitリポジトリURL
  10. 値: $(body.repository.git_http_url)

GitLab WebHook から送信されたデータ値を $() で囲まれた JSONPath 式を通じて読み取ることで、パラメータ値を抽出することに注意してください。式の詳しい使用方法については、公式ドキュメントを参照してください。どのようなパラメータ値を抽出できるかについては、WebHookの説明を参照してください。たとえば、ここでは GitLab Webhook の Push Hook であり、対応するリクエスト本体のデータは次のようになります。

  1. {
  2. "object_kind" : "プッシュ"
  3. 「以前」 : 「95790bf891e76fee5e1747ab589903a6a1f80f22」
  4. 「後」 : 「da1560886d4f094c3e6c9ef40349f7d38b5d27d7」
  5. 「ref」 : 「refs/heads/master」
  6. "チェックアウト_sha" : "da1560886d4f094c3e6c9ef40349f7d38b5d27d7"
  7. "ユーザーID" : 4,
  8. 「ユーザー名」 : 「ジョン・スミス」
  9. "user_username" : "jsmith"
  10. "user_email" : "[email protected]"
  11. 「ユーザーアバター」 : 「https://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=8://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=80」
  12. "プロジェクトID" : 15,
  13. "プロジェクト" : {
  14. 「id」 : 15,
  15. 「名前」 「ディアスポラ」
  16. "説明" ""
  17. 「web_url」 : 「http://example.com/mike/diaspora」
  18. "アバターURL" : null ,
  19. "git_ssh_url" : "[email protected]:mike/diaspora.git"
  20. "git_http_url" : "http://example.com/mike/diaspora.git"
  21. 「名前空間」 : 「マイク」
  22. "可視性レベル" :0,
  23. "path_with_namespace" : "mike/diaspora"
  24. "default_branch" : "マスター"
  25. 「ホームページ」 : 「http://example.com/mike/diaspora」
  26. 「url」 : [email protected]:mike/diaspora.git」
  27. "ssh_url" : "[email protected]:mike/diaspora.git"
  28. "http_url" : "http://example.com/mike/diaspora.git"  
  29. },
  30. 「リポジトリ」 : {
  31. 「名前」 「ディアスポラ」
  32. 「url」 : [email protected]:mike/diaspora.git」
  33. "説明" ""
  34. 「ホームページ」 : 「http://example.com/mike/diaspora」
  35. "git_http_url" : "http://example.com/mike/diaspora.git"
  36. "git_ssh_url" : "[email protected]:mike/diaspora.git"
  37. 「可視性レベル」 :0
  38. },
  39. 「コミット」 : [
  40. {
  41. 「id」 : 「b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327」
  42. "メッセージ" : "カタロニア語の翻訳を e38cb41 に更新しました。\n\n詳細については、https://gitlab.com/gitlab-org/gitlab を参照してください" ,
  43. "title" : "カタロニア語の翻訳を e38cb41 に更新します。"
  44. 「タイムスタンプ」 : 「2011-12-12T14:27:31+02:00」
  45. 「URL」 : 「http://example.com/mike/diaspora/commit/b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327」
  46. "著者" : {
  47. 「名前」 : 「ジョルディ・マラック」
  48. 「メール」 : [email protected]  
  49. },
  50. 「追加」 : [ 「変更履歴」 ],
  51. "変更済み" : [ "app/controller/application.rb" ],
  52. 「削除」 : []
  53. },
  54. {
  55. 「id」 : 「da1560886d4f094c3e6c9ef40349f7d38b5d27d7」
  56. 「メッセージ」 : 「readme を修正しました」
  57. 「タイトル」 : 「readme を修正しました」
  58. 「タイムスタンプ」 : 「2012-01-03T23:36:29+02:00」
  59. 「URL」 : 「http://example.com/mike/diaspora/commit/da1560886d4f094c3e6c9ef40349f7d38b5d27d7」
  60. "著者" : {
  61. "name" : "GitLab 開発ユーザー" ,
  62. 「メール」 : 「gitlabdev@dv6700.(なし)」  
  63. },
  64. 「追加」 : [ 「変更履歴」 ],
  65. "変更済み" : [ "app/controller/application.rb" ],
  66. 「削除」 : []
  67. }
  68. ]、
  69. 「合計コミット数」 : 4
  70. }

リクエスト本文内の任意の属性は、TriggerBinding のパラメータとして抽出できます。その他のフック イベントの場合、対応するリクエスト ボディ構造は GitLab ドキュメントで確認できます。

このようにして、上記の TriggerBinding で定義されたパラメータ値を TriggerTemplate オブジェクトのパラメータを通じて読み取ることができます。以下に示すように TriggerTemplate オブジェクトを定義し、TaskRun テンプレートを宣言し、非常に単純な Task タスクを定義します。コンテナ内のコードのディレクトリ構造を印刷するだけです。

  1. apiバージョン: triggers.tekton.dev/v1alpha1
  2. 種類: トリガーテンプレート
  3. メタデータ:
  4. 名前: devops-demo-template
  5. 仕様:
  6. params: #TriggerBinding と一致するパラメータを定義します
  7. -名前: gitrevision
  8. -名前: gitリポジトリURL
  9. resourcetemplates: #リソーステンプレートを定義する
  10. - apiバージョン: tekton.dev/v1beta1
  11. kind: TaskRun # TaskRunテンプレートを定義する
  12. メタデータ:
  13. generateName: gitlab-run- # TaskRun 名のプレフィックス
  14. 仕様:
  15. サービスアカウント名: tekton-triggers-gitlab-sa
  16. taskSpec: #Task タスク宣言
  17. リソース:
  18. inputs: #sourceという名前のgit入力リソースを定義します
  19. -名前: ソース
  20. タイプ: git
  21. 手順:
  22. -名前: パスを表示
  23. image: ubuntu # 実行ステップを定義し、コードディレクトリ構造を一覧表示します
  24. スクリプト: |
  25. #!/bin/bash
  26. ls -la $(リソース.入力.ソース.パス)
  27. リソース: #特定の入力リソースパラメータを宣言する
  28. 入力:
  29. - name : source # タスク内のリソースと同じ名前を維持します
  30. resourceSpec: # リソース宣言
  31. タイプ: git
  32. パラメータ:
  33. -名前: リビジョン
  34. 値: $(tt.params.gitrevision) # パラメータ値を読み取る
  35. -名前: URL
  36. 値: $(tt.params.gitrepositoryurl)

最終的なパイプラインリソース内のパラメータ値を参照するときには、tt プレフィックスが使用されることに注意してください。定義が完了したら、上記のリソース オブジェクトを直接作成します。作成が完了すると、EventListener Pod および Service オブジェクトが自動的に生成されます。

  1. $ kubectl get svc -leventlistener=gitlab-listener
  2. 名前タイプ クラスター IP 外部 IP ポート 年齢
  3. el-gitlab-listener ClusterIP 10.108.146.82 <なし> 8080/TCP 7分56秒
  4. $ kubectl get pod -leventlistener=gitlab-listener
  5. 名前準備完了 ステータス 再起動 年齢
  6. el-gitlab-listener-6b84cc6d8f-ppfhp 1/1 実行中 0 7分9秒
  7. $ kubectl イベントリスナーを取得する
  8. 名前住所 利用可能理由 準備完了理由
  9. gitlab-listener http://el-gitlab-listener.デフォルトは.svc.cluster です。ローカル:8080 False MinimumReplicasUnavailable False  

次に、GitLab プロジェクトで WebHook を設定します。上記の Secret オブジェクトで宣言した Secret Token を設定する必要があることに注意してください。

シークレットトークン

作成が完了したら、WebHook の Push イベントをテストできます。 「テスト」をクリックするだけです (カスタム ドメイン名を使用する場合は、coredns でマッピングを追加する必要があります)。通常は、「フックが正常に実行されました: HTTP 202」というプロンプト メッセージが返されます。この時点で、Kubernetes クラスターに次のタスク Pod が表示されます。

  1. $ kubectl get pods -l triggers.tekton.dev/eventlistener=gitlab-listener
  2. 名前準備完了 ステータス 再起動 年齢
  3. gitlab-run-lnqzv-pod-lp8lw 0/2 完了 0 3分18秒
  4. $ kubectl get taskrun -l triggers.tekton.dev/eventlistener=gitlab-listener
  5. 名前成功 理由 開始時間 完了時間
  6. gitlab-run-lnqzv成功3分11秒 2分48秒
  7. $ tkn タスクラン ログ gitlab-run-lnqzv
  8. [git-source-source-hfrw6] { "level" : "info" , "ts" :1624446684.0399015, "caller" : "git/git.go:169" , "msg" : "http://git.k8s.local/course/devops-demo.git @ 581b1986b6c038ca98a362e6a0b8e9acb55893e8 (grafted、HEAD) をパス /workspace/source に正常にクローンしました" }
  9. [git-source-source-hfrw6] { "level" : "info" , "ts" :1624446684.0660462, "caller" : "git/git.go:207" , "msg" : "パス /workspace/source のサブモジュールが正常に初期化され、更新されました" }
  10.  
  11. [show-path] 合計 36
  12. [show-path] drwxr-xr-x 4 root root 163 6月23日 11:11 .
  13. [show-path] drwxrwxrwx 3 root root 20 6月 23 11:11 ..
  14. [show-path] -rw-r --r-- 1 root root 1804 6月 23 11:11 .drone.yml  
  15. [show-path] drwxr-xr-x 8 root root 177 6月23日 11:11 .git
  16. [show-path] -rw-r --r-- 1 root root 192 6月23日 11:11 .gitignore  
  17. [show-path] -rw-r --r-- 1 root root 375 6月23日 11:11 Dockerfile  
  18. [show-path] -rw-r --r-- 1 root root 5101 6月23日 11:11 Jenkinsfile  
  19. [show-path] -rw-r --r-- 1 root root 174 6月 23 11:11 README.md  
  20. [show-path] -rw-r --r-- 1 root root 97 6月23日 11:11 go.mod  
  21. [show-path] -rw-r --r-- 1 root root 3370 6月23日 11:11 go.sum  
  22. [show-path] drwxr-xr-x 3 root root 101 6月23日 11:11 helm
  23. [show-path] -rw-r --r-- 1 root root 471 6月23日 11:11 main.go  

この時点で、GitLab の Push イベントを通じて Tekton をトリガーするタスクは完了しました。

GitLab プッシュイベント

次に、Tekton を使用してアプリケーションを Kubernetes クラスターに自動的にデプロイします。

<<:  Amazon Web Services が「Smart Lake Warehouse」アーキテクチャを発表、半年間で中国で約 40 の関連サービスと機能を追加

>>:  Cエンドのコンピューティングパワーを「購入するのではなくレンタルする」

推薦する

2022 年に IT 業界、労働力、ビジネス モデルに影響を与える可能性のあるトップ 10 のトレンド

調査機関CompTIAが最近発表した調査報告書によると、IT業界と従業員は、新型コロナウイルスの流行...

私のブログ改訂版に含まれる SEO 要素についての簡単な説明

最近、ウェブページのデザインを学んでいて、たくさんのスタイルを学んだことに気づきました。その後、私の...

中国政府はクラウドコンピューティングを外国投資に開放するか、外国企業が自由貿易地域に独自のIDCを構築することを許可する可能性がある。

ウォール・ストリート・ジャーナル紙が関係者の話として報じたところによると、中国は外国のテクノロジー企...

シカゴ VPS-5 USD/5 GB RAM/4 CPU/100 GB HDD/2 TB トラフィック/5 コンピュータ ルーム

Chicagogovps の超大規模で安価な VPS があなたのためにあります。クーポン コードは不...

buyvm: これはおそらく、大容量ハードドライブを備えた最も信頼性が高く安価な VPS であり、トラフィック制限もありません。

buyvm、海外の安価なVPSを使用するほとんどの人は、それについて少しは知っているはずです。このカ...

IBM Garage Innovation: 継続的な協力、アジャイル開発、顧客との新たな価値の創造

2020年、アルヴィンド・クリシュナ氏がIBMのCEOに就任し、一連の抜本的な改革を推進しました。そ...

SEO: 煙と雲

SEOはキーワードがすべて私は「do」という形容詞を使うのが本当に嫌いです。検索エンジンを圧倒しよう...

ウェブサイトの SEO 最適化担当者は、最適化に対する鋭い感覚をどのように養うことができるでしょうか?

ご存知のとおり、ウェブサイトの運用と保守、ウェブサイトの最適化は長期的な仕事です。この作業は、最適化...

有料投稿削除のグレーな利益連鎖を解明:ワンストップサービス

「全員通常通り働いています。」今日の午後、北京市東四環路の莱金創意センター28号オフィスビルの外で、...

ガートナー: 中国におけるハイブリッド クラウドのコストを最適化および管理する 3 つの方法

クラウドの導入はほとんどの中国組織にとって重要な取り組みであり、規制、データ主権、レイテンシーの要件...

ライブストリーミングeコマースのエコシステム

ライブストリーミング電子商取引は、インターネット時代の商業現象です。消費者はライブストリーミング中に...

クラウド コンピューティングの最適化を正しく実装する方法

企業は、コストの観点からクラウド コンピューティングのメリットを最大化する方法を検討する必要がありま...

クラウドコンピューティングとは何ですか?

クラウドは一般的にグローバルなインターネットまたはネットワークを指しますが、コンピューティングはリモ...

私の目から見たSEO - 人生の始まりを追うウサギ

SEO については、おそらく多くの人が聞いたことがあるでしょうが、それが何であるかを実際に知っている...