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の参照
Results
はPipeline
からパラメータ参照できます。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
Chuma Takahiro