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エンドのコンピューティングパワーを「購入するのではなくレンタルする」

推薦する

Baidu SEO の提案は本当にランキングの向上に役立ちますか?

数年前、Baiduが独自のSEO提案ツールをリリースし、それがBaidu Statisticsに付属...

siteground-3日間すべてのホスティング/プロモーションが30%オフ

sitegroup からプロモーションメールが届きました。19 日から 21 日まで [北京時間で ...

何もすることがないので、ASO最適化のための8つの戦略を紹介します

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

Yahoo Japan の最適化に関する考察

ヤフージャパンで働いている友人は、参考にできる経験が比較的少ないのですが、需要はかなり高いです。友人...

巨大企業の理想的なビジネス:モバイルインターネットで高収益エリアを見つける

昨年以来、中国の3大インターネット企業BATは大規模な買収や投資を活発に行っており、特にテンセントと...

微博はナスダック上場に成功し、上場初日に19%上昇した。

さらに読む:微博は20.24ドルで取引を終え、新規株式公開から19.06%上昇した。新浪微博のIPO...

適切な人のためのフレンドリーなリンク

フレンドリー リンクは、常に高品質の外部リンクとして宣伝されてきました。新しい Web サイトを立ち...

SEO ウェブサイト最適化: オフサイト記事の編集方法とテクニック

現在、SEOの最適化は、ユーザーエクスペリエンスの観点から、ウェブサイト全体のプロモーションの70%...

ipxcore 超格安小メモリ VPS

ipxcoreは2003年に設立されました。当時の主な事業はデジタルデザインでした。2011年にID...

ウェブサイトのスナップショットはウェブサイトのランキングに影響しますか?

ウェブサイトのスナップショットは、検索結果を開くことができない場合や開くのに非常に時間がかかる場合に...

cmivps: 香港サーバー、無制限のトラフィック、超高構成、複数の IPv4、月額 169 ドルから、CN2+PCCW 回線

cmivps は香港データセンターに独立したサーバーを追加しました。これらの香港サーバーは、2*e5...

WeChatを使わない成都のタクシー運転手が製品に関する教訓を教えてくれる

【編集者注】この記事の著者@刘兴亮は先週、成都での会議に出席した後、同僚の@邹蕾と一緒にタクシーで空...

UCloudとPingCAPが協力し、Cloud TiDBが正式に全世界でリリース

2017年10月、中国を代表する中立型クラウドコンピューティング企業であるUCloudは、国内のオー...

大手企業がクラウド コンピューティングの覇権を競い合う! 5Gと疫病はどんな新たな変化をもたらすのでしょうか?

パソコンやインターネットに続き、クラウドコンピューティングが IT 業界に新たな改革の波を起こしまし...

Kubernetes をより良くする 11 個のツール

[51CTO.com クイック翻訳] 強力で大規模なものであっても、すべてのニーズを満たすことができ...