持续创作,加快生长!这是我参与「日新计划 6 月更文应战」的第31天,点击检查活动概况
大家好~我是小方,欢迎大家重视笋货测验笔记体完记住俾个like呀
回忆
上篇中,咱们已经介绍了subprocess模块,并完成了初始化项目其中一种方法-http拉取,今日咱们来讲下ssh拉取git项目~
前期了解
-
咱们知道拉取代码有两种方法,一种是https,另一种则是ssh;
-
而SSH,本地生成公钥、私钥,公钥装备在对应的账号/库房中,当需求拉取代码时,长途发送一个随机字符串,本地用私钥将这个随机字符串进行加密,发送到长途,长途经过寄存的公钥进行解密,如果解密后与源字符串相同,就能够拉取项目

那问题来了,ssh的私钥和公钥是如何生成的呢?直接输入这个指令即可
ssh-keygen -t rsa -C "xxxx@qq.com"


paramiko模块
ssh公钥和私钥,大部分人用的是Crypto.PublicKey包中的RSA类来模仿ssh生成秘钥,后来跟一位热心的小伙伴闲聊后,发现paramiko能够满足咱们的需求
先来装置一下
pip3 install paramiko
完成进程:
- config.py文件装备公钥和私钥路径
- 代码完成
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即可生成公钥和私钥

.gitignore文件,忽略上传公钥和私钥

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克隆结束")
最后,测验一下,在账号里装备一下公钥

yes即可,这个点,咱们后续优化一下



初始化项目接口
写到这里的话,咱们已经把拉取项目的逻辑写好了,万事俱备只欠东风~初始化项目的话,咱们直接入参一个项目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方法)





总结
今日讲了ssh克隆代码,截止现在,咱们的初始化项目已经开发完毕了,下一期咱们开端来编写相关的前端页面
- 项目地址
- 后端:github.com/JokerChat/F…
- 前端:github.com/JokerChat/F…
- 今日代码提交
- 后端:2ba8578



