rsync在管道上通过SSH发送时找不到本地目录

rsync在管道上通过SSH发送时找不到本地目录,ssh,bitbucket,rsync,bitbucket-pipelines,Ssh,Bitbucket,Rsync,Bitbucket Pipelines,使用bitbucket管道将您从管道中获得的构建过程推送到远程 这是bitbucket pipelines.yml文件的一个片段 - pipe: atlassian/ssh-run:0.2.2 variables: SSH_USER: $PRODUCTION_USER SERVER: $PRODUCTION_SERVER COMMAND: '''rsync -zrSlh -e "ssh -p 22007" --stats

使用bitbucket管道将您从管道中获得的构建过程推送到远程

这是
bitbucket pipelines.yml
文件的一个片段

- pipe: atlassian/ssh-run:0.2.2
        variables:
          SSH_USER: $PRODUCTION_USER
          SERVER: $PRODUCTION_SERVER
          COMMAND: '''rsync -zrSlh -e "ssh -p 22007" --stats --max-delete=0 $BITBUCKET_CLONE_DIR/ $PRODUCTION_USER@$PRODUCTION_SERVER:home/$PRODUCTION_USER'''
          PORT: '22007'
连接本身可以工作,并且一旦远程连接到服务器上,它就可以正确运行命令

INFO: Executing the pipe...
INFO: Using default ssh key
INFO: Executing command on {HOST}
ssh -A -tt -i /root/.ssh/pipelines_id -o StrictHostKeyChecking=no -p 22007 {USER}@{HOST} 'rsync -zrSlh -e "ssh -p 22007" --stats --max-delete=0 /opt/atlassian/pipelines/agent/build/ {USER}@{HOST}:home/{USER}'
bash: rsync -zrSlh -e "ssh -p 22007" --stats --max-delete=0 /opt/atlassian/pipelines/agent/build/ {USER}@{HOST}:home/{USER}: No such file or directory
Connection to {HOST} closed.
我尝试从我机器上的目录本地运行相同的命令

ssh -A -tt -i /root/.ssh/pipelines_id -o StrictHostKeyChecking=no -p 22007 {USER}@{HOST} 'rsync -zrSlh -e "ssh -p 22007" --stats --max-delete=0 "$PWD" {USER}@{HOST}:/home/{USER}'
但它只是复制远程服务器上的主目录

在我看来,它似乎在服务器上查找源目录,而不是从bitbucket(或我的本地机器上带有
pwd
的文件)中查找docker容器


如果我尝试在没有
'
的情况下运行该命令,那么它将失败,因为默认情况下它使用的是端口22。我还尝试将命令偏移到bash脚本中,并使用
模式:“script”
,这是可接受的模式,但我不能在
sh
文件中使用我的环境变量。

如果您不想做的就是将文件从管道复制到生产服务器,那么您应该使用管道,而不是ssh运行。您的管道配置将非常类似于以下内容:

script:
  - pipe: atlassian/rsync-deploy:0.3.2
    variables:
      USER: $PRODUCTION_USER
      SERVER: $PRODUCTION_USER
      REMOTE_PATH: 'home/$PRODUCTION_USER'
      LOCAL_PATH: 'build'
      SSH_PORT: '22007'

请确保在管道中正确配置您的SSH密钥(这里是我们配置SSH密钥的文档链接)

我找到了另一种解决方法,而不是需要插件,而是将rsync作为脚本步骤运行

image: atlassian/default-image:latest

- rsync -rltDvzCh --max-delete=0 --stats --exclude-from=excludes -e 'ssh -e none -p 22007' $BITBUCKET_CLONE_DIR/ $PRODUCTION_USER@$PRODUCTION_SERVER:/home/$PRODUCTION_USER

似乎
-e none
是一个重要的添加,因为加载到atlassian映像中时,无法找到
rsync
函数,否则。我在Atlassian社区的帖子上找到了这条信息。

这对我来说似乎很有效

image: node:10.15.3

pipelines:
  default:
    - step:
        name: <project-path>
        script:
        - apt-get update && apt-get install -y rsync
        - ssh-keyscan -H $SSH_HOST >> ~/.ssh/known_hosts
        - cd $BITBUCKET_CLONE_DIR
        - rsync -r -v -e ssh . $SSH_USER@$SSH_HOST:/<project-path>
        - ssh $SSH_USER@$SSH_HOST 'cd <project-path> && npm install'
        - ssh $SSH_USER@$SSH_HOST 'pm2 restart 0'
图像:节点:10.15.3
管道:
违约:
-步骤:
姓名:
脚本:
-apt get update&&apt get install-y rsync
-ssh密钥扫描-H$ssh\u主机>>~/.ssh/known\u主机
-cd$BITBUCKET\u克隆\u目录
-rsync-r-v-esh$SSH_用户@$SSH_主机:/
-ssh$ssh_USER@$ssh_主机'cd&&npm安装'
-ssh$ssh_用户@$ssh_主机“pm2重新启动0”
注意:避免在管道脚本中使用sudocmd


你好,亚历山大,谢谢你的评论。我以前使用的是
rsync deploy
,但它设置了
--delete after
这对我们没有好处,因为我们不想在同步后删除服务器上的所有内容。前面已经提到过,但强制管道失效的解决方案并不合适。您提到过,如果<>代码>删除< /COD> >应该是可选的,并且我认为它确实应该是[1/2 ],因为我们需要将文件同步到主目录以及 WWW 目录,所以<>代码>删除< /COD> >删除所有在主目录中存在的额外目录和DOTFILE文件。(这显然会破坏我们正在推动的网站)。[2/2]