經過Git簡易的部署靜態站點

準備工做:

  1. 一個遠程服務器來託管你的站點。
  2. 經過SSH訪問遠程服務器。
  3. 在遠程服務器上安裝Git(經過指令git --version來檢查是否安裝)。
  4. 若是須要,請生成一個SSH key

在服務器端

設置無密碼的SSH訪問html

首先,你須要經過SSH鏈接到你的服務器,若是有提示的話請輸入密碼。git

ssh user@hostname

若是在你的用戶的主目錄中沒有~/.ssh目錄,請建立一個:mkdir ~/.sshgithub

接下來,你須要複製你的公共SSH key(請看生成一個SSH key)到你的服務器。這樣你就能夠經過SSH鏈接,而且不須要每次都輸入密碼。npm

在你的本地 - 假設你的公共key能夠在~/.ssh/id_rsa.pub找到 - 使用正確的用戶和主機名稱輸入下面的指令。它將會把你的公共祕鑰(key)添加到遠程服務器的authorized_keys文件。服務器

ssh user@hostname 'cat >> ~/.ssh/authorized_keys' < ~/.ssh/id_rsa.pub

若是你關閉鏈接,而且嘗試創建SSH訪問,你應該再也不會被提示輸入密碼。dom

建立遠程目錄

你須要爲每一個域名創建2個目錄。一個做爲Git的倉庫,另外一個包含其餘信息。ssh

舉個栗子,若是你的域名是example.com,而且你想要創建一個環境,那麼你須要在你的服務器上創建這些目錄:post

mkdir ~/example.com ~/example.git
mkdir ~/staging.example.com ~/staging.example.git

初始化空的Git倉庫ui

在服務器上建立空的Git倉庫,也就是把本地文件(資源)傳送到服務器儲存的地方。可是你不想要的文件在這裏,這就是爲何這是一個空的倉庫。翻譯

cd ~/example.git
git init --bare

若是你想的話,你能夠重複此步驟。

寫一個發送-接收鉤子

一個發送-接收鉤子可讓你在Git倉庫接收到commits後運行指令。這樣,你能夠改變Git的工做目錄,從example.gitexample.com,而且檢查在example.com目錄下的副本。

工做目錄的位置可使用GIT_WORK_TREE在per-command的基礎上設置,Git的環境變量中其中一個或者work-tree選項。

cat > hooks/post-receive
#!/bin/sh
WEB_DIR=/path/to/example.com

# remove any untracked files and directories
git --work-tree=${WEB_DIR} clean -fd

# force checkout of the latest deploy
git --work-tree=${WEB_DIR} checkout --force

確保hook上的文件權限正確。

chmod +x hooks/post-receive

若是你須要使一些文件不被Git清理(好比.htpasswd文件),你可使用--exclude選項。這須要在你的服務器上安裝Git 1.7.3或者以上版本。

git --work-tree=${WEB_DIR} clean -fd --exclude=<pattern>

若是你想的話,能夠重複此步驟。

在本地機器上操做

如今,服務器配置已經完成,你想要爲靜態站點部署build assets(不是源碼)。

構建和部署任務

我正在使用生成文件(Makefile),可是你可使用任何你擅長的。下面是我想要自動化完成的基本工做流程。

  1. 創建靜態站點的生產版本。

    make build

  2. 初始化一個新的Git repo在構建目錄中。 我不想嘗試合併到以前部署的文件,尤爲是對於分段域(staging domain)。

    git init ./build

  3. 遠程部署
    cd ./build git remote add origin ssh://user@hostname/~/example.git

  4. commit repo中的全部內容
    cd ./build git add -A git commit -m "Release"

  5. 強制轉換遠程主分支, 若是丟失的話,則建立它。
    cd ./build git push -f origin +master:refs/heads/master

  6. 在源repo中標記出檢查commit的SHA,因而我能夠看到哪一個是最新部署。
    git tag -f production

使用一個生成文件:

BUILD_DIR := ./build
STAGING_REPO = ssh://user@hostname/~/staging.example.git
PROD_REPO = ssh://user@hostname/~/example.git

install:
    npm install

# Deploy tasks

staging: build git-staging deploy
    @ git tag -f staging
    @ echo "Staging deploy complete"

prod: build git-prod deploy
    @ git tag -f production
    @ echo "Production deploy complete"

# Build tasks

build: clean
    # whatever your build step is

# Sub-tasks

clean:
    @ rm -rf $(BUILD_DIR)

git-prod:
    @ cd $(BUILD_DIR) && \
    git init && \
    git remote add origin $(PROD_REPO)

git-staging:
    @ cd $(BUILD_DIR) && \
    git init && \
    git remote add origin $(STAGING_REPO)

deploy:
    @ cd $(BUILD_DIR) && \
    git add -A && \
    git commit -m "Release" && \
    git push -f origin +master:refs/heads/master

.PHONY: install build clean deploy git-prod git-staging prod staging

分階段部署:

make staging

部署生產:

make prod

使用Make,,由於cd命令在子流程中。可是你須要確保後來的命令在同一行中。舉個栗子:若是沒有在命令中加入&&;,那麼deploy任務會強制推送到你源代碼的遠程主分支。

我把個人站點源碼傳到了BitBucket一個私人的倉庫。BitBucket其中一個很不錯的地方在於可以讓你選擇防止誤刪除或者重寫分支。

本文翻譯自《A simple Git deployment strategy for static sites》

相關文章
相關標籤/搜索