Tektonで”syntax error: bad substitution”が出た時の対応

スポンサーリンク

はじめに

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のパラメータを利用する場合は、()を使う点に注意しましょう。

参考

タイトルとURLをコピーしました