bashはログイン時に~/.bashrcなどのスタートアップスクリプトを実行します。
tektonも$BASH_ENVを用いてステップ実行時にスタートアップスクリプトを実行できます。
configMapからbashスクリプトを供給する例は次のような定義になります(抜粋)。
apiVersion: tekton.dev/v1
kind: Task
spec:
stepTemplate:
env:
- name: BASH_ENV
value: /root/.bashrc
volumeMounts:
- name: startup-script
mountPath: /root/.bashrc
subPath: bashrc
volumes:
- name: startup-script
configMap:
name: startup-script
この例では、
spec.stepTemplateを用いてtask内の全てのステップでスタートアップスクリプトを実行する構成を想定しています。
一部のステップにのみ供給したい場合には、対象のsteps.[].envとsteps.[].volumeMountsに同様の設定を追加します。
$BASH_ENVで指定したpathにスクリプトを置くだけの簡素な構成です。volumes.[].configMapから供給するスクリプトは一般的なbashスクリプトであるため、説明は省略します。
ステップ終了処理
bashのtrapを利用すると、ステップ終了時のEXITシグナルをトラップして終了処理も記述できます。
次のような処理をスタートアップスクリプトに追記しておきます。
function final_exec() {
echo "step terminated."
}
trap 'final_exec' EXIT
この関数の冒頭で$?を参照すると直前ステップの終了ステータスが入っているようです。
このようにスタートアップスクリプトを定義すると、各ステップの前後に共通処理を定義できます。
ログファイル取得
trapの応用で、シェルを抜ける際にログを送信する機能を追加できます。
コンテナログはSTDOUT/STDERRを用いるため、実行時にはログファイルにリダイレクトしておき、EXIT時に元に戻します。
if [[ "${TRAP_INIT:-}" != "1" ]]; then
export TRAP_INIT=1
export LOG_FILE=/tmp/stdout.log
# export START_TIME=$(date +%s%N)
function final_exec() {
set +e +u
trap - EXIT
# NOTE recover stdout/stderr
exec 1>&3 2>&4
cat "$LOG_FILE" >&2
if [[ $1 = 0 ]]; then
return 0
fi
# bash --noprofile --norc <some-script-path> $LOG_FILE
}
# NOTE redirect stdout/stderr
exec 3>&1
exec 4>&2
trap 'EXIT_CODE=$?; final_exec "$EXIT_CODE"; exit "$EXIT_CODE"' EXIT
exec >"$LOG_FILE" 2>&1
fi
$TRAP_INITは出力リダイレクトを一度だけ実行するためのガードです。.bashrcはサブプロセスなどで複数回呼ばれる可能性があり、この初期化を複数回するとおかしな挙動になります。
⁋ 2024/12/11↻ 2026/05/07