git管理和自動部署項目


當一個項目需要納入到版本控制的時候,選擇的工具還是比較多的,最常見的就是工具有CVS,SVN,GIT等。在平時的開發中視情況而定,從來就沒有最好的版本控制工具,只有最適合的工具。在這里我習慣用git來管理自己的項目,當然之前使用svn管理的,但是當用了git工具就不願意再用其它的工具來管理。這里除了習慣之外,git的很多功能是svn不具備的,最簡單的就是離線提交,用git管理的項目你會發現整個項目的大小變化不大,不像svn那樣每個目錄又有一個.svn 的目錄,而且會使項目的變得很大。關於git與svn的區別這里就不詳細講解了,請參考(git與svn區別)。

GIT項目管理

  1. GIT 工具的下載
    • windows 平台下可以直接到 git for windows 上下載和安裝,另外一種方式就是直接到 github    上搜索一個項目直接clone,按照引導流程你在windows上同樣也安裝了git,前提是你有github 賬號。
    • Linux 平台下,想RedHat,ubuntu,centos 上都不一樣,可以直接到網上搜索,以Ubuntu 為例,可以直接用 apt-get install git 就可以安裝 git 了。
  2. git 操作(以ubuntu 平台為例)
    • 對於git的操作,或者是對於git的學習,直接下載 progit  這本書,里面包含了對git的詳細講解,讓你對git有一個全面的認識。在這里我總結下自己認為比較重要的幾個部分。
      • git 的基本操作,包括從初始化一個版本到納入本地管理以及把本地的項目push到git遠程倉庫中。以及對於提交版本的跟蹤,日志的查看等。同樣在參考這本書的同時,對於有疑問的地方也可以從到網上查找。
      • 對於服務器上的git的了解,包括對於git支持的協議的了解,最常用的就是 ssh 協議,像github 這種source code 的托管網站采用的是https協議,如何在git服務器上對多個開發者有效的管理,常用的工具就是gitosis, 可以參考 ubuntu 服務器上搭建git
      • 理解git 的分支(本地分支和遠程分支),git合並代碼的方式 merge 和 rebase 的理解。在這部分需要自己在本地反復的實驗,從根本上理解二者的操作,優缺點等,關於這方面的文章也很多,可以參考 git rebase 簡介基本篇
      • 最后如果有興趣,可以對git的原理一探究竟,其實你可以把git理解為是一套內容尋址文件系統,理解git 是如何實現分支的,如果記錄每一次提交的快照,是如何存貯這些版本的信息,git 有多少個對象,以及可以嘗試用git底層提供的命令來完成對一個項目的管理。
  3. 有了上面的基礎,你可以根據自己或者是團隊的需求對項目進行版本控制。

 GIT 項目自動部署

對於自動部署我們先虛擬一個應用場景,就是你的代碼倉庫是位於A服務器上,你的項目運行在B服務器上,這里與WEB項目為主。假設所有開發人員把開發代碼往A服務器上提交完之后,希望代碼會自動跟新到B服務器上。這樣就省去了人工部署項目的步驟,而且服務器上永遠都是最新的代碼。這里需要強調的是A服務器上的倉庫初始化可以有2種方式,那就是,git init 和 git init --bare ,對於這2種區別可以參考 git init & git init --bare difference  這里簡單的介紹一下,就是用git init 初始化是帶有工作目錄的(work tree),也就是可以看到一個完整的項目,用--bare 就只能git相關的文件,沒有 work-tree 。這2種初始化方式取決於你的應用場景,值得注意的是 如果你采用 git init 初始化,那么需要修改 ,.git/config 這個文件,讓它允許往這個倉庫推送代碼。

 [receive]
denyCurrentBranch = ignore

 這里實現自動部署有2中方案,以Linux平台為例:

  1. 你可以借助shell腳本和cron job 來實現,也就是先編寫一個腳本,這個腳本的功能就是從git 倉庫下載,然后完成部署。然后編寫定時任務讓沒間隔一個小時去到服務器上下載一次代碼。代碼如下:
    #!/bin/bash
    
    if [ -f "deploy.lock" ] ; then
    git pull origin master
    else
    git init
    git remote add origin git@server_ip:demo.git
    git pull origin master
    BASE_DIR="/var/www/html/demo"
    chown -R demo:www-data $BASE_DIR
    find -type d -exec chmod 750 {} \;
    find -not -type d -exec chmod 640 {} \;
    chmod u+x deploy.sh
    touch deploy.lock
    fi

    這里以demo這個用戶為例,到遠程的服務器上下載最新的代碼,然后完成一系列部署,這里需要說明的是 ubuntu 下 apache 默認及時用www-data 這個用戶和用戶組為www-data 來管理項目的,這里我們把項目的所有者修改成demo 這個用戶,用戶組任然是www-data。這個腳本完成之后就可以把該腳本添加到定時任務中,這里就不講解定時任務了,可以參考 PHP定時任務實現    。這樣做的缺點就是不實時,優點就是容易控制。

  2. 另外一種就是借助git本身的所提供的鈎子函數 hooks funciton , 這里就把腳本寫在git 的 post-receive 階段,該腳本位於 項目的hooks 目錄下,默認腳本的后綴都是以.simple 結尾的,只要把.simple 去掉就啟用了該腳本。這里需要說明的是用戶權限的問題。因為git倉庫的默認用戶和所有者都是git這個用戶,那么hook腳本也是會被git這個用戶調用的,所以首先確保git這個用戶可以下載自己倉庫的代碼。項目下載同時需要配置.git/config這個文件,表示讓git忽略權限:
    [core]
            filemode = false
    其次apache項目運行的所有者和用戶組都是www-data , 需要把項目的所有者修改為git這個用戶,把git這個用戶加入到www-data 這個用戶組,此時hook這個腳本才會被git這個用戶正確的調用,post-receive腳本的內容如下:
    #!/bin/sh
    #GIT_DIR=$(git rev-parse --git-dir 2>/dev/null)
    unset $(git rev-parse --local-env-vars)
    cd /var/www/html/demo || exit
    echo "git status info:"
    git status
    echo "***************************"
    git pull origin master
    echo "--- Done! ---"

    當這個腳本完成之后,只要代碼提交到A服務器上,A服務器上立馬執行鈎子函數,代碼就會從A服務器上項目的master分支自動跟新到B服務器上(運行環境上),這樣就完成了自動部署。這里比較重要的就是用戶權限的問題。

DONE!


免責聲明!

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



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