概述
这让我发疯了,我仍然不确定合适的答案是什么。我自己也遇到了这个问题,并在这个问题上投入了几个小时。我认为 GitLab 用命令替换弄乱了一些东西(显示new release yesterday),尽管我可能对这个问题或其时机有误。它似乎也只发生在某些命令替换而不是其他命令替换中,我最初怀疑它可能与输出到/dev/null 有关,但不会深入研究。它总是在命令替换启动后立即失败。
我的代码
我的代码与您的代码相似(以下是简化版),尝试过多种方式对其进行操作,但每次使用命令替换都会产生相同的失败消息:
Cleaning up file based variables 00:01
ERROR: Job failed: exit code 1
我所做的尝试包括以下内容:
- folders=$(find .[^.]* * -type d -maxdepth 0 -exec echo {} \; 2>/dev/null)
- >
while read folder; do
echo "$folder"
done <<< "$folders"
还有……
- >
while read folder; do
echo "$folder"
done <<< $(find .[^.]* * -type d -maxdepth 0 -exec echo {} \; 2>/dev/null)
这两个版本在我的本地机器上都成功了,但在 GitLab 上失败了(我上面可能有错别字 - 请不要仔细检查,这是我实际程序的简化版本)。
我是如何解决的
我没有使用命令替换$(...),而是选择了进程替换<(...),它似乎可以正常工作。
- >
while read folder; do
echo "$folder"
done < <(find .[^.]* * -type d -maxdepth 0 -exec echo {} \; 2>/dev/null)
如果可能,我会尝试在您的代码中替换相同的内容:
- >
while read dir; do
# the rest goes here
done < <(git log -m -1 --name-only -r --pretty="format:" "$CI_COMMIT_SHA")
问题也可能是 if 语句中的行(回声),您可以将其替换为以下内容:
read SERVICE < <(echo "$dir")
同样,我不确定这是否会为您解决问题,因为我仍然不确定原因是什么,但它解决了我的问题。祝你好运。