Git服务搭建多见于linux环境,但windows主机也不少,目前网上文章诸多不全,且以讹传讹,不甚清楚。下面介绍windows环境下的自动部署和发布。

所需环境及资源:Java环境、Gitblit;示例服务器环境:windows server 2012

一、Java环境的安装

1)下载JRE安装包
windows环境下使用GitBlit,必须安装Java环境,而Java环境可采用JRE或JDK两种方式安装,这里采用JRE的方式,其安装包相对JDK也要小不少,若已安装JDK环境可忽略。

JRE安装包传送门https://www.java.com/zh_CN/download,根据需要下载合适的版本,大约七八十M,下载完后安装。

2)设置环境变量
这里以JRE为例,右键这台电脑 => 属性 => 高级系统设置 => 高级 => 环境变量 => 系统变量。

  当前Java的安装目录如下:C:\Program Files\Java\jre1.8.0_261

   新建变量名:JAVA_HOME,变量值:C:\Program Files\Java

        新建变量名:CLASS_PATH, 变量值:.;%JAVA_HOME%\jre1.8.0_261\lib

        编辑变量名:Path,在已有值的最后添加 :;%JAVA_HOME%\jre1.8.0_261\bin;

        在命令行中运行 java -version ,看到输出版本号即安装成功。

 二、下载GitBlit并解压(无需安装)

GitBlit下载地址:http://www.gitblit.com/,选择windows版本。下载后解压到目录如:E:\software\gitblit-1.9.1

1)新建空文件夹,如:E:\MyGit,用来存放项目(目前测下来依然跑到Gitblit目录下去了,有兴趣的同学可以看看);

2)进入E:\software\gitblit-1.9.1\data目录,编辑defaults.properties文件:

windows环境下利用Gitblit搭建Git服务并实现自动部署站点-LMLPHP

设置http端口,这里写了推荐的8080,httpBindInterface不用设置保留为空,方便后续本地、外网IP皆可访问

windows环境下利用Gitblit搭建Git服务并实现自动部署站点-LMLPHP

3)gitblit目录双击运行gitblit.cmd

4)浏览器访问http://localhost:8080,登录账户、密码均为:admin

5)设置Gitblit以服务方式启动(关闭命令行后,Gitblit会随之关闭)

5.1 编辑Gitblit目录下的installService.cmd文件,如图所示:

windows环境下利用Gitblit搭建Git服务并实现自动部署站点-LMLPHP

5.2 修改保存后,打开windows命令行窗口,进入到GitBlit根目录,运行installService.cmd
命令一:cd E:\software\gitblit-1.9.1
命令二:installService.cmd

5.3 鼠标右键Gitblit目录下的gitblitw.exe文件,作类似如下设置(根据自己的安装目录):

windows环境下利用Gitblit搭建Git服务并实现自动部署站点-LMLPHP

5.4 点击应用,回到General,点击start(已启动将为灰色),确定

windows环境下利用Gitblit搭建Git服务并实现自动部署站点-LMLPHP

5.5 windows+R,运行输入services.msc,找到gitblit,确保设置启动,且为自动模式。

三、Gitblit使用

 1)admin登录后,创建版本库,如test、添加用户如testuser;而后可通过编辑版本库或编辑用户设置相应的版本库权限,这里以RWD权限为例,权限过低如R将导致提交不了git更新

windows环境下利用Gitblit搭建Git服务并实现自动部署站点-LMLPHP

2)回到本地,外网IP地址访问方式,登录创建的用户testuser,点击挂载的版本库(注意端口29418,以及前面步骤的8080等端口:服务器防火墙以及云服务器安全组均需开启相关端口

windows环境下利用Gitblit搭建Git服务并实现自动部署站点-LMLPHP

至此,即可通过git方式clone该版本库,该方式每次提交更新需输入密码,可采取添加SSH Key方式免密提交;本地客户端生成SSH Key,可采用Git Gui或命令生成Key:

1、GUI生成SSH Key

windows环境下利用Gitblit搭建Git服务并实现自动部署站点-LMLPHP

2、命令生成Key

ssh-keygen -t rsa -C "[email protected]",-C后内容为指定注释,标识秘钥,可输入邮箱或其他信息

注:如本机已有生成key,一般可到C:\Users\Administrator\.ssh下查看 id_rsa.pub公钥文件

3)设置SSH Key

以testuser为外网IP登录Gitblit,将生成的Key复制粘贴到SSH Keys中,添加后即可免密提交Git。

windows环境下利用Gitblit搭建Git服务并实现自动部署站点-LMLPHP

四、Gitblit自动部署Web目录

为方便用户Git提交后,自动部署到Web站点目录,这里采用Gitblit的hook post-receive方式实现;

1)打开Gitblit目录下的data/groovy目录,如:E:\software\gitblit-1.9.1\data\groovy,复制其中的localclone.groovy文件,重新命名为如:autoclone.groovy,并修改后内容如下:

 16 import com.gitblit.GitBlit
 17 import com.gitblit.Keys
 18 import com.gitblit.models.RepositoryModel
 19 import com.gitblit.models.TeamModel
 20 import com.gitblit.models.UserModel
 21 import com.gitblit.utils.JGitUtils
 22 import com.gitblit.utils.StringUtils
 23 import java.text.SimpleDateFormat
 24 import org.eclipse.jgit.api.PullCommand
 25 import org.eclipse.jgit.api.CloneCommand
 26 import org.eclipse.jgit.api.Git
 27 import org.eclipse.jgit.lib.Repository
 28 import org.eclipse.jgit.lib.Config
 29 import org.eclipse.jgit.revwalk.RevCommit
 30 import org.eclipse.jgit.transport.ReceiveCommand
 31 import org.eclipse.jgit.transport.ReceiveCommand.Result
 32 import org.eclipse.jgit.util.FileUtils
 33 import org.slf4j.Logger
 34

 73
 74 // Indicate we have started the script
 75 logger.info("localclone hook triggered by ${user.username} for ${repository.name}")
 76
 77
 78 def rootFolder = 'E:/release/wwwroot'
 79 def bare = false
 80 def cloneAllBranches = true
 81 def cloneBranch = 'refs/heads/master'
 82 def includeSubmodules = true
 83
 84 def repoName = repository.name
 85 def destinationFolder = new File(rootFolder, StringUtils.stripDotGit(repoName))
 86 def srcUrl = 'file://' + new File(gitblit.getRepositoriesFolder(), repoName).absolutePath
 87
 88 if (destinationFolder.exists()) {
 89
 90     Git git = Git.open(destinationFolder)
 91     //调用 pull 类下的 pull 方法
 92
 93     PullCommand cmd = git.pull()
 94     //设置对象分支
 95     cmd.setRemoteBranchName(cloneBranch)
 96     //执行
 97     cmd.call()
 98     //关闭
 99     git.close()
100     logger.info("File update succeeded")
101     clientLogger.info("File has been updated")
102
103 }else{
104
105 // delete any previous clone
106     // clone the repository
107     logger.info("cloning ${srcUrl} to ${destinationFolder}")
108     CloneCommand cmd = Git.cloneRepository();
109     cmd.setBare(bare)
110     if (cloneAllBranches)
111         cmd.setCloneAllBranches(true)
112     else
113         cmd.setBranch(cloneBranch)
114     cmd.setCloneSubmodules(includeSubmodules)
115     cmd.setURI(srcUrl)
116     cmd.setDirectory(destinationFolder)
117     Git git = cmd.call();
118     git.repository.close()
119
120     // report clone operation success back to pushing Git client
121     clientLogger.info("${repoName} cloned to ${destinationFolder}")
122 }

 注意红标引用及相关代码:

rootFolder = 'E:/release/wwwroot',此处为你的站点根目录,当有git提交时,将触发钩子,判断是否已存在git仓储目录,存在则pull,不存在则clone;
初始化配置时,建议wwwroot下不要存在任何文件或目录,一切交由Gitblit自行处理,用户git提交后,wwwroot目录将会clone具体的仓储目录,如test(E:/release/wwwroot/test,同时该目录也是Nginx或IIS站点的具体指向路径)。

2)设置钩子文件到具体的版本库
以拥有相关版本库编辑权限的账户登录Gitblit,编辑版本库 => receive => post-receive,添加前面设置的aotoclone到Selected列表:

windows环境下利用Gitblit搭建Git服务并实现自动部署站点-LMLPHP

至此,用户Git提交新版本后,即可及时浏览到最新的发布站点。

09-05 18:27