Tekton step向けスタートアップスクリプト

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.[].envsteps.[].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
中馬崇尋
Chuma Takahiro