通常想到自动部署,人们想到的都是将代码用git传到repo,然后通过repo自动部署到服务器中,这种方式对于多人协作是非常友好的。但是如果只是想简单地将本地项目目录实时同步到远程服务器,达到实时测试的目的,pycharm给我们提供了一种更为简洁有效的方式。

我是T型人小付,一位坚持终身学习的互联网从业者。


文章目录

  • 操作环境
  • 准备工作
  • Pycharm配置
  • ssh配置
  • 目录映射配置
  • 自动创建不存在目录
  • 设置自动同步
  • 效果演示
  • 总结


操作环境

本地环境

  • Centos7+Gnome桌面
  • Pycharm 2019.3
  • Anaconda3(Python3.7)
  • Django 2.2.10 LTS

远端环境

  • Centos7 无桌面
  • Anaconda3(Python3.7)
  • Django 2.2.10 LTS
  • IP: 172.29.56.178(允许SSH)

为了使得环境因素对测试的干扰降到最低,本地和远程的部署环境尽量保持一致。因为采用SFTP协议进行传输,需要确保本地能成功ssh到远端,不管是密码还是密钥方式。

准备工作

说明一下,出于项目隔离的目的,我对每个项目都用virtualenv创建了独立的根目录。

本地配置

进入本地的test环境,安装django

(test) [fuhx@testmachine test]$ pip install django==2.2.10

创建项目备用

(test) [fuhx@testmachine test]$ django-admin startproject TestAutoSync
(test) [fuhx@testmachine test]$ ll
total 8
drwxrwxr-x 3 fuhx fuhx 4096 May 27 13:16 bin
drwxrwxr-x 3 fuhx fuhx   23 May 27 13:14 lib
-rw-rw-r-- 1 fuhx fuhx  264 May 27 13:14 pyvenv.cfg
drwxrwxr-x 3 fuhx fuhx   43 May 27 13:17 TestAutoSync

这里的TestAutoSync就是我们待会要操作的目录。

远端配置

同样进入test环境(任意环境,名字不一定要是test),安装django

(test) (base) [root@ai-therm test]# pip install django==2.2.10

创建一个空目录,用来和本地的项目目录进行同步

(test) (base) [root@ai-therm test]# mkdir TestAutoSync
(test) (base) [root@ai-therm test]# ll
total 8
drwxr-xr-x 3 root root 4096 May 27 14:28 bin
drwxr-xr-x 3 root root   23 May 27 14:27 lib
-rw-r--r-- 1 root root  245 May 27 14:27 pyvenv.cfg
drwxr-xr-x 2 root root    6 May 27 14:29 TestAutoSync

需要确保ssh的用户在这个目录具有写操作权限。

Pycharm配置

ssh配置

下面用pycharm打开本地项目,注意是在manage.py的上一级目录,不然django项目会有问题

pycharm远程提交spark任务到yarn pycharm远程部署_virtualenv

之后进入远程部署配置,Tools-Deployment-Configuration

pycharm远程提交spark任务到yarn pycharm远程部署_上传_02

点左边的加号,选择sftp

pycharm远程提交spark任务到yarn pycharm远程部署_上传_03

填入相关信息如下,这里将远端的Root path设定为刚才我们创建的空目录

pycharm远程提交spark任务到yarn pycharm远程部署_virtualenv_04

如果ssh的信息无误,点击Test Connection会提示成功

pycharm远程提交spark任务到yarn pycharm远程部署_virtualenv_05

目录映射配置

之后进入Mappings选项卡,将本地的目录和远端的目录映射起来。需要注意这里的远端目录的根目录是以上面设定的Root path为准

pycharm远程提交spark任务到yarn pycharm远程部署_django_06

如果有不想同步的子目录可以去第三个选项卡Excluded Paths进行剔除,我这里就不选了。

自动创建不存在目录

打开如下Options

pycharm远程提交spark任务到yarn pycharm远程部署_上传_07

Create empty directories勾选上,当远端有目录不存在时会自动创建

pycharm远程提交spark任务到yarn pycharm远程部署_django_08

设置自动同步

Automatic Upload勾选上,这样只要本地目录有文件更改都会自动进行上传

pycharm远程提交spark任务到yarn pycharm远程部署_上传_09

效果演示

首次同步先进行手动操作,将本地目录和远端目录的内容同步到一致。点击下面的按钮进行手动上传

pycharm远程提交spark任务到yarn pycharm远程部署_django_10

页面下方会显示同步的内容和进度

pycharm远程提交spark任务到yarn pycharm远程部署_上传_11

去远端检查,发现成功进行了同步

(test) (base) [root@ai-therm TestAutoSync]# ll
total 4
-rw-r--r-- 1 root root 632 May 27 13:17 manage.py
drwxr-xr-x 2 root root  74 May 27 15:19 TestAutoSync

下面来检测下自动同步功能,编辑urls.py文件,每次保存都会看到下面有自动同步的消息不断弹出来

pycharm远程提交spark任务到yarn pycharm远程部署_virtualenv_12

去远端查看发现文件成功被自动同步

(test) (base) [root@ai-therm TestAutoSync]# cat urls.py 
"""TestAutoSync URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.2/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path

urlpatterns = [
    path('admin/', admin.site.urls),
    path('hello/'),
]

这样就达到自动同步的目的了,同时因为两边的环境都是一样的,所以在本地测试正常的代码同步到远端基本也是可用的,这样就方便测试人员及时连接过去测试了。

总结

当然,除了上传到远端服务器,pycharm还可以从远端进行下载,以及两边文件的比较和同步,不过这些功能用的就比较少了。