ln并非总是通过SSH工作

时间:2018-06-20 20:46:17

标签: ssh gitlab gitlab-ci ln

我正在使用GitLab的CD制作部署脚本。我有一个脚本:

- ssh USER@HOST "cd domains/$DOMAIN/ && mkdir build-$CI_JOB_ID"
- rsync -ar --port=22 * USER@HOST :domains/$DOMAIN/build-$CI_JOB_ID
- ssh USER@HOST  "cd domains/$DOMAIN/ && ln -sfv build-$CI_JOB_ID/public public_html && ls -la"
- ssh USER@HOST  "cd domains/$DOMAIN/ && ls | grep '^build\-.*$' | grep -Ev '^build-$CI_JOB_ID$' | xargs rm -rf"

一切正常,但是ln命令无效。它仅在50%的时间内起作用。这是来自`作业接连运行的日志。

带有$CI_JOB_ID = 76337215的作业1正常工作。链接正确。

$ ssh USER@HOST "cd domains/$DOMAIN/ && ln -sfv build-$CI_JOB_ID/public public_html && ls -la"
public_html -> build-76337215/public
total 20
drwx--x--x   5 USER  1000   7 Jun 20 22:15 .
drwx--x--x  23 USER  1000  23 Jun 19 16:34 ..
-rw-r--r--   1 USER  1000  39 Jun 17 22:12 .htaccess
drwxr-xr-x  12 USER  1000  20 Jun 20 22:07 build-76335972
drwxr-xr-x  12 USER  1000  20 Jun 20 22:14 build-76337215
drwxr-xr-x   2 USER  1000   4 Jun 20 11:48 logs
lrwxr-xr-x   1 USER  1000  21 Jun 20 22:15 public_html -> build-76337215/public

使用$CI_JOB_ID = 76339729进行作业2无效。链接仍与作业1的旧76337215相连。

$ ssh USER@HOST "cd domains/$DOMAIN/ && ln -sfv build-$CI_JOB_ID/public public_html && ls -la"
public_html/public -> build-76339729/public
total 20
drwx--x--x   5 USER  1000   7 Jun 20 22:28 .
drwx--x--x  23 USER  1000  23 Jun 19 16:34 ..
-rw-r--r--   1 USER  1000  39 Jun 17 22:12 .htaccess
drwxr-xr-x  12 USER  1000  20 Jun 20 22:14 build-76337215
drwxr-xr-x  12 USER  1000  20 Jun 20 22:28 build-76339729
drwxr-xr-x   2 USER  1000   4 Jun 20 11:48 logs
lrwxr-xr-x   1 USER  1000  21 Jun 20 22:15 public_html -> build-76337215/public

我做错了什么?为什么它不能100%地工作?

1 个答案:

答案 0 :(得分:2)

问题在于,如果public_html已经存在并且是目录(或指向目录的符号链接),那么您的ln命令将在该目录中创建一个新链接,而不是替换{{1 }}。

使用public_html选项可以避免这种情况:

-T

或者,您可以使用ln -sfTv build-$CI_JOB_ID/public public_html 选项不取消引用链接

-n

如果它是符号链接,它将替换ln -sfnv build-$CI_JOB_ID/public public_html ,如果它是真实目录,它将在子目录中创建符号链接(-T在后一种情况下会出错)。