windows環境下利用Gitblit搭建Git服務並實現自動部署站點


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文件:

設置http端口,這里寫了推薦的8080,httpBindInterface不用設置保留為空,方便后續本地、外網IP皆可訪問

3)gitblit目錄雙擊運行gitblit.cmd

4)瀏覽器訪問http://localhost:8080,登錄賬戶、密碼均為:admin

5)設置Gitblit以服務方式啟動(關閉命令行后,Gitblit會隨之關閉)

5.1 編輯Gitblit目錄下的installService.cmd文件,如圖所示:

 

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

5.3 鼠標右鍵Gitblit目錄下的gitblitw.exe文件,作類似如下設置(根據自己的安裝目錄):

 

5.4 點擊應用,回到General,點擊start(已啟動將為灰色),確定

5.5 windows+R,運行輸入services.msc,找到gitblit,確保設置啟動,且為自動模式。

 

三、Gitblit使用

 1)admin登錄后,創建版本庫,如test、添加用戶如testuser;而后可通過編輯版本庫或編輯用戶設置相應的版本庫權限,這里以RWD權限為例,權限過低如R將導致提交不了git更新

 

2)回到本地,外網IP地址訪問方式,登錄創建的用戶testuser,點擊掛載的版本庫(注意端口29418,以及前面步驟的8080等端口:服務器防火牆以及雲服務器安全組均需開啟相關端口

 

至此,即可通過git方式clone該版本庫,該方式每次提交更新需輸入密碼,可采取添加SSH Key方式免密提交;本地客戶端生成SSH Key,可采用Git Gui或命令生成Key:

1、GUI生成SSH Key

2、命令生成Key

ssh-keygen -t rsa -C "abc@163.com",-C后內容為指定注釋,標識秘鑰,可輸入郵箱或其他信息

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

 

3)設置SSH Key

以testuser為外網IP登錄Gitblit,將生成的Key復制粘貼到SSH Keys中,添加后即可免密提交Git。

 

四、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列表:

 

至此,用戶Git提交新版本后,即可及時瀏覽到最新的發布站點。

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM