持续创作,加快生长!这是我参与「日新计划 6 月更文应战」的第31天,点击检查活动概况

大家好~我是小方,欢迎大家重视笋货测验笔记体完记住俾个like

回忆

上篇中,咱们已经介绍了subprocess模块,并完成了初始化项目其中一种方法-http拉取,今日咱们来讲下ssh拉取git项目~

前期了解

  • 咱们知道拉取代码有两种方法,一种是https,另一种则是ssh;

  • https拉取代码时,输入对应库房的git账号和暗码进行认证,认证经过才能拉取项目

    数据工厂系列(17)项目管理模块-初始化项目下篇

  • 而SSH,本地生成公钥、私钥,公钥装备在对应的账号/库房中,当需求拉取代码时,长途发送一个随机字符串,本地用私钥将这个随机字符串进行加密,发送到长途,长途经过寄存的公钥进行解密,如果解密后与源字符串相同,就能够拉取项目

    数据工厂系列(17)项目管理模块-初始化项目下篇

那问题来了,ssh的私钥和公钥是如何生成的呢?直接输入这个指令即可

ssh-keygen -t rsa -C "xxxx@qq.com"

数据工厂系列(17)项目管理模块-初始化项目下篇
红色框住分别为私钥和公钥
数据工厂系列(17)项目管理模块-初始化项目下篇
那数据工厂这边是要怎么生成的呢?总不能这么费事的啊!

paramiko模块

ssh公钥和私钥,大部分人用的是Crypto.PublicKey包中的RSA类来模仿ssh生成秘钥,后来跟一位热心的小伙伴闲聊后,发现paramiko能够满足咱们的需求

先来装置一下

pip3 install paramiko

完成进程:

  • config.py文件装备公钥和私钥路径

数据工厂系列(17)项目管理模块-初始化项目下篇

  • 代码完成
import paramiko
from config import FilePath
def generate_ssh_key():
    key = paramiko.RSAKey.generate(4096)
    # 私钥生成
    key.write_private_key_file(FilePath.RSA_PRI_KEY)
    # 公钥生成
    rsa_pub_key = f"{key.get_name()} {key.get_base64()} FunDataFactory"
    with open(FilePath.RSA_PUB_KEY, 'w') as f:
        f.write(rsa_pub_key)
if __name__ == '__main__':
    generate_ssh_key()

上面的代码比较简单,先不解说啦有爱好的同学能够学学这个paramiko模块,记住这段代码要放在项目的跟目录哦去到项目跟目录,直接指令python3 create_key.py即可生成公钥和私钥

数据工厂系列(17)项目管理模块-初始化项目下篇
.gitignore文件,忽略上传公钥和私钥
数据工厂系列(17)项目管理模块-初始化项目下篇

git clone ssh完成

平常咱们装备ssh,直接敲指令生成公钥和私钥,公钥和私钥放在.ssh文件里,这时候直接git clone就能够收效了,但是现在咱们的公钥和私钥生成方法跟之前不大一样,所以这里git clone时,需求指定私钥的路径

git clone remote_url.git --config core.sshCommand="ssh -i ~/.ssh/id_rsa"

代码封装一下指令

    @staticmethod
    def git_clone_ssh(git_branch, git_url):
        """
        ssh克隆
        :param git_branch: 分支名
        :param git_url: 代码地址
        :return:
        """
        Git.log.info("ssh克隆开端")
        command_str = f"cd {FilePath.BASE_DIR}\n" \
                      f'git clone -b {git_branch} {git_url} --config core.sshCommand="ssh -i {FilePath.RSA_PRI_KEY}"\n'
        CmdUtils.cmd(command_str)
        Git.log.info("ssh克隆结束")

最后,测验一下,在账号里装备一下公钥

数据工厂系列(17)项目管理模块-初始化项目下篇
先手动测验一下指令,首次克隆时会有这个提示语,输入yes即可,这个点,咱们后续优化一下
数据工厂系列(17)项目管理模块-初始化项目下篇
代码测验,成功克隆项目
数据工厂系列(17)项目管理模块-初始化项目下篇
数据工厂系列(17)项目管理模块-初始化项目下篇

初始化项目接口

写到这里的话,咱们已经把拉取项目的逻辑写好了,万事俱备只欠东风~初始化项目的话,咱们直接入参一个项目id,然后经过id查询数据库的项目信息进行拉取。

ProjectDao.py新增查询项目概况逻辑

@classmethod
@record_log
def project_detail(cls, id: int, user: dict) -> DataFactoryProject:
  """获取项目概况"""
  with Session() as session:
      ProjectRoleDao.read_permission(id, user)
      project = session.query(DataFactoryProject).filter(DataFactoryProject.id == id,
                                                         DataFactoryProject.del_flag == 0).first()
      if project is None:
          raise NormalException("项目不存在")
      return project

前面几期有介绍到,初始化项目需求的项目检查权限即可,所以这里要加上read_permission逻辑

project.py新增路由函数

@router.get('/init', name="初始化项目", response_model=ResponseDto)
def init_project(id: int, user= Depends(Auth())):
    try:
        project = ProjectDao.project_detail(id, user)
        project_path = os.path.join(FilePath.BASE_DIR, project.git_project)
        if os.path.isdir(project_path):
            raise Exception("项目已存在, 请履行改写项目!")
        # 拉取项目
        if project.pull_type == 0:
            Git.git_clone_http(project.git_branch, project.git_url, project.git_account, AesUtils.decrypt(project.git_password))
        else:
            Git.git_clone_ssh(project.git_branch, project.git_url)
        return ResponseDto(msg = "初始化成功")
    except Exception as e:
        raise NormalException(str(e))

首要经过项目id查出项目相关信息,再判别是否已经存在项目,存在抛出反常,然后依据拉取拉取方法走不同的拉取指令,这里要注意的是,由于暗码是加密的,所以取出来的时候,要解密AesUtils.decrypt 编写完后,记住重启服务~

测验环节

img这个项目同步下来(http方法)

数据工厂系列(17)项目管理模块-初始化项目下篇
http克隆成功
数据工厂系列(17)项目管理模块-初始化项目下篇
数据工厂系列(17)项目管理模块-初始化项目下篇
ssh方法同步
数据工厂系列(17)项目管理模块-初始化项目下篇
ssh克隆成功
数据工厂系列(17)项目管理模块-初始化项目下篇

已存在img项目,进行改写

数据工厂系列(17)项目管理模块-初始化项目下篇

总结

今日讲了ssh克隆代码,截止现在,咱们的初始化项目已经开发完毕了,下一期咱们开端来编写相关的前端页面

  • 项目地址
    • 后端:github.com/JokerChat/F…
    • 前端:github.com/JokerChat/F…
  • 今日代码提交
    • 后端:2ba8578
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。