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

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

Resultsの出力

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

apiVersion: tekton.dev/v1beta1
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

ステータスを識別したい場合にも、ケース別の文字列を出力しておきます。

teeの注意事項

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

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

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

Resultsの参照

Resultsは後続のタスクからパラメータ参照できます。
spec.paramsに割り当てる例は以下のようになります。

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

push通知用のコンテナにログを送るようなケースでResultsを使えます。

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
中馬崇尋
Chuma Takahiro