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
Chuma Takahiro