【问题标题】:rsync not finding local directory when sending through SSH on pipelinersync 在管道上通过 SSH 发送时找不到本地目录
【发布时间】:2020-04-08 18:44:00
【问题描述】:

使用 bitbucket 管道从您从管道获得的构建过程推送到我们的远程。

这是bitbucket-pipelines.yml 文件的sn-p

- 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 的 docker 容器(或我的本地计算机上的文件 pwd)。

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

【问题讨论】:

    标签: ssh bitbucket rsync bitbucket-pipelines


    【解决方案1】:

    如果您不想将文件从管道复制到生产服务器,您应该使用rsync-deploy 管道,而不是 ssh-run。您的管道配置将如下所示:

    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 密钥的文档的链接https://confluence.atlassian.com/bitbucket/use-ssh-keys-in-bitbucket-pipelines-847452940.html

    【讨论】:

    • 嗨,亚历山大,感谢您的评论。我之前使用的是rsync-deploy,但它设置了--delete-after,这对我们没有好处,因为我们不想在同步后删除服务器上的所有内容。在here 之前已经提到过,但是强制管道失败的解决方案并不合适。你提到你会考虑--delete-after是否应该是可选的,我认为它真的应该是[1/2]
    • 因为我们需要将文件同步到主目录以及www 目录,所以--delete-after 删除了主目录中存在的所有额外目录和点文件(这显然会破坏我们推送的网站)。 [2/2]
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      这对我来说似乎很有效

      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

      【讨论】:

        猜你喜欢
        • 2021-02-16
        • 2013-05-15
        • 2013-11-17
        • 2019-12-08
        • 2014-09-25
        • 1970-01-01
        • 1970-01-01
        • 2013-01-01
        • 1970-01-01
        相关资源
        最近更新 更多