最近在搭建开发环境,大致的布局是这样的:一个专门的数据库 VM,一个用于编译和代码执行的 VM(dev virt,装的 RedHat),还有用来写代码和运行这两个虚拟环境的 Mac(local)。这里我需要一个工具,可以满这样的需求:
- 能够把 Mac 上写的代码同步到 dev virt 上去。
- 不需要手动触发,每当有修改,应该能够自动同步。
我把我的解决办法简单记录在这里。在接下去记录之前,需要回答这样两个问题:
- 为什么需要把编译和执行环境放到 VM 里面去?因为尽量使得代码的编译执行环境接近于生产线。
- 为什么要在 Mac 上写代码,而不在 dev virt 那个 VM 上写代码?因为在 Mac 上使用第三方的工具,做一些操作系统上面的改变,编码环境的改变都比较方便,而且虚拟机中写代码有时候明显感到 IDE 不流畅。
下面一步一步来解决这个问题。
第一步,配置 VM 在 NAT 下的端口映射,允许从 Mac 上可以 SSH(默认是 22 号端口)到 dev virt 上:
为什么上面选择了 2222 号端口,主要是考虑避免和常规的 SSH 冲突。这样配置以后,连接 localhost 的 2222 端口,就可以映射到 VM 上的 22 号端口去了。
第二步,创建 SSH keys。Mac 上运行 ssh-keygen,创建公钥和私钥。把公钥从~/.ssh/id_rsa.pub 拷贝到 dev virt,放在~/.ssh 下面,并重命名成 authorized_keys。注意.ssh 权限必须是 700,而 authorized_keys 必须是 600。
第三步,配置 dev virt 上面的/etc/ssh/sshd_config,具体参数根据情况调整,完成以后需要重启 SSH 服务:service sshd restart。
第四步,尝试连接,在 Mac 上执行 SSH 命令,比如 ssh ray@127.0.0.1 -p 2222,如果不能访问,考虑修改/etc/ssh/sshd_config,把日志改成 verbose:LogLevel VERBOSE,再重启 SSH 服务,这样就可以通过 tail -f /var/log/secure 查看无法连接的错误信息。
第五步,创建一个同步脚本,比如叫做 rsync.sh,里面就只有一行 rsync 的命令,比如:rsync -avz –exclude={*/.*,*venv*} -e “ssh -p 2222” ~/Projects ray@127.0.0.1:~,其中的~/Projects 是 Mac 上的代码环境,要同步到 dev virt 的~上去,而 exclude 参数过滤掉了主要是 python 相关的不希望同步的文件夹和文件。
第六步,安装 fswatch,它可以监视文件夹下面的变动。brew install fswatch。
第六步,把 fswatch 和 rsync 串起来,比如:fswatch -orv -0 ~/Projects/ –exclude=’^.*\/\.|\/venv.*$’ | xargs -0 -n1 ~/rsync.sh,第一次执行比较慢,花了几分钟。但之后有修改的时候,因为是增量同步,几秒钟就自动同步过去了。rsync 因为支持压缩,所以性能还不错。
文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《四火的唠叨》
使用 ssh 终端远程连接 dev virt 开发
为啥不用 docker +1
如果是 Java 代码的话,IntelliJ 的插件可以直接同步代码,原理是通过 sftp
其他情况的话,感觉暴露个 nfs 或者 sshfs 也很爽
之前有段时间用 rsync,结果遇到编译文件/中间文件被意外各种同步的问题,规则越写越复杂,最后索性不用了
为啥不用 docker….