はじめに
Tektonのパイプラインでsyntax error: bad substitution
というエラーが出た場合の対応についてまとめました。
エラー内容
Tektonパイプラインの中のスクリプトを実行している箇所で下記のようなエラーが発生していました。
❯ tkn pr logs
? Select pipelinerun: sample-run-zn8dt started 5 minutes ago
task bad-substitution has failed: "step-bad-substitution" exited with code 2 (image: "docker-pullable://[email protected]:d2b53584f580310186df7a2055ce3ff83cc0df6caacf1e3489bff8cf5d0af5d8"); for logs run: kubectl -n default logs sample-run-zn8dt-bad-substitution-pod -c step-bad-substitution
[bad-substitution : bad-substitution] /tekton/scripts/script-0-z824f: line 5: syntax error: bad substitution
Tasks Completed: 1 (Failed: 1, Cancelled 0), Skipped: 0
実行していたTaskとPipelineとPipelineRunのYAMLファイルはそれぞれ下記の通りです。
apiVersion: tekton.dev/v1beta1
kind: PipelineRun
metadata:
generateName: sample-run-
namespace: default
spec:
pipelineRef:
name: sample
params:
- name: sample-param
value: "hoge"
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
name: sample
spec:
params:
- name: sample-param
tasks:
- name: bad-substitution
taskRef:
name: bad-substitution-task
params:
- name: sample-param
value: $(params.sample-param)
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
name: bad-substitution-task
spec:
params:
- name: sample-param
default: ""
steps:
- name: bad-substitution
image: busybox
script: |
#!/bin/sh
VER='foo'
echo ${params.sample-param}
echo ${VER}
echo "hoge"
[bad-substitution : bad-substitution] /tekton/scripts/script-0-z824f: line 5: syntax error: bad substitution
とあるので、script
の中を確認するのですが、5行目には何も記述されていません。
#!/bin/sh
VER='foo'
echo ${params.sample-param}
# 何も記述されていない
echo ${VER}
echo "hoge"
原因
結論として、params.sample-param
に{}
を利用していたことが原因でした。
正しくは()
を使い、下記のように直すことでエラーは解消されました。
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
name: bad-substitution-task
spec:
params:
- name: sample-param
default: ""
steps:
- name: bad-substitution
image: busybox
script: |
#!/bin/sh
VER='foo'
echo $(params.sample-param)
echo ${VER}
echo "hoge"
下記のissueも同様のエラーになっていますが、パラメータを渡す部分で{}
を使っているため、エラーになっています。
bad substitution · Issue #4026 · tektoncd/pipeline
Expected Behavior Actual Behavior ^C# kubectl logs -f mypipeline-run2bbvr-deploy-app-dswrv-is-equal-0-5j5fh-pod-xhfc5 -n tekton /tekton/scripts/script-0-8vp87: ...
Tektonのパラメータを利用する場合は、()
を使う点に注意しましょう。