git利用post-receive自動化部署

jaysun發表於2017-07-14

要求

實現git push 直接完成程式碼部署到伺服器的目錄

實現方式

利用git的hooks中的post-receive來實現程式碼提交完成之後的動作。將倉庫指定一個--work-tree然後進行檢出操作checkout --force

目錄結構

我自己的專案結構是這樣的,每一個倉庫對應一個專案,例如public/wx專案對應repo/wx.git倉庫

.
├── public
│   └── wx // 這是我們的web程式碼部署目錄
│       ├── index.php
│       ├── test2.php
│       ├── test3.php
│       └── test.php
└── repo // 這個是我們的倉庫目錄
    └── wx.git // 這個對應wx專案的倉庫
        ├── branches
        ├── config
        ├── description
        ├── HEAD
        ├── hooks // post-receive鉤子程式碼寫在這裡面
        ├── index
        ├── info
        ├── objects
        └── refs

再看下hooks檔案目錄

.
├── applypatch-msg.sample
├── commit-msg.sample
├── post-commit.sample
├── post-receive
├── post-receive.sample
├── post-update.sample
├── pre-applypatch.sample
├── pre-commit.sample
├── prepare-commit-msg.sample
├── pre-rebase.sample
└── update.sample

我們將post-receive.sample複製一份post-receive,並且編寫程式碼如下

# 指定我的程式碼檢出目錄
DIR=/www/public/wx
git --work-tree=${DIR} clean -fd
# 直接強制檢出
git --work-tree=${DIR} checkout --force

如何生成目錄

上面看到的repo目錄中的wx.git實際上是一個裸倉庫,我們用下面的命令來生成這樣一個倉庫。

cd /www/repo
git init --bare wx.git

對於程式碼部署目錄和倉庫我們已經通過post-receive進行了關聯了,因為我們一旦將程式碼push到倉庫,那麼會自動檢出到publish/wx目錄下。

遠端部署

在本地電腦上,我們新增遠端倉庫

git init
git remote add origin root@xxx.xxx.xxx.xxx:/www/repo/wx.git

這個時候我們新增了遠端倉庫,那麼我們來測試下push操作

touch index.php
git add .
git commit -m `test`
git push

可能會提示一個--set-upstream,直接執行下就好了。執行完之後我們登陸伺服器,會發現檔案已經出現在public/wx/index.php

注意點

  1. 如果我們沒有配置ssh免密碼登陸的話,我們需要在push程式碼的時候輸入密碼
  2. 如果我們新增的遠端倉庫不是root@xxx.xxx.xx.xx,例如是abc@xx.xx.xx.xx,那麼我們要確保abc使用者對wx.git目錄下的檔案有777許可權。

新增倉庫

  1. 需要登陸遠端伺服器進行初始化repo_name.git倉庫
  2. 需要手動建立public/repo_name資料夾,並且修改許可權為777
  3. 需要重新編寫hooks/post-recieve檔案,修改裡面的DIR路徑為public/repo_name

相關文章