• 一套简单的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用户都可以有对应的权限

    图示:

  • 相关阅读:
    vue自定义指令
    ZOJ Problem Set–2104 Let the Balloon Rise
    ZOJ Problem Set 3202 Secondprice Auction
    ZOJ Problem Set–1879 Jolly Jumpers
    ZOJ Problem Set–2405 Specialized FourDigit Numbers
    ZOJ Problem Set–1874 Primary Arithmetic
    ZOJ Problem Set–1970 All in All
    ZOJ Problem Set–1828 Fibonacci Numbers
    要怎么样调整状态呢
    ZOJ Problem Set–1951 Goldbach's Conjecture
  • 原文地址:https://www.cnblogs.com/tang-s/p/9719690.html
Copyright © 2020-2023  润新知