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

时间:2019-12-16 10:03:57

标签: 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 --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脚本中,并使用plugin可接受的模式MODE: 'Script',但是我无法在sh文件中使用我的环境变量。

3 个答案:

答案 0 :(得分:0)

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

'keep_alive'           => true,
'connection_timeout'   => 5000,
'trace'                => true,
'compression'          => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP | SOAP_COMPRESSION_DEFLATE,

请确保在管道中正确配置SSH密钥(这是我们的文档,用于配置SSH密钥https://confluence.atlassian.com/bitbucket/use-ssh-keys-in-bitbucket-pipelines-847452940.html的链接)

答案 1 :(得分:0)

我找到了另一种解决方法,而不需要插件,而是运行了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社区的this帖子中找到了此信息。

答案 2 :(得分:0)

这对我来说似乎很好

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'

注意:避免在管道脚本中使用 sudo cmd