цикл while не работает при чтении файла в sh - PullRequest
0 голосов
/ 24 октября 2019

В моем Jenkinsfile развернут следующий сценарий оболочки

withEnv(['PATH+EXTRA=/busybox:/kaniko']) {
  sh """#!/busybox/sh
    cat "images2.txt"
    cat "images2.txt" | while read line || [ -n "\$line" ]; do
      fields=(\$line)
      echo "FROM \${fields[0]}" | /kaniko/executor --dockerfile /dev/stdin --destination \${fields[1]}
    done
"""
}

Мне нужно экранировать $, поскольку он находится внутри Jenkinsfile, иначе Groovy этого не ожидает.

Содержимоеimages2.txt являются:

docker.io/prom/blackbox-exporter:v0.14.0 eu.gcr.io/development/infra/monitoring/blackbox-exporter:v0.14.0
docker.io/busybox:1.30.0 eu.gcr.io/development/infra/monitoring/busybox:1.30.0

Когда конвейер работает, я получаю сообщение об ошибке

/home/jenkins/agent/workspace/test-job@tmp/durable-9cce3aab/script.sh: line 4: syntax error: unexpected "(" (expecting "done")

Я также пытался сделать что-то подобное

sh """#!/busybox/sh
input="images2.txt"
while IFS= read -r line
  do
    fields=(\$line)
    echo "FROM \${fields[0]}" | /kaniko/executor --dockerfile /dev/stdin --destination \${fields[1]}
  done < "\$input" 
"""

Норезультат тот же. Есть идеи, что здесь может быть не так?

1 Ответ

0 голосов
/ 24 октября 2019

В соответствии с рекомендацией @Charles Duffy я реализовал

sh """#!/busybox/sh
cat "images2.txt" | while read field1 field2 rest; do
  echo "FROM \$field1" | /kaniko/executor --dockerfile /dev/stdin --destination \$field2
done
""" 

, и он работал отлично.

...