对于博客来说,我还是直接实践比较好,理论过多,不方便以后的查看
废话不多,直接开干
功能需求:
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 ...
客户端:
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'
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)
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"
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))
git服务器配置内容
1.在hooks/post-receive 做一个软连接
2.执行用户为git用户,git:git 在git组,所有需要确保一套流程下来需要涉及的目录和文件,git用户都可以有对应的权限
图示: