git管理和自動部署項目

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

GIT項目管理html

  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 項目自動部署python

對於自動部署咱們先虛擬一個應用場景,就是你的代碼倉庫是位於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 這個文件,讓它容許往這個倉庫推送代碼。linux

 [receive]
denyCurrentBranch = ignore

 這裏實現自動部署有2中方案,以Linux平臺爲例:git

  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定時任務實現    。這樣作的缺點就是不實時,優勢就是容易控制。github

  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服務器上(運行環境上),這樣就完成了自動部署。這裏比較重要的就是用戶權限的問題。shell

DONE!apache

相關文章
相關標籤/搜索