当前位置:   article > 正文

【DevOps】git + gitee + flask + webhooks完成 代码管理 与 服务器自动化同步_flask 代码实时同步到服务器

flask 代码实时同步到服务器

理想方案


代码在家里和公司的机器上,在所有的服务器上,均实现同步功能

git基础


关于git

git是一个开源分布式的版本控制系统;

概念

工作区:存放代码的目录;

暂存区:又叫 stage 或 index,是一个名为 index 的文件,在 .git 目录下;

Git 仓库目录:是 Git 用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆仓库时,复制的就是这里的数据。

分支:解决开发版本和线上稳定版本的冲突问题;默认只有master分支,新加功能时,一般创建一个新的分支,修改后再合并到master分支;

三种状态

已修改(modified):工作区有文件已修改,但未添加到暂存区;

已暂存(staged):已修改的文件已经添加到暂存区,执行 commit 时可以提交到本地分支;

已提交(commited):已把暂存区的修改提交到本地分支;

流程

新建git仓库 > 工作区 增删改 文件 > 添加到暂存区 > 提交到 git 仓库目录 > 同步到远程仓库;

git init > 编辑 > git add . > git commit -m “msg” > git remote add origin ssh地址 > git push origin master

常用命令
  • git init

    对现有的某个项目开始用 Git 管理 ,需要进入该项目所在目录,执行 git init即可;

    执行后,在该目录下会看到一个隐藏文件夹 .git ,其中包括 暂存区(index文件),master分支,和指向 master 的head指针;

    1. git init
    2. git init path
  • git config

    1. git config --list
    2. git config --global user.name "[name]"
    3. git config --global user.email "[email address]"
  • git add

    将文件添加到暂存区,建议每次工作区发生变化后都执行一次;

    1. git add file1 file2 file3
    2. git add .
    3. git add -A
  • git commit

    提交到本地分支

    1. git commit -m
    2. git commit -a
    3. # 提交时显示 diff 信息
    4. git commit -v
  • git remote

    1. # 本地关联一个新的远程仓库,并命名远程仓库 为 origin
    2. git remote add origin [url]
    3. # 查看已经关联的远程仓库
    4. git remote -v
    5. git remote
    6. # 删除已经关联的某个远程仓库
    7. git remote remove origin
  • git push

    上传本地分支 branch_name 到远程仓库 origin

    1. git push -u origin branch_name
    2. # 强行覆盖远程分支
    3. git push origin branch_name -f
    4. # 推送所有分支
    5. git push origin -a
  • git clone

    本地不需要 git init,直接从远程把仓库的所有内容都 克隆到本地,包括 .git 文件;

    git clone [url]
    
  • git pull

    取到远程仓库的变化,并与本地分支合并,相当于 git fetch + git merge

    1. git pull origin branch_name
    2. # 将 merge 改为 rebase,相当于覆盖
    3. git pull origin branch_name --rebase
    4. # 强行pull覆盖本地,不合并(放弃本地修改)
    5. git fetch --all
    6. git reset --hard origin/master
    7. git pull //可以省略
  • git diff

    查看发生的变化

    1. git diff # 查看工作区发生的变化
    2. git diff -s # 查看暂存区发生的变化
  • git rm

    1. # 删除工作区文件,并提交到暂存区
    2. git rm file1 file2
    3. git rm -R path
    4. # 停止跟踪某文件 或 路径 ,但不从工作区删除
    5. git rm --cached file1 file2
  • git log

    查看提交历史

    1. git log
    2. git log --stat # 查看详细提交记录
  • git remote -v

    显示所有远程仓库

  • git branch

    1. # 列出本地分支
    2. git branch
    3. # 列出远程分支
    4. git branch -r
    5. # 列出 所有分支(本地 + 远程)
    6. git branch -a
    7. # 新建分支
    8. git branch branch_name
    9. # 切换分支
    10. git checkout branch_name
    11. # 新建分支并切换过去
    12. git checkout -b branch_name
    13. # 合并分支到当前分支
    14. git merge branch_name
    15. # 删除分支
    16. git branch -d branch_name
    17. # 删除远程分支
    18. git push origin --delete branch_name
    19. git branch -dr remote_brach
  • git status

    git status 可以查看 哪些文件 处于什么状态,有如下几种情况:

    1、Changes to be committed:说明工作区的文件已添加到暂存区,但是还未提交到 git 仓库;

    2、Your branch is up-to-date with ‘origin/master’.nothing to commit, working directory clean:显示你的本地分支 对应的 远程 分支,没有要提交到git仓库的,工作区很干净(指没有增删改)

    3、Changes not staged for commit: modified test.txt:有改动未提交到暂存区;

    4、Untracked files: filename ,nothing added to commit but untracked files present:新增了文件,未提交到暂存区,未跟踪的文件;

删除文件

1、从工作区移除,并从暂存区移除;

  1. git rm filename
  2. git rm path
  3. git rm log/\*.log

2、从暂存区移除,但工作区保留

git rm --cached filename
重命名文件

以下命令相当于 mv oldname newname > git rm oldname > git add newname

git mv oldname newname
清空本地仓库
  1. git branch
  2. git checkout -b master2 (git branch master2 和 git checkout master2 的合并)
  3. gid add.
  4. git commit -m "msg"
  5. git branch -D master
  6. git branch -m master
  7. git push -f origin master
使用 ignore 忽略不想跟踪的 文件 或 文件夹

可以在项目根目录(即 执行 git 命令的目录)创建 .gitignore 文件,举例;

附上 各个语言的 参考 .gitignore文件 :https://github.com/github/gitignore

  1. # 忽略所有的 .a 文件
  2. *.a
  3. # 但跟踪所有的 lib.a,即便你在前面忽略了 .a 文件
  4. !lib.a
  5. # 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO
  6. /TODO
  7. # 忽略任何目录下名为 build 的文件夹
  8. build/
  9. # 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
  10. doc/*.txt
  11. # 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
  12. doc/**/*.pdf

我目前使用的 gitignore:

  1. *.log # 忽略服务器运行程序产生的log文件
  2. Temp/ # 忽略本地开发时使用的temp文件夹
  3. .idea/ # 忽略pycharm产生的缓存文件

适合 python 的 gitignore:

参考:https://github.com/github/gitignore/blob/master/Python.gitignore

  1. # Byte-compiled / optimized / DLL files
  2. __pycache__/
  3. *.py[cod]
  4. *$py.class
  5. # C extensions
  6. *.so
  7. # Distribution / packaging
  8. .Python
  9. build/
  10. develop-eggs/
  11. dist/
  12. downloads/
  13. eggs/
  14. .eggs/
  15. lib/
  16. lib64/
  17. parts/
  18. sdist/
  19. var/
  20. wheels/
  21. share/python-wheels/
  22. *.egg-info/
  23. .installed.cfg
  24. *.egg
  25. MANIFEST
  26. # PyInstaller
  27. # Usually these files are written by a python script from a template
  28. # before PyInstaller builds the exe, so as to inject date/other infos into it.
  29. *.manifest
  30. *.spec
  31. # Installer logs
  32. pip-log.txt
  33. pip-delete-this-directory.txt
  34. # Unit test / coverage reports
  35. htmlcov/
  36. .tox/
  37. .nox/
  38. .coverage
  39. .coverage.*
  40. .cache
  41. nosetests.xml
  42. coverage.xml
  43. *.cover
  44. *.py,cover
  45. .hypothesis/
  46. .pytest_cache/
  47. cover/
  48. # Translations
  49. *.mo
  50. *.pot
  51. # Django stuff:
  52. *.log
  53. local_settings.py
  54. db.sqlite3
  55. db.sqlite3-journal
  56. # Flask stuff:
  57. instance/
  58. .webassets-cache
  59. # Scrapy stuff:
  60. .scrapy
  61. # Sphinx documentation
  62. docs/_build/
  63. # PyBuilder
  64. .pybuilder/
  65. target/
  66. # Jupyter Notebook
  67. .ipynb_checkpoints
  68. # IPython
  69. profile_default/
  70. ipython_config.py
  71. # pyenv
  72. # For a library or package, you might want to ignore these files since the code is
  73. # intended to run in multiple environments; otherwise, check them in:
  74. # .python-version
  75. # pipenv
  76. # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
  77. # However, in case of collaboration, if having platform-specific dependencies or dependencies
  78. # having no cross-platform support, pipenv may install dependencies that don't work, or not
  79. # install all needed dependencies.
  80. #Pipfile.lock
  81. # PEP 582; used by e.g. github.com/David-OConnor/pyflow
  82. __pypackages__/
  83. # Celery stuff
  84. celerybeat-schedule
  85. celerybeat.pid
  86. # SageMath parsed files
  87. *.sage.py
  88. # Environments
  89. .env
  90. .venv
  91. env/
  92. venv/
  93. ENV/
  94. env.bak/
  95. venv.bak/
  96. # Spyder project settings
  97. .spyderproject
  98. .spyproject
  99. # Rope project settings
  100. .ropeproject
  101. # mkdocs documentation
  102. /site
  103. # mypy
  104. .mypy_cache/
  105. .dmypy.json
  106. dmypy.json
  107. # Pyre type checker
  108. .pyre/
  109. # pytype static type analyzer
  110. .pytype/
  111. # Cython debug symbols
  112. cython_debug/
Tips

1、git 提交时 出现 ”warning: LF will be replaced by CRLF“

Linux 的换行符是 LF (换行),Windows 的是 CRLF(回车CR+换行LF);

Linux 上 : git config --global core.autocrlf input

Windows上:git config --global core.autocrlf true (默认就是这样)

git 学习资料

git 简易指南(适合快速学习):https://www.bootcss.com/p/git-guide/

git 资源大全:https://gitee.com/all-about-git

https://git-scm.com/book/zh/v2

https://www.liaoxuefeng.com/wiki/896043488029600

https://www.runoob.com/git/git-tutorial.html

https://gitee.com/help/collected_article

https://blog.csdn.net/u013374164/article/details/78831480

书籍 ProGit 中文版:https://gitee.com/progit/

Git 的新机部署与使用


新机部署(必备步骤)

1、下载与安装git

  • Windows : https://npm.taobao.org/mirrors/git-for-windows/,下载 Git-2.27.0-64-bit.exe ,并安装;

  • Ubuntu:

  1. sudo apt-get install libcurl4-gnutls-dev libexpat1-dev gettext \
  2. libz-dev libssl-dev
  3. sudo apt-get install git
  4. git --version

2、配置个人信息

  1. git config --global user.name "Ezrealer"
  2. git config --global user.email Ezrealer@qq.com
  3. git config --list

3、本机创建公钥

  1. ssh-keygen -t rsa -C "Ezrealer@qq.com"
  2. enter > enter > enter
  3. # Your identification has been saved in C:\Users\Ezreal/.ssh/id_rsa.
  4. # Your public key has been saved in C:\Users\Ezreal/.ssh/id_rsa.pub.

Windows:打开 C:\Users\Ezreal/.ssh/ 文件夹下的 id_rsa.pub 文件,复制生成的 SSH公钥;

Ubuntu:cd /root/.ssh/ -> cat id_rsa.pub,复制生成的 SSH公钥;

4、将公钥添加到 gitee 或 github 账户

打开 gitee 的 个人主页 > 个人设置 > 安全设置 > SSH公钥 > 把复制的公钥粘贴在提示的地方 > 生成公钥(起个可以和其他机器识别开的公钥标题);

上传本地项目到远程仓库

0、快速上手

  1. 1、创建 E:\GitCodes\MyProgram ,MyProgram 为 项目名
  2. 2、E:\GitCodes\MyProgram 下 创建 .gitignore,内容为
  3. *.log
  4. Temp/
  5. .idea/
  6. .idea
  7. venv/
  8. 3、在 E:\GitCodes\MyProgram 路径执行 git init
  9. 4、git commit -m "first commit"
  10. 5、git remote add origin git@gitee.com:Ezrealer/MyProgram.git
  11. 6、git push -u origin master

1、在 E:\GitCodes\ 放入我的项目 放入后的路径为 E:\GitCodes\MyProgram;

2、在 E:\GitCodes\MyProgram 下 创建 .gitignore 文件,描述 不跟踪的文件或文件夹;

  1. *.log
  2. Temp/
  3. .idea/
  4. .idea
  5. venv/

3、在路径 E:\GitCodes\MyProgram 下 ,执行 git init 创建仓库,在路径下生成 .git 文件夹,其中包括 暂存区(index文件),master分支,和指向 master 的head指针;

git init

4、将本地项目提交到本地 master 分支

git commit -m "first commit"

5、 将本地 master 分支关联到远程仓库 MyProgram ,并为远程仓库起名 (一般都是origin);

  1. git remote add origin git@gitee.com:Ezrealer/MyProgram.git
  2. git remote -v

6、在 gitee 上 创建仓库,仓库名为 MyProgram ,保持仓库为空,不勾选 .gitignore 文件 和 README 文件,防止 第一次 push 出错,然后 在 仓库主页的 克隆/下载 中复制ssh地址;

7、提交本地项目到远程仓库

  1. git push -u origin master
  2. # 强行 用 本地的代码 覆盖 gitee 上的
  3. git push -u origin master -f

8、注意(都有解决办法):

  • git是无法add空文件夹的,需要保留项目结构的话,需要在空文件夹创建个文件占位,官方推荐创建一个 .gitkeep 文件;

  • 不能存在 大于 100M 的文件,否则 push不到远程服务器;

(windows 上 使用 commit -am “msg” ,失败了,不知道原因暂时)

  1. git add a .
  2. git commit -m "MyProject @ 20200616"

9、如果 执行 git commit 后,想在工作区删除某个文件或文件夹,则可以

  1. # 清除本地git仓库缓存
  2. git rm -r --cache .
  3. git add.
  4. git commit -m "msg"
从gitee上把项目克隆到本地

1、创建一个文件夹,作为放代码的地方

  1. cd /usr
  2. sudo mkdir GitCodes
  3. sudo chmod -R 777 GitCodes
  4. cd GitCodes

2、克隆 gitee 的代码 到 本地;

git clone git@gitee.com:Ezrealer/MyProgram.git

git clone 命令 执行的 操作:

  • git init(创建本地存储库)
  • git remote add(将URL添加到该存储库)
  • git fetch(从该URL中获取所有分支到本地存储库)
  • git checkout(创建工作树中主分支的所有文件)

3、修改本地代码,再次上传到远程gitee仓库;

  1. git add.
  2. git commit -m "msg"
  3. git remote add origin git@gitee.com:Ezrealer/CopyrightMonitor.git
  4. git push -u origin master
本地代码 与 远程代码的 同步;

git pull 拉取修改,此时相当于执行了 git fetch + git merge;

git pull origin master

gitpython 实现程序控制 pull 与 push

1、安装 gitpython 模块

pip install gitpython

2、push

在项目根目录下创建 gitee_push_to_gitee.py

  1. from git import Repo
  2. import datetime
  3. # 推送脚本
  4. repo =Repo("./") #git文件的路径
  5. git = repo.git
  6. print("当前未跟踪文件:",repo.untracked_files)
  7. print("当前本地git仓库状态:",git.status())
  8. print("当前本地git仓库是否有文件更新:",repo.is_dirty())
  9. print("当前本地分支:",git.branch())
  10. print("当前远程仓库:",git.remote())
  11. print("正在 git add .")
  12. git.add('.')
  13. commit_msg = "By gitpython @ {0}".format(str(datetime.datetime.now())[:19])
  14. print("正在 commit -m {0}".format(commit_msg))
  15. remote_name = "origin"
  16. print("正在推送到远程仓库: {0}...".format(remote_name))
  17. git.commit('-m', commit_msg)
  18. git.push(remote_name)
  19. print("推送到远程仓库 {0} 成功!".format(remote_name))

3、pull

在项目根目录下创建 gitee_pull_from_gitee.py

  1. from git import Repo
  2. # 推送
  3. repo =Repo("./") #git文件的路径
  4. git = repo.git
  5. print("当前未跟踪文件:",repo.untracked_files)
  6. print("当前本地git仓库状态:",git.status())
  7. print("当前本地git仓库是否有文件更新:",repo.is_dirty())
  8. print("当前本地分支:",git.branch())
  9. print("当前远程仓库:",git.remote())
  10. remote_name = "origin"
  11. print("正在 git pull {0} master".format(remote_name))
  12. git.pull(remote_name,"master")
  13. print("拉取修改 {0} 成功!".format(remote_name))

Flask 实现 WebHooks 方式 自动 同步 gitee 代码到 服务器


Flask
WebHooks
实现

1、安装

pip install flask

2、服务器需要将自己的ssh 公钥 添加到 gitee,且需要 将 本地仓库关联到 gitee的仓库

git remote add origin git@gitee.com:Ezrealer/Myprogram.git

如果服务器之前没跑过此项目,则需要先 克隆 gitee 上的项目到本地;

  1. cd /usr/GitCodes
  2. git clone git@gitee.com:Ezrealer/CopyrightMonitor.git

3、gitee > Myprogram仓库主页 > 管理 > WebHooks > 配置 IP和密码 > 选择事件(暂时只选push)

IP为 http://服务器IP:端口/gitee/webhook,密码自己设定,可以在获取 post 的请求数据时 得到,用于验证请求合法性;

4、脚本

在项目根目录新建文件 webhook_server.py ;

  1. from flask import Flask,request
  2. import json
  3. from git import Repo
  4. import datetime
  5. app = Flask(__name__)
  6. def gitee_pull():
  7. repo = Repo("./") # git文件的路径
  8. git = repo.git
  9. print("当前未跟踪文件:", repo.untracked_files)
  10. print("当前本地git仓库状态:", git.status())
  11. print("当前本地git仓库是否有文件更新:", repo.is_dirty())
  12. print("当前本地分支:", git.branch())
  13. print("当前远程仓库:", git.remote())
  14. remote_name = "origin"
  15. print("正在 git pull {0} master".format(remote_name))
  16. git.pull(remote_name,"master")
  17. print("拉取修改 {0} 成功!".format(remote_name))
  18. @app.route('/gitee/webhook',methods=["POST"])
  19. def get_tasks():
  20. if request.method=='POST':
  21. # password=request.form['password']
  22. # print(password)
  23. #print(request.headers)
  24. #print(request.form)
  25. #print(request.args)
  26. print("请求地址:",request.url)
  27. print("=" * 50)
  28. print("请求方法:",request.method)
  29. print("=" * 50)
  30. print("请求内容:")
  31. request_dict = json.loads(str(request.data, encoding = "utf-8"))
  32. print(request_dict)
  33. print(type(request_dict))
  34. print("=" * 50)
  35. if request_dict.get("password") == "000":
  36. print("密码验证通过,开始拉取...")
  37. gitee_pull()
  38. print("拉取成功!",str(datetime.datetime.now())[:19])
  39. return "success"
  40. else:
  41. print("密码验证失败...",request_dict.get("password"))
  42. return "password is error"
  43. app.run(host="0.0.0.0", port=8000, debug=False)
运行流程

1、远程服务器启动项目根目录下的 webhook_server.py

2、在本地的ide里启动项目根目录下的 gitee_push_to_gitee.py

3、查看gitee上是否同步成功

4、查看服务器是否同步成功

5、注意,不可在服务器上直接修改代码,不然pull的时候就会报错,需要merge纠正;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/68310
推荐阅读
相关标签
  

闽ICP备14008679号