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

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

参考

Support

\ この記事が役に立ったと思ったら、サポートお願いします! /

buy me a coffee
Share

Profile

author

Masa

都内のIT企業で働くエンジニア
自分が学んだことをブログでわかりやすく発信していきながらスキルアップを目指していきます!

buy me a coffee