第6章 パイプライン実行の管理
Pipelines as Code を使用すると、コードリポジトリーにパイプラインを作成し、これらのパイプラインを実行できます。
6.1. Pipelines as Code を使用したパイプライン実行の作成
Pipelines as Code を使用してパイプラインを実行するには、リポジトリーの .tekton/
ディレクトリーにパイプライン実行定義またはテンプレートを YAML ファイルとして作成します。リモート URL を使用して他のリポジトリー内の YAML ファイルを参照できますが、パイプラインの実行は、.tekton/
ディレクトリーを含むリポジトリー内のイベントによってのみトリガーされます。
Pipelines as Code リゾルバーは、パイプラインの実行をすべてのタスクと共に、外部依存関係のない単一のパイプラインの実行としてバンドルします。
-
Pipeline の場合、spec または分離された
Pipeline
オブジェクトと共に少なくとも 1 つのパイプライン実行を使用します。 - タスクの場合、パイプライン内にタスク仕様を埋め込むか、Task オブジェクトとして個別に定義します。
コミットと URL のパラメーター化
{{<var>}} 形式の動的でデプロイメント可能な変数を使用して、コミットと URL のパラメーターを指定できます。現在、以下の変数を使用できます。
-
{{repo_owner}}
: リポジトリーの所有者。 -
{{repo_name}}
: リポジトリー名。 -
{{repo_url}}
: リポジトリーの完全な URL。 -
{{revision}}
: コミットの完全 SHA リビジョン。 -
{{sender}}
: コミットの送信者のユーザー名またはアカウント ID。 -
{{source_branch}}
: イベントが発生したブランチ名。 -
{{target_branch}}
: イベントが対象とするブランチ名。プッシュイベントの場合、これはsource_branch
と同じです。 -
{{pull_request_number}}
:pull_request
イベントタイプに対してのみ定義されたプルまたはマージリクエスト番号。 -
{{git_auth_secret}}
: プライベートリポジトリーをチェックアウトするための Git プロバイダーのトークンで自動的に生成されるシークレット名。
イベントのパイプライン実行へのマッチング
パイプライン実行の特別なアノテーションを使用して、異なる Git プロバイダーイベントを各パイプライン実行に一致させることができます。イベントトガッチする複数のパイプライン実行がある場合に、Pipelines as Code はそれらを並行して実行し、パイプライン実行の終了直後に結果を Git プロバイダーに Post します。
プルイベントのパイプライン実行へのマッチング
次の例を使用して、main
ブランチを対象とする pull_request
イベントと、pipeline-pr-main
パイプライン実行を一致させることができます。
apiVersion: tekton.dev/v1
kind: PipelineRun
metadata:
name: pipeline-pr-main
annotations:
pipelinesascode.tekton.dev/on-target-branch: "[main]" 1
pipelinesascode.tekton.dev/on-event: "[pull_request]"
# ...
- 1
- コンマ区切りのエントリーを追加して、複数のブランチを指定できます。たとえば、
"[main, release-nightly]"
です。さらに、以下を指定できます。-
"refs/heads/main"
などのブランチへの完全な参照 -
"refs/heads/\*"
などのパターンマッチングを含む glob -
"refs/tags/1.\*"
などのタグ
-
プッシュイベントのパイプライン実行とのマッチング
次の例を使用して、pipeline-push-on-main
パイプライン実行を refs/heads/main
ブランチを対象とする push
イベントと一致させることができます。
apiVersion: tekton.dev/v1
kind: PipelineRun
metadata:
name: pipeline-push-on-main
annotations:
pipelinesascode.tekton.dev/on-target-branch: "[refs/heads/main]" 1
pipelinesascode.tekton.dev/on-event: "[push]"
# ...
- 1
- コンマ区切りのエントリーを追加して、複数のブランチを指定できます。たとえば、
"[main, release-nightly]"
です。さらに、以下を指定できます。-
"refs/heads/main"
などのブランチへの完全な参照 -
"refs/heads/\*"
などのパターンマッチングを含む glob -
"refs/tags/1.\*"
などのタグ
-
コメントイベントのパイプライン実行へのマッチング
次の例を使用すると、コメントのテキストが ^/merge-pr
正規表現と一致する場合に、pipeline-comment
パイプライン実行をプルリクエストのコメントと一致させることができます。
apiVersion: tekton.dev/v1 kind: PipelineRun metadata: name: pipeline-comment annotations: pipelinesascode.tekton.dev/on-comment: "^/merge-pr" # ...
パイプラインの実行は、コメント作成者が次のいずれかの要件を満たしている場合にのみ開始されます。
- 作成者がリポジトリーの所有者である。
- 作成者がリポジトリーのコラボレーターである。
- 作成者がリポジトリーの組織のパブリックメンバーである。
-
コメントの作成者が Kubernetes ドキュメント で定義されているように、リポジトリーのルートにある
OWNERS
ファイルのapprovers
またはreviewers
のセクションにリストされている。Pipelines as Code はOWNERS
およびOWNERS_ALIASES
ファイルの仕様をサポートします。OWNERS
ファイルに フィルター セクションが含まれている場合、Pipelines as Code は approvers と reviewers を.*
フィルターに対してのみ照合します。
コメントイベントをパイプライン実行に一致させる機能は、テクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビューの機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行いフィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。
高度なイベントマッチング
コードとしてのパイプラインは、高度なイベントマッチングのための Common Expression Language (CEL) ベースのフィルタリングの使用をサポートします。パイプラインの実行に pipelinesascode.tekton.dev/on-cel-expression
アノテーションがある場合に、Pipelines as Code は CEL 式を使用し、on-target-branch
アノテーションをスキップします。単純な オンターゲットブランチ
アノテーションマッチングと比較して、CEL 式では複雑なフィルタリングと否定が可能です。
Pipelines as Code で CEL ベースのフィルタリングを使用するには、次のアノテーションの例を検討してください。
main
ブランチを対象とし、wip
ブランチからのpull_request
イベントを一致させるには、次のようにします。apiVersion: tekton.dev/v1 kind: PipelineRun metadata: name: pipeline-advanced-pr annotations: pipelinesascode.tekton.dev/on-cel-expression: | event == "pull_request" && target_branch == "main" && source_branch == "wip" ...
パスが変更された場合にのみパイプラインを実行するには、glob パターンで
.pathChanged
接尾辞関数を使用できます。apiVersion: tekton.dev/v1 kind: PipelineRun metadata: name: pipeline-advanced-pr-pathchanged annotations: pipelinesascode.tekton.dev/on-cel-expression: | event == "pull_request" && "docs/\*.md".pathChanged() 1 # ...
- 1
docs
ディレクトリー内のすべてのマークダウンファイルと一致します。
[DOWNSTREAM]
で始まるすべてのプルリクエストとマッチさせるには、以下を実行します。apiVersion: tekton.dev/v1 kind: PipelineRun metadata: name: pipeline-advanced-pr-downstream annotations: pipelinesascode.tekton.dev/on-cel-expression: | event == "pull_request && event_title.startsWith("[DOWNSTREAM]") # ...
pull_request
イベントでパイプラインを実行し、experimental
ブランチを省略するには、以下を実行します。apiVersion: tekton.dev/v1 kind: PipelineRun metadata: name: pipeline-advanced-pr-not-experimental annotations: pipelinesascode.tekton.dev/on-cel-expression: | event == "pull_request" && target_branch != experimental" # ...
Pipelines as Code を使用しながら高度な CEL ベースのフィルタリングを行うには、次のフィールドと接尾辞関数を使用できます。
-
event
:push
またはpull_request
イベント。 -
target_branch
: ターゲットブランチ。 -
source_branch
: 元のpull_request
イベントのブランチ。push
イベントの場合は、target_branch
と同じです。 -
event_title
:push
イベントのコミットタイトルや、pull_request
イベントのプルまたはマージリクエストのタイトルなど、イベントのタイトルとマッチします。現在、サポートされているプロバイダーは GitHub、Gitlab、および Bitbucket Cloud のみです。 -
.pathChanged
: 文字列への接尾辞関数です。文字列は、パスが変更されたかどうかを確認するパスの glob にすることができます。現在、GitHub と Gitlab のみがプロバイダーとしてサポートされています。
さらに、Git リポジトリープロバイダーによって渡された完全なペイロードにアクセスできます。headers
フィールドを使用して、ペイロードのヘッダー (headers['x-github-event']
など) にアクセスします。body
フィールドを使用して、ペイロードの本文 (body.pull_request.state
など) にアクセスします。
Pipelines as Code による CEL ベースのフィルタリングにペイロードのヘッダーと本文を使用するのは、テクノロジープレビューのみの機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビューの機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行いフィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。
次の例では、次の条件がすべて満たされる場合にのみパイプラインの実行が開始します。
-
プルリクエストは
main
ブランチをターゲットとしています。 -
プルリクエストの作成者は
superuser
です。 -
アクションは
synchronize
です。このアクションは、プルリクエストで更新が発生したときにトリガーされます。
apiVersion: tekton.dev/v1 kind: PipelineRun metadata: annotations: pipelinesascode.tekton.dev/on-cel-expression: | body.pull_request.base.ref == "main" && body.pull_request.user.login == "superuser" && body.action == "synchronize" # ...
イベントの一致に header
または body
フィールドを使用する場合は、retest
などの Git コマンドを使用してパイプラインの実行をトリガーできない可能性があります。Git コマンドを使用する場合、ペイロード本体は、元のペイロードではなく、このコマンドを含むコメントになります。
イベント一致に body
フィールドを使用するときにパイプラインの実行を再度トリガーする場合は、プルリクエストまたはマージリクエストを閉じて再度開くか、たとえば次のコマンドを使用して新しい SHA コミットを追加します。
git commit --amend --no-edit && git push --force-with-lease
Github API 操作への一時的な GitHub App トークンの使用
GitHub アプリケーションの Pipelines as Code によって生成された一時インストールトークンを使用して、GitHub API にアクセスできます。トークン値は git-provider-token
キーのプライベートリポジトリー用に生成された一時的な {{git_auth_secret}}
動的変数に格納されます。
たとえば、プル要求にコメントを追加するには、Pipelines as Code アノテーションを使用して Tekton Hub からの github-add-comment
タスクを使用できます。
... pipelinesascode.tekton.dev/task: "github-add-comment" ...
その後、タスクをパイプライン実行定義の tasks
セクションまたは finally
タスクに追加できます。
[...]
tasks:
- name:
taskRef:
name: github-add-comment
params:
- name: REQUEST_URL
value: "{{ repo_url }}/pull/{{ pull_request_number }}" 1
- name: COMMENT_OR_FILE
value: "Pipelines as Code IS GREAT!"
- name: GITHUB_TOKEN_SECRET_NAME
value: "{{ git_auth_secret }}"
- name: GITHUB_TOKEN_SECRET_KEY
value: "git-provider-token"
...
- 1
- 動的変数を使用すると、任意のリポジトリーからのプルリクエストに対して、このスニペットテンプレートを再利用できます。
GitHub アプリでは、生成されたインストールトークンは 8 時間利用可能で、クラスターで別の設定を行わない限り、イベントの発生元のリポジトリーにスコープが設定されます。