在 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,'

c.f。 https://mywiki.wooledge.org/BashFAQ/020

不是解决方案本身,而是对这里发生的事情的解释。

当您键入时

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"
      """