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

废话不多,直接开干

功能需求:

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用户都可以有对应的权限

图示:

 

posted on 2018-09-28 17:07  是你啊  阅读(208)  评论(0编辑  收藏  举报