在管道上通过 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
使用 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