通过Git简易的部署静态站点

准备工作:

  1. 一个远程服务器来托管你的站点。
  2. 通过SSH访问远程服务器。
  3. 在远程服务器上安装Git(通过指令git --version来检查是否安装)。
  4. 如果需要,请<a href="https://help.github.com/articles/generating-ssh-keys" target="_blank">生成一个SSH key</a>。

在服务器端

设置无密码的SSH访问

首先,你需要通过SSH连接到你的服务器,如果有提示的话请输入密码。

ssh user@hostname

如果在你的用户的主目录中没有~/.ssh目录,请创建一个:mkdir ~/.ssh

接下来,你需要复制你的公共SSH key(请看<a href="https://help.github.com/articles/generating-ssh-keys" target="_blank">生成一个SSH key</a>)到你的服务器。这样你就可以通过SSH连接,并且不需要每次都输入密码。

在你的本地 - 假设你的公共key可以在~/.ssh/id_rsa.pub找到 - 使用正确的用户和主机名称输入下面的指令。它将会把你的公共秘钥(key)添加到远程服务器的authorized_keys文件。

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

如果你关闭连接,并且尝试建立SSH访问,你应该不再会被提示输入密码。

创建远程目录

你需要为每个域名建立2个目录。一个作为Git的仓库,另一个包含其他信息。

举个栗子,如果你的域名是example.com,并且你想要建立一个环境,那么你需要在你的服务器上建立这些目录:

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

初始化空的Git仓库

在服务器上创建空的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

  1. 初始化一个新的Git repo在构建目录中。 我不想尝试合并到之前部署的文件,尤其是对于分段域(staging domain)。

git init ./build

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

  2. commit repo中的所有内容
    cd ./build git add -A git commit -m "Release"

  3. 强制转换远程主分支, 如果丢失的话,则创建它。
    cd ./build git push -f origin +master:refs/heads/master

  4. 在源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》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容