Tekton Resultsによるタスク間レポート

Tektonのタスクは個別のPodに分かれており、タスク間のテキストデータ受け渡しには Resultsを利用します。

Resultsの出力

ResultsはTaskでリソース宣言します。steps.scriptからファイルアクセス可能になり、標準出力のリダイレクトなどで出力します。

apiVersion: tekton.dev/v1
kind: Task
spec:
  results:
  - name: log
  steps:
  - name: date
    script: |
      #!/usr/bin/env bash
      date | tee $(results.log.path)
      # | teeが異常終了を打ち消すため、PIPESTATUSで終了状態を制御
      RC=${PIPESTATUS[0]}
      if [ $RC -ne 0 ]; then
        exit 1
      fi

ステータスを識別したい場合にも、ケース別の文字列を出力しておきます。
string以外のResultsについては、 Emitting Resultsに解説があります。

teeの注意事項

Resultsはファイルインターフェースを持ち、teeコマンドを活用できます。
teeは標準入力を参照しているため、stderrに出力されるエラーが必要な場合には標準入力にリダイレクトする必要があります。

date 2>&1 | tee $(results.log.path)

シェルスクリプトの制約を避けたければ、PythonやRubyでスクリプトを書くと良いでしょう。

echoの注意事項

echo "Completed" > $(results.status.path)のように、任意の文字列を出力してPipelineのwhenで判定するケースで想像どおりに動作しない場合があります。

この例では、見た目に反してresultsにCompleted\nが入ります。末尾の改行出力を抑制するにはecho -nオプションを用います。

Resultsの参照

ResultsPipelineからパラメータ参照できます。Task内のsteps間で参照共有する変数ではありません。
spec.paramsに割り当てる例は以下のようになります。

apiVersion: tekton.dev/v1
kind: Pipeline
spec:
  tasks:
  - name: consumer-task
    params:
    - name: log
      value: $(tasks.<task-name>.results.log)

参照タスクからは一般的なparamsに割当てられた$(params.log)で参照できます。push通知用のコンテナにログを送るようなケースでResultsを使えます。
なお、<task-name>にはtasks.[].taskRef.nameではなく、Pipelineの各項目を示すtasks.[].nameを指定します。

このほかPipeline中、whenの条件判定にも利用できます。whenについては Tekton Pipelinesの制御フローで解説しています。

Finallyの制約

PipelineのFinallyを利用するとタスク終了後に通知などの追加タスクを実行できます。
ただし、Resultsと併用する場合、TaskがFailed終了するとFinally節は スキップされます

そのため、Resultsを素朴に実装するとエラー時のログをFinallyから参照する用途で動作しません。
この目的には、ステータスもResultsに実装してタスクを正常終了させる必要があります。

apiVersion: tekton.dev/v1beta1
kind: Task
spec:
  results:
  - name: log
  - name: status
  steps:
  - name: date
    script: |
      #!/usr/bin/env bash
      date | tee $(results.log.path)
      RC=${PIPESTATUS[0]}
      if [ $RC -ne 0 ]; then
        echo -n "Failed" > $(results.status.path)
      else
        echo -n "Success" > $(results.status.path)
      fi
⁋ 2021/12/27↻ 2024/12/18
中馬崇尋
Chuma Takahiro