对于博客来说,我还是直接实践比较好,理论过多,不方便以后的查看

废话不多,直接开干

功能需求:

.公司需要将jenkins打包出来的压缩包通过git上传到git服务器
.而且通过版本控制上传的文件,即分支名为版本名
.git pull上传到git服务器,并且触发post-receive钩子对git服务器文件进行拉取到对应目录解压

功能图表展示:

 1.创建git文件

2.版本控制

3.钩子处理(做软连接)

4.转移文件的目录

目录结构

 客户端
---git
--client.zip
--server.zip
---version #存放版本文件
--156622635175 #以时间戳存放
---version.txt #存放需要git上传的目录名
git服务端
---git.git
--hooks
--post-receive
--authoup
--post_receive.py
--config.py
...

客户端:

config.py:

 #项目上传git的配置信息

 git_url = 'ssh://git@git.git'

 git_dir = 'D:/git'

 version_dir = 'D:/versions'

 time_stamp = 'D:/version.txt'

 pushgit.py:

 # -*- coding: utf-8 -*-
import os
import shutil
import sys, re
import traceback
import zipfile
# dir = os.path.dirname(os.path.abspath(__file__),'/../')
sys.path.append(os.path.dirname(os.path.abspath(__file__)) + "/../")
from jenkins_structure import settings # 获取到源码目录名
def get_time_stamp_name():
with open(settings.time_stamp, "r", encoding="utf-8") as f:
time_stamp = f.read()
return time_stamp # 推送源码到git服务器
def push_git(version_name, version_comment):
time_stamp = get_time_stamp_name()
get_version_dir = settings.version_dir + "\\" + time_stamp try:
#判断是否存在git目录,不存在从则git库克隆下来
if os.path.exists(settings.git_dir) != True:
items_dir = os.path.dirname(os.path.abspath(settings.git_dir))
os.chdir(items_dir)
os.system("git clone %s" % settings.git_url )
os.system("git checkout -b master")
# 切换到存放版本目录并切换master分支,防止其他分支对其造成错误
os.chdir(settings.git_dir)
except Exception as e:
traceback.print_exc()
os.system("git checkout master -f")
# 创建git版本分支并切换工作分支到该分支
os.system("git checkout -b %s" % version_name)
# 拷贝源码到新的版本目录
shutil.copyfile(get_version_dir + '\\' + "client.zip", settings.git_dir + "\\" + "client.zip")
shutil.copyfile(get_version_dir + '\\' + "server.zip", settings.git_dir + "\\" + "server.zip")
# # 提交并推送到远程仓库
os.system("git add .")
os.system("git commit -m '%s'" % version_comment)
os.system("git push origin %s" % version_name)

 git服务器:

config.py:

 #git服务器
git_dir = "/data/git.git" #获取更新后的git远程库的目录
pull_git = "/data/git" # 存放服务器下的目录
server_dir = "/data/git/server" #存放client下的目录
client_dir = "/data/git/client"

post-receive.py:

 #!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import subprocess
import sys, shutil, traceback
import zipfile
import logging sys.path.append(os.path.dirname(os.path.abspath(__file__)) + "/")
import config
import ossupload # 读取传入钩子中的内容并获取其中的版本号
def read():
text = str(raw_input())
args = text.split(' ')
version = args[2].replace('refs/heads/','')
return version # 解压文件
def extract():
f = zipfile.ZipFile(config.client_dir + "/" + "client.zip", 'r')
for file in f.namelist():
f.extract(file, config.client_dir) def get_newversion(version_name):
try:
# 把git服务器上的压缩包复制到client目录
os.system('git --git-dir=%s --work-tree=%s checkout -f %s' % (config.git_dir, config.client_dir, version_name))
# 把server.zip以版本号重命名并移动到server目录
shutil.copyfile(config.client_dir + '/' + 'server.zip', config.server_dir + '/' + version_name + '.zip')
os.remove(config.client_dir + '/' + 'server.zip')
# 把client.zip解压并重命名
extract()
os.rename(config.client_dir + '/' + 'client', config.client_dir + '/' + version_name)
os.remove(config.client_dir + '/' + 'client.zip')
except Exception as e:
traceback.print_exc()
print(repr(e)) if __name__ == '__main__':
try:
os.unsetenv('unset GIT_DIR')
version_name = read()
get_newversion(version_name)
src = config.client_dir + "/" + version_name + "/"
file_name = os.listdir(src)
src = config.client_dir + "/" + version_name + "/" + file_name[0] + "/"
ossupload.ossutil_upload(src, version_name)
except Exception as e:
traceback.print_exc()
print(repr(e))

 git服务器配置内容

1.在hooks/post-receive 做一个软连接
2.执行用户为git用户,git:git 在git组,所有需要确保一套流程下来需要涉及的目录和文件,git用户都可以有对应的权限

图示:

一套简单的git版本控制代码的更多相关文章

  1. 学习使用Git 版本控制 代码管理

    title: 学习使用Git 版本控制 代码管理 notebook: 经验累积 tags:Git --- Git 版本控制 学习教程 Git版本控制器,可以作为程序员.计算机科学和软件工程的研究人员在 ...

  2. Git版本控制之ubuntu搭建Git服务器

    Git是一个开源的分布式版本控制系统,可以有效.高效的处理从很小到非常大的项目版本管理.使得开发者可以通过克隆(git clone),在本地机器上拷贝一个完整的Git仓库,也可以将代码提交到Git服务 ...

  3. Git Flow 代码版本控制模型

    说到代码版本控制,推荐一下最新的Git.跟SVN相比,最大的区别是它在本地也保存了一个代码库,这样可以离线工作,首先将代码提交到本地仓库,联网之后再同步到服务器端.代码托管网站 Github 和 Bi ...

  4. git原理学习记录:从基本指令到背后原理,实现一个简单的git

    一开始我还担心 git 的原理会不会很难懂,但在阅读了官方文档后我发现其实并不难懂,似乎可以动手实现一个简单的 git,于是就有了下面这篇学习记录. 本文的叙述思路参照了官方文档Book的原理介绍部分 ...

  5. Git版本控制教程

    Git 版本控制入门 不了解Git请查看权威Git书籍 ProGit(中文版). 一份很好的 Git 入门教程,点击这里查看. Git客户端下载地址: 官方Git - TortoiseGit - So ...

  6. Git版本控制工具(三)----远程仓库GitHub的使用

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  7. git版本控制工具(二)----本地版本库的常用操作

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  8. Git版本控制工具(一)----git的安装及创建版本库

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  9. Git版本控制,rsync同步文件,完成线上部署

    之前项目开发完成,测试阶段,借着此时,由于公司暂时用两台aliyun  ecs  做业务层,所以每次都需要同步线上文件,进而想着搞一搞服务器端(小公司,新项目,先小搞一把),搭建一套小的版本控制上线的 ...

随机推荐

  1. 13 Tensorflow机制(翻译)

    代码: tensorflow/examples/tutorials/mnist/ 本文的目的是来展示如何使用Tensorflow训练和评估手写数字识别问题.本文的观众是那些对使用Tensorflow进 ...

  2. 云数据库POLARDB优势解读之①——10分钟了解

    什么是POLARDB POLARDB 是阿里云自研的下一代关系型分布式数据库,100%兼容MySQL,之前使用MySQL的应用程序不需要修改一行代码,即可使用POLARDB. POLARDB在运行形态 ...

  3. 如何一步步在生产环境上部署django和vue

    本文由云+社区发表 本文主要讲述了如何一步步在生产环境上部署django和vue,操作系统默认为centos 说明:后文中出现的以下字符串均表示具体的路径或者名称,含义如下: DJANGO_DIR-- ...

  4. apache用户认证访问机制(转)

    Apache服务器已经内置用户验证机制,大家只要适当的加以设置,便可以控制网站的某些部分要用户验证.前期准备,必须已经安装apache,如果还没安装,或者对安装很模糊的话,第1步:我们在/var/ww ...

  5. 不规范的json文档 转化成 java 对象的处理

    最近练习爬取数据,遇到了json文档中属性名称没有用双引号的情况,内容如下: 标准的json文档,属性名称都是带双引号的 最后写了个方法,替换属性名字 为 两头追加双引号的属性名字, 特别要注意,防止 ...

  6. 另类爬虫:从PDF文件中爬取表格数据

    简介   本文将展示一个稍微不一样点的爬虫.   以往我们的爬虫都是从网络上爬取数据,因为网页一般用HTML,CSS,JavaScript代码写成,因此,有大量成熟的技术来爬取网页中的各种数据.这次, ...

  7. 跨域学习笔记2--WebApi 跨域问题解决方案:CORS

    自己并不懂,在此先记录下来,留待以后学习... 正文 前言:上篇总结了下WebApi的接口测试工具的使用,这篇接着来看看WebAPI的另一个常见问题:跨域问题.本篇主要从实例的角度分享下CORS解决跨 ...

  8. popupWindow设置后完美解决返回键响应无效的方案以及popupWindow背景透明方案

    // 点击其他地方消失 viewPuwAddNew.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouc ...

  9. 【转载】Windows服务器修改远程桌面默认端口

    因为 windows服务器远程桌面端口默认是 3389端口,使用系统默认端口的风险很大,很容易被攻击软件扫描以及攻击,同时频繁的扫描和攻击会导致服务器的 CPU 及带宽资源耗尽,因此为了保证服务器的安 ...

  10. Oracle高效分页查询(转)

    page --没有order by的查询 -- 嵌套子查询,两次筛选(推荐使用) --SELECT * -- FROM (SELECT ROWNUM AS rowno, t.* -- FROM DON ...