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

rsync not finding local directory when sending through SSH on pipeline

使用 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 中寻找 docker 容器(或我本地机器上 pwd 的文件)。

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

如果您不想做的只是将文件从管道复制到生产服务器,您应该使用 rsync-deploy 管道,而不是 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 密钥(这里是 link 我们的文档,用于配置 SSH 密钥 https://confluence.atlassian.com/bitbucket/use-ssh-keys-in-bitbucket-pipelines-847452940.html

我找到了另一种解决方法而不是需要插件,而是 运行 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 post 上找到了此信息。

这对我来说似乎很管用

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'

Note: Avoid using sudo cmd in pipeline scripts

与 atlassian/default-image 相同的问题:3

  • rsync -azv ./project_path/* bash: rsync: 找不到命令

解决方案:

  • apt-get更新&&apt-get安装-y rsync