zoukankan      html  css  js  c++  java
  • 一套简单的git版本控制代码

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

    废话不多,直接开干

    功能需求:

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

    功能图表展示:

      1.创建git文件

    2.版本控制

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

    4.转移文件的目录

    目录结构

     1 客户端
     2  ---git
     3     --client.zip
     4     --server.zip
     5  ---version        #存放版本文件
     6     --156622635175  #以时间戳存放
     7  ---version.txt     #存放需要git上传的目录名
     8 git服务端
     9  ---git.git
    10     --hooks
    11       --post-receive
    12  --authoup
    13     --post_receive.py
    14     --config.py 
    15       ...
    View Code

    客户端:

    config.py:

    1 #项目上传git的配置信息
    2 
    3 git_url = 'ssh://git@git.git'
    4 
    5 git_dir = 'D:/git'
    6 
    7 version_dir = 'D:/versions'
    8 
    9 time_stamp = 'D:/version.txt'
    View Code

     pushgit.py:

     1 # -*- coding: utf-8 -*-
     2 import os
     3 import shutil
     4 import sys, re
     5 import traceback
     6 import zipfile
     7 # dir = os.path.dirname(os.path.abspath(__file__),'/../')
     8 sys.path.append(os.path.dirname(os.path.abspath(__file__)) + "/../")
     9 from jenkins_structure import settings
    10 
    11 
    12 # 获取到源码目录名
    13 def get_time_stamp_name():
    14     with open(settings.time_stamp, "r", encoding="utf-8") as f:
    15         time_stamp = f.read()
    16     return time_stamp
    17 
    18 
    19 # 推送源码到git服务器
    20 def push_git(version_name, version_comment):
    21     time_stamp = get_time_stamp_name()
    22     get_version_dir = settings.version_dir + "\" + time_stamp
    23 
    24     try:
    25         #判断是否存在git目录,不存在从则git库克隆下来
    26         if os.path.exists(settings.git_dir) != True:
    27             items_dir = os.path.dirname(os.path.abspath(settings.git_dir))
    28             os.chdir(items_dir)
    29             os.system("git clone %s" % settings.git_url )
    30             os.system("git checkout -b master")
    31         # 切换到存放版本目录并切换master分支,防止其他分支对其造成错误
    32         os.chdir(settings.git_dir)
    33     except Exception as e:
    34         traceback.print_exc()
    35         os.system("git checkout master -f")
    36     # 创建git版本分支并切换工作分支到该分支
    37     os.system("git checkout -b %s" % version_name)
    38     # 拷贝源码到新的版本目录
    39     shutil.copyfile(get_version_dir + '\' + "client.zip", settings.git_dir + "\" + "client.zip")
    40     shutil.copyfile(get_version_dir + '\' + "server.zip", settings.git_dir + "\" + "server.zip")
    41     # # 提交并推送到远程仓库
    42     os.system("git add .")
    43     os.system("git commit -m '%s'" % version_comment)
    44     os.system("git push origin %s" % version_name)
    View Code

     git服务器:

    config.py:

     1 #git服务器
     2 git_dir = "/data/git.git"
     3 
     4 #获取更新后的git远程库的目录
     5 pull_git = "/data/git"
     6 
     7 # 存放服务器下的目录
     8 server_dir = "/data/git/server"
     9 
    10 #存放client下的目录
    11 client_dir = "/data/git/client"
    View Code

    post-receive.py:

     1 #!/usr/bin/env python
     2 # -*- coding: utf-8 -*-
     3 import os
     4 import subprocess
     5 import sys, shutil, traceback
     6 import zipfile
     7 import logging
     8 
     9 sys.path.append(os.path.dirname(os.path.abspath(__file__)) + "/")
    10 import config
    11 import ossupload
    12 
    13 
    14 # 读取传入钩子中的内容并获取其中的版本号
    15 def read():
    16     text = str(raw_input())
    17     args = text.split(' ')
    18     version = args[2].replace('refs/heads/','')
    19     return version
    20 
    21 # 解压文件
    22 def extract():
    23     f = zipfile.ZipFile(config.client_dir + "/" + "client.zip", 'r')
    24     for file in f.namelist():
    25         f.extract(file, config.client_dir)
    26 
    27 
    28 def get_newversion(version_name):
    29     try:
    30         # 把git服务器上的压缩包复制到client目录
    31         os.system('git --git-dir=%s --work-tree=%s checkout -f %s' % (config.git_dir, config.client_dir, version_name))
    32         # 把server.zip以版本号重命名并移动到server目录
    33         shutil.copyfile(config.client_dir + '/' + 'server.zip', config.server_dir + '/' + version_name + '.zip')
    34         os.remove(config.client_dir + '/' +  'server.zip')
    35         # 把client.zip解压并重命名
    36         extract()
    37         os.rename(config.client_dir + '/' + 'client', config.client_dir + '/' + version_name)
    38         os.remove(config.client_dir + '/' + 'client.zip')
    39     except Exception as e:
    40         traceback.print_exc()
    41         print(repr(e))
    42 
    43 if __name__ == '__main__':
    44     try:
    45         os.unsetenv('unset GIT_DIR')
    46         version_name = read()
    47         get_newversion(version_name)
    48         src = config.client_dir + "/" + version_name + "/"
    49         file_name = os.listdir(src)
    50         src = config.client_dir + "/" + version_name + "/" + file_name[0] + "/"
    51         ossupload.ossutil_upload(src, version_name)
    52     except Exception as e:
    53         traceback.print_exc()
    54         print(repr(e))
    View Code

     git服务器配置内容

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

    图示:

  • 相关阅读:
    oracle10 http://localhost:5500/em打不开引发的问题
    [bbk5383] 第90集 第11章 数据库诊断 06
    [bbk5373] 第88集 第11章 数据库诊断 04
    ORA01157报错"cannot identify/lock data file"
    [bbk5361] 第86集 第11章 数据库诊断 02
    MFC里AfxGetThread()与AfxGetAPP()的区别
    VC++ 6.0 中类不见了
    MFC中的注释宏
    MFC中OnNcLButtonDown和OnNcLButtonUp的添加方法
    MFC用CWindowDC dc(GetParent())不能在标题栏画线的问题
  • 原文地址:https://www.cnblogs.com/tang-s/p/9719690.html
Copyright © 2011-2022 走看看