文章目录
方案介绍
目的
通过 git + gitee + flask + webhook 完成 如下两个目的:
1、本地代码上传 与 托管
2、代码发生变更时,自动同步到服务器
流程
为便于识别,绘制流程图的习惯做法是:
圆角矩形表示“开始”与“结束”;
矩形表示行动方案、普通工作环节用;
菱形表示问题判断或判定(审核/审批/评审)环节;
用平行四边形表示输入输出;
箭头代表工作流方向。
图床链接:http://ezrealer.gitee.io/image-bed/CSDN/代码托管与自动化同步变更.png
环境
本地环境:windows10
服务器环境:Centos 7.9
实现流程
个人PC 安装与配置 Git
1、到 Git 的淘宝镜像下载与安装最新版本的 Git,目前最新版本是 v2.31.0;
Git 淘宝镜像: https://npm.taobao.org/mirrors/git-for-windows
2、打开 cmd ,配置个人信息,以便日后提交新版本的时候可以追踪到是谁提交的,怎么联系提交者;
git config --global user.name "Ezrealer"
git config --global user.email Ezrealer@qq.com
git config --list
3、创建公钥
ssh-keygen -t rsa -C "Ezrealer@qq.com"
enter > enter > enter
# Your identification has been saved in C:\Users\Ezreal/.ssh/id_rsa.
# Your public key has been saved in C:\Users\Ezreal/.ssh/id_rsa.pub.
4、打开 C:\Users\Ezreal/.ssh/ 文件夹下的 id_rsa.pub 文件,可以看到刚刚生成的公钥
Gitee 创建账户与新建代码仓库
1、注册一个 Gitee 账号建立仓库,并加入个人PC的 ssh_key;
2、新建项目仓库,名称设置位 MyProgram;
个人 PC 上的代码上传到 Gitee 的 Myprogram 仓库
1、创建 E:\EzrealerGitRepo ,把某个项目 Myprogram 放到该目录下;
2、E:\EzrealerGitRepo\MyProgram 下创建 .gitignore,过滤不上传的文件:
*.log
*.pyc
Temp/
.idea/
.idea
venv/
__pycache__/
3、在 E:\EzrealerGitRepo\MyProgram 路径下执行 git init,将该目录变为 git 仓库目录;
4、上传到本地仓库,并推到远程仓库;
如果项目中有空文件夹,是不会上传到 Gitee 上的,建议在空文件夹下建一个空文件 .gitkeep 占位;
git commit -m "first commit";
git remote add origin git@gitee.com:Ezrealer/MyProgram.git;
git push -u origin master
# 也可以通过 -f 参数强行覆盖远程代码
git push -u origin master -f
Centos 7.9 安装与设置 git
1、安装与设置 git
whereis git
sudo yum install -y wget
sudo yum install -y gcc-c++
sudo yum install -y zlib-devel perl-ExtUtils-MakeMaker
sudo yum install curl-devel expat-devel gettext-devel openssl-devel zlib-develperl-devel
yum remove git
cd /usr/software
wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.30.1.tar.gz
tar -zxvf cd git-2.30.1.tar.gz
cd git-2.30.1
yum install install autoconf automake libtool
make configure
sudo make prefix=/usr/local/git install
echo 'export PATH=/usr/local/git/bin:$PATH' >> /etc/profile
source /etc/profile
git --version
2、配置 git
git config --global user.name "Ezrealer"
git config --global user.email Ezrealer@qq.com
git config --list
3、 生成公钥,并添加到 Gitee
ssh-keygen -t rsa -C "Ezrealer@qq.com"
Enter > Enter > Enter
# 输出
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
# 查看公钥
cat /root/.ssh/id_rsa.pub
将公钥添加到我的 Gitee 账户
4、克隆 Gitee 的项目到服务器
mkdir -p /usr/EzrealerGitRepo
cd /usr/EzrealerGitRepo
git clone git@gitee.com:Ezrealer/MyProgram.git
编写 flask 接口,实现 webhook 调用后的同步操作
在项目中新建个 webhook_server.py,并push到 Gitee,然后在服务器手动 git push 拉取更新,并启动 webhook_server;
from flask import Flask,request
import json
from git import Repo
import datetime
app = Flask(__name__)
def gitee_pull():
repo = Repo("../../") # git文件的路径
git = repo.git
print("当前未跟踪文件:", repo.untracked_files)
print("当前本地git仓库状态:", git.status())
print("当前本地git仓库是否有文件更新:", repo.is_dirty())
print("当前本地分支:", git.branch())
print("当前远程仓库:", git.remote())
remote_name = "origin"
print("正在 git pull {0} master".format(remote_name))
git.pull(remote_name,"master")
print("拉取修改 {0} 成功!".format(remote_name))
@app.route('/gitee/webhook',methods=["POST"])
def get_tasks():
if request.method=='POST':
print("请求地址:",request.url)
print("=" * 50)
print("请求方法:",request.method)
print("=" * 50)
print("请求内容:")
request_dict = json.loads(str(request.data, encoding = "utf-8"))
print(request_dict)
print(type(request_dict))
print("=" * 50)
if request_dict.get("password") == "123":
print("密码验证通过,开始拉取...")
gitee_pull()
print("拉取成功!",str(datetime.datetime.now())[:19])
return "success"
else:
print("密码验证失败...",request_dict.get("password"))
return "password is error"
app.run(host="0.0.0.0", port=8000, debug=False)
# # python requests库模拟发送数据
# import requests
# post_data={
# "name":"hahaha",
# "pass":"pass",
# }
# res=requests.post(url="http://127.0.0.1:8000/user/test",data=post_data)
# print(res.text)
在 Gitee 的项目仓库中配置 WebHook
在 Gitee 的 项目仓库 => 管理中,配置 WebHooks,添加端口地址,并设置密码,选择事件 PUSH;
通过这个设置,可以在每次 PC push 代码到 Gitee 时,调用 WebHook 配置的接口,从而在服务器上自动执行 git pull 操作,拉取更新;
当然,也可以借助其他 DevOps 工具 完成更复杂的同步操作,比如 jekins,gitee 自带的 gitee go 等;