在 Jenkins 管道 returns 错误的 bash 命令中使用星号
Using asterisk in bash command of Jenkins pipeline returns error
我正在尝试在 Jenkins 管道中执行以下命令:
stage('Deploy Airflow') {
steps{
dir("airflow-dags") {
sh """
sed -i '/schedule_interval=/c\ \ \ \ schedule_interval=None,' ./volumes/dags/*.py
但它会导致错误:
21:44:56 + sed -i '/schedule_interval=/c\ \ \ \ schedule_interval=None,' './volumes/dags/*.py'
21:44:56 sed: can't read ./volumes/dags/*.py: No such file or directory
我如何更改命令以使用 ./volumes/dags/*.py 而不是引用它会导致错误?
我认为这是引用层,因为它在到达 shell 之前通过 Jenkins 和 groovy。
尝试查找作为解决方法。
find ./volumes/dags/ -name '*.py' -maxdepth 1 -exec sed -i '/schedule_interval=/c\ \ \ \ schedule_interval=None,' {} +
或者也许
find ./volumes/dags/ -name '*.py' -maxdepth 1 -print0 |
xargs sed -i '/schedule_interval=/c\ \ \ \ schedule_interval=None,'
不是解决方案本身,而是对这里发生的事情的解释。
当您键入时
sed -i '/schedule_interval=/c\ \ \ \ schedule_interval=None,' ./volumes/dags/*.py
进入你的 shell,shell 执行 glob 扩展 - 在命令中看到 *
,它搜索匹配的任何文件glob ./volumes/dags/*.py
并用匹配文件列表替换 glob。
所以,如果有,例如两个文件:
./volumes/dags/1.py
./volumes/dags/2.py
运行 的实际命令是
sed -i '/schedule_interval=/c\ \ \ \ schedule_interval=None,' ./volumes/dags/1.py ./volumes/dags/2.py
所有这些在 Jenkins 之外都是正确的。
但是,在 Jenkins 中,您的代码:
sh """
sed -i '/schedule_interval=/c\ \ \ \ schedule_interval=None,' ./volumes/dags/*.py
"""
不涉及 glob 扩展,所以实际的 sed
命令现在看起来像这样:
sed -i '/schedule_interval=/c\ \ \ \ schedule_interval=None,' ./volumes/dags/*.py
sed
正确地抱怨:
sed: can't read ./volumes/dags/*.py: No such file or directory
解决它的一种方法是按照建议涉及 find
。另一种方法是涉及 shell:
sh """
bash -c "sed '...' ./volumes/dags/*.py"
"""
我正在尝试在 Jenkins 管道中执行以下命令:
stage('Deploy Airflow') {
steps{
dir("airflow-dags") {
sh """
sed -i '/schedule_interval=/c\ \ \ \ schedule_interval=None,' ./volumes/dags/*.py
但它会导致错误:
21:44:56 + sed -i '/schedule_interval=/c\ \ \ \ schedule_interval=None,' './volumes/dags/*.py'
21:44:56 sed: can't read ./volumes/dags/*.py: No such file or directory
我如何更改命令以使用 ./volumes/dags/*.py 而不是引用它会导致错误?
我认为这是引用层,因为它在到达 shell 之前通过 Jenkins 和 groovy。
尝试查找作为解决方法。
find ./volumes/dags/ -name '*.py' -maxdepth 1 -exec sed -i '/schedule_interval=/c\ \ \ \ schedule_interval=None,' {} +
或者也许
find ./volumes/dags/ -name '*.py' -maxdepth 1 -print0 |
xargs sed -i '/schedule_interval=/c\ \ \ \ schedule_interval=None,'
不是解决方案本身,而是对这里发生的事情的解释。
当您键入时
sed -i '/schedule_interval=/c\ \ \ \ schedule_interval=None,' ./volumes/dags/*.py
进入你的 shell,shell 执行 glob 扩展 - 在命令中看到 *
,它搜索匹配的任何文件glob ./volumes/dags/*.py
并用匹配文件列表替换 glob。
所以,如果有,例如两个文件:
./volumes/dags/1.py
./volumes/dags/2.py
运行 的实际命令是
sed -i '/schedule_interval=/c\ \ \ \ schedule_interval=None,' ./volumes/dags/1.py ./volumes/dags/2.py
所有这些在 Jenkins 之外都是正确的。
但是,在 Jenkins 中,您的代码:
sh """
sed -i '/schedule_interval=/c\ \ \ \ schedule_interval=None,' ./volumes/dags/*.py
"""
不涉及 glob 扩展,所以实际的 sed
命令现在看起来像这样:
sed -i '/schedule_interval=/c\ \ \ \ schedule_interval=None,' ./volumes/dags/*.py
sed
正确地抱怨:
sed: can't read ./volumes/dags/*.py: No such file or directory
解决它的一种方法是按照建议涉及 find
。另一种方法是涉及 shell:
sh """
bash -c "sed '...' ./volumes/dags/*.py"
"""