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