我正在使用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%地工作?
答案 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在后一种情况下会出错)。