gpt4 book ai didi

linux - gitlab-CI 管道 : lftp error 550 when trying to delete files

转载 作者:行者123 更新时间:2023-12-03 10:01:33 27 4
gpt4 key购买 nike

我在 gitlab.com 环境中使用免费的共享运行器。我有一个 gitlab-CI 管道,它一个接一个地运行以下 lftp 命令:

  • lftp -c "set ftp:ssl-allow no; open -u $USERNAME,$PASSWORD $HOST; glob -a rm -r ./httpdocs/*"
  • lftp -c "set ftp:ssl-allow no; open -u $USERNAME,$PASSWORD $HOST; mirror -R public/httpdocs --ignore-time --parallel=50 --exclude-glob .git* --排除.git/"

这些命令的目的是删除 httpdocs 文件夹(以前的文件)的内容,然后上传新的构建工件。

CI 管道由 CMS 触发。有时会发生内容编辑器并行更新内容,导致许多触发器并行运行(管道大约需要 3 分钟才能完成)。

然后管道将开始失败并出现以下错误:

rm: Access failed: 550 /httpdocs/build-html-styles.css: No such file or directory

发生这种情况是因为另一个管道删除的文件正在排队等待删除。当 httpdocs 文件夹完全为空时,会发生非常类似的错误。这导致我的整个管道失败(第二个上传 lftp 命令根本没有执行)。

失败的管道示例及其输出:

如何防止这种情况发生?使用 lftp 上传工件不是必须的 - 我正在运行 node:8.10.0 docker 图像。 Gitlab-ci.yml有问题的文件。

最佳答案

我在评论简单 file locking通过简单的主动轮询等待。我没有使用 lftp 的经验,但是从各种互联网资源中搜索,如 this ,我写了以下内容。我看到 lftp 不支持协议(protocol)中的文件锁定,所以你可以这样:

const="set ftp:ssl-allow no; open -u $USERNAME,$PASSWORD $HOST"
# wait until file exists
while lftp -c "$const; df lockfile"; do sleep 1; done
# create the lockfile
lftp -c "$const; mkdir lockfile"
# the work
lftp -c "$const; glob -a rm -r ./httpdocs/*"
lftp -c "$const; mirror -R public/ httpdocs --ignore-time --parallel=50 --exclude-glob .git* --exclude .git/"
# remove lockfile
lftp -c "$const; rmdir lockfile"

我使用了 mkdirrmdir 以及一个目录而不是一个文件,因为我不知道如何使用 lftp 创建一个空文件。在查找文件和创建文件之间仍然存在竞争条件,但它至少应该防止两个并发访问。为了保护更多,你可以做类似 sleep 0.$(printf "%02d"$((RANDOM/10))) 的事情——让 sleep 时间随机,这样他们就不会“同时”创建文件".

另外为了以防万一,我不会镜像到httpdocs 目录,而是镜像到一些临时目录,比如tmp=httpdocs_$(uuidgen); lftp "mirror .. $tmp" 以后可以重命名为 lftp 'rmdir httpdocs;重命名 $tmp httpdocs",使部署更安全,停机时间更少(httpdocs 为空的时间更少)。对于 future ,我建议只转向更安全/更高级的连接协议(protocol)您的远程服务器,它支持文件锁定。例如 ssh。或者可能是 samba。

关于linux - gitlab-CI 管道 : lftp error 550 when trying to delete files,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59290842/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com