1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

MSYS2からdeployer で "The source and destination cannot both be remote"

Last updated at Posted at 2019-05-28

半年~1年ぶりくらいにdeployerを実行したら失敗したのでその対応メモ。

  • php-7.3.2 (Windows10)
  • deployer-6.4.3
  • MSYS2 (ssh, ssh-agent, git, tar...)
$ ./deployer-6.4.3.phar --file=./config.php deploy --tag=3.2.5 --roles=production_web
➤ Executing task deploy:prepare
✔ Ok
➤ Executing task deploy:lock
✔ Ok
➤ Executing task deploy:release
✔ Ok
➤ Executing task deploy:archive
✔ Ok
➤ Executing task deploy:update_code
➤ Executing task deploy:failed
✔ Ok
➤ Executing task deploy:unlock
✔ Ok

In Process.php line 239:

  The command "rsync -azP -e 'ssh -A' "C:\msys64\home\pen\work\release\ukulelebot\app.tar.gz" "pen@xxx.xxx.xxx.xxx:/va
  r/www/vhosts/ukulelebot/releases/10/app.tar.gz"" failed.

  Exit Code: 1(General error)

  Working directory: C:\projects\poppy\ukulelebot\scripts\deploy

  Output:
  ================


  Error Output:
  ================
  The source and destination cannot both be remote.
  rsync error: syntax or usage error (code 1) at main.c(1303) [Receiver=3.1.3]


deploy [-p|--parallel] [-l|--limit LIMIT] [--no-hooks] [--log LOG] [--roles ROLES] [--hosts HOSTS] [-o|--option OPTION] [--] [<stage>]

原因

以前動いていたことから推測するに、MSYS2のrsyncがWindows形式のパスを受け付けなくなったぽい?

mkdir -p ~/work/rsync
cd ~/work/rsync

mkdir -p dir1
touch ./dir1/one ./dir1/two
mkdir dir1/dir1-1

rm -rf ./dir2

### Windows形式だとエラーになる
[21:22:48 pen@pink2 rsync]$ echo $(cygpath -w $(pwd)/dir1)
C:\msys64\home\pen\work\rsync\dir1
[21:23:52 pen@pink2 rsync]$ rsync -av C:\msys64\home\pen\work\rsync\dir1 ./dir2
ssh: Could not resolve hostname c: Name or service not known
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: unexplained error (code 255) at io.c(226) [Receiver=3.1.3]

### multiの形式でもエラーになる
[21:26:52 pen@pink2 rsync]$ echo $(cygpath -m $(pwd)/dir1)
C:/msys64/home/pen/work/rsync/dir1
[21:27:10 pen@pink2 rsync]$ rsync -av C:/msys64/home/pen/work/rsync/dir1 ./dir2
ssh: Could not resolve hostname c: Name or service not known
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(226) [Receiver=3.1.3]
[21:27:28 pen@pink2 rsync]$

### Unix形式なら動く
[21:27:34 pen@pink2 rsync]$ echo $(cygpath -u $(pwd)/dir1)
/home/pen/work/rsync/dir1
[21:27:45 pen@pink2 rsync]$ rsync -av /home/pen/work/rsync/dir1 ./dir2
sending incremental file list
created directory ./dir2
dir1/
dir1/one
dir1/two
dir1/dir1-1/

sent 219 bytes  received 95 bytes  628.00 bytes/sec
total size is 0  speedup is 0.00

対応

upload() に渡しているソースパス $source を、MSYS2の場合だけ cygpath -u にかけてから渡す uploadViaMsys2() を作って回避した。

diff --git a/scripts/deploy/config.php b/scripts/deploy/config.php
index dd84b67..8efc3e0 100644
--- a/scripts/deploy/config.php
+++ b/scripts/deploy/config.php
@@ -8,6 +8,7 @@
  */
 namespace Deployer;
 require_once 'recipe/common.php';
+require_once 'functions.php';

 $appName = 'ukulelebot';

@@ -72,7 +73,7 @@ task('deploy:archive', function() {
 task('deploy:update_code', function() use ($appName){
     $clonedDir = get('clonedDir');
     $archive = realpath($clonedDir."/../app.tar.gz");
-    upload($archive, "{{release_path}}".'/'.basename($archive));
+    uploadViaMsys2($archive, "{{release_path}}".'/'.basename($archive));

     cd("{{release_path}}");
     run("tar -zxpf " . basename($archive));

diff --git a/scripts/deploy/functions.php b/scripts/deploy/functions.php
new file mode 100644
index 0000000..0a077b2
--- /dev/null
+++ b/scripts/deploy/functions.php
@@ -0,0 +1,24 @@
+<?php
+namespace Deployer;
+
+/**
+ * @param string $source
+ * @param string $destination
+ * @param array $config
+ */
+function uploadViaMsys2($source, $destination, array $config = [])
+{
+    if(strpos(PHP_OS, 'WIN') === 0) {
+        $output = null;
+        exec('uname', $output, $ret);
+        if($ret === 0 && strpos($output[0], 'MSYS') === 0) {
+            $output = null;
+            exec("cygpath -u ${source}", $output, $ret);
+            if($ret === 0) {
+                $source = $output[0];
+            }
+        }
+    }
+
+    return upload($source, $destination, $config);
+}

成功ログ

[22:27:33 pen@pink2 deploy]$ ./deployer-6.4.3.phar --file=./config.php deploy --tag=3.2.7 --roles=production_web
➤ Executing task deploy:prepare
✔ Ok
➤ Executing task deploy:lock
✔ Ok
➤ Executing task deploy:release
✔ Ok
➤ Executing task deploy:archive
✔ Ok
➤ Executing task deploy:update_code
✔ Ok
➤ Executing task deploy:create_dirs
✔ Ok
➤ Executing task deploy:shared
✔ Ok
➤ Executing task deploy:writable
✔ Ok
➤ Executing task deploy:clear_paths
✔ Ok
➤ Executing task deploy:symlink
✔ Ok
➤ Executing task apache:reload
✔ Ok
➤ Executing task deploy:unlock
✔ Ok
➤ Executing task cleanup
✔ Ok
Successfully deployed!
/c/projects/poppy/ukulelebot/scripts/deploy
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?