189 git hooks 2 利用git push向服务器一键部署代码
来源:互联网 发布:福建省淘宝茶叶哪个好 编辑:程序博客网 时间:2024/05/04 13:28
作者:吴中杰
链接:https://zhuanlan.zhihu.com/p/19757507
来源:知乎
不知大家在做一些需要服务器的小项目的时候都是怎么部署代码的?我之前在Heroku的时候就觉得他家的代码部署方法及其方便,基本上就是
heroku apps:create my_appgit push heroku master
然后就一路帮你部署到heroku的平台。绝对是2分钟上线一个Rails网站。
于是我这两天就在研究如何用git push部署代码,发现网上的大部分解决方案都是基于git checkout的。我不太喜欢这个方法,因为用这个方法push后,真正的代码属于漂浮的状态,当你运行git status的时候会发现那些新加的代码依然处于unstaged状态。
我下面要介绍的是基于git reset --hard
的push-to-deploy
设置方案
首先你需要一个服务器,这个服务器可以是你家里的电脑也可以是云端的服务器。你必须可以顺利ssh进去。至于怎么ssh,这不是本文要讨论的内容(大家可以学习ssh-keygen、authorized_keys、man ssh-config的相关内容)。
假如你能顺利的ssh进你的服务器如
ssh ubuntu@myserver.com
那么要做的事情如下
设置文件夹
进入本地git文件夹,然后将代码push到一个远端新建的裸代码库。
cd local_git_codegit remote add stg ubuntu@myserver.com:my_repossh ubuntu@myserver.com 'cd ~ && git init --bare my_repo;'
什么是裸代码库?基本上就是那些github之类的网站存储你的代码的形式。这样的代码库只有历史记录和索引,没有实际以文件形式存在的代码。那些代码都以二进制的形式存在git自己的数据库里。
有了代码库以后就可以设置自己的自动部署挂钩了。这个挂钩本质是一个脚本,当这个文件在repo/hooks/文件夹内,名字为post-receive并且ubuntu的x属性(可执行)为真的时候,git会在收到push后执行它。
于是你就应该将下面这个脚本稍加修改放到本地的git工作文件夹中,可以取名post-receive.hook。注意,这个文件必须为可执行状态,可以用
ls -l .
查看。可以使用
chmod u+x post-receive.hook
保证其可执行型。
#!/bin/sh# This file is to be used by git repo on server# It should be a file called hooks/post-receive in the bare git reposet -xe # x表示是打印每一个运行的命令;e表示有任何错误就退出echo "Running Post Receive Hook"export GIT_WORK_TREE=$HOME/my_codeexport GIT_DIR=${GIT_WORK_TREE}/.gitcd ${GIT_WORK_TREE}git fetch origingit reset --hard origin/master# reload my apps# pkill -HUP uwsgi
你可以在文件的尾部加一些应用重置命令(如果你用uwsgi运行python应用的话就可以用如上所示案例)。
将此文件加入git后push到远端服务器
git add post-receive.hookgit commit -m "Add post receive hook"git push stg master
下一步是在服务器checkout出一份代码
# In remote servercd ~git clone my_repo my_code
这个时候就会出现my_repo文件夹,里面会有你的代码。同时,这个代码文件夹的默认origin远端(remote)就会变成my_repo文件夹。当你做git fetch git pull等动作的时候就会从my_repo取信息。
下一步是将挂钩脚本放入repo中
ln -s ~/my_code/post-receive.hook ~/my_repo/hooks/post-receive
注意,这个文件链接一定要放在hooks文件夹内,名字必须叫post-receive
这个时候基本就设置好了
push-to-deploy
下面就可以试验push-to-deploy的效果了。在本地文件夹
touch README.md
git add README.md
git commit
git push stg master
你将会看到一系列的消息
技术细节
你会注意到,post-receive脚本内有这两行
export GIT_WORK_TREE=$HOME/my_codeexport GIT_DIR=${GIT_WORK_TREE}/.git
这是告诉git,当你运行的时候所有跟代码本身有关的操作都对my_code进行,所有跟git索引和数据库有关的操作都基于my_code/.git下面。
网上很多现有的方案都是用得checkout -f,他们都不改变GIT_DIR变量。这就导致了my_code/.git并不更新,就像是把my_repo拿过来变成.git然后做一堆checkout操作,然后再恢复原来的.git文件夹,所以所有的新代码都处于unstaged状态。
本文提到的这样做的好处是,你可以利用git push -f进行一些试验性的操作。加入你修改了一个本地文件,你需要部署到staging服务器,那么你就可以用
git add my_changed_filegit commit -m "informal commit"git push stg master
这个时候你发现不好用又做了一次修改,你可以直接覆盖+暴力推送,而不产生一个新的提交(commit)
git add my_changed_filegit commit --amend --no-editgit push -f stg master
等到你完全满意了以后,你可以正式推送到官方代码库和production服务器
git commit --amend -m "Real commit"git push -f stg mastergit push origin master # like github.comgit push prod master # if you have this remote
这样的话你的那些修改的中间状态就不会进到官方的代码库,不会被别人看到。
当然,对production服务器和主代码库做暴力推送是不提倡的,在有多人在开发的时候应该是禁止的。
以上。
- 189 git hooks 2 利用git push向服务器一键部署代码
- 利用git push向服务器一键部署代码
- git一键部署代码到远程服务器
- git服务器的搭建和自动化部署(hooks)
- 在CentOS搭建Git服务器,部署hooks同步
- 使用Git 一键部署到服务器
- git hooks
- Git hooks
- git hooks
- GIT HOOKS
- git push代码到远程服务器
- Linux git 服务端部署钩子 hooks
- 实现git hooks自动持续部署
- Git Hooks实现开发部署任务自动化
- git hooks 实现网站的自动部署
- 简单利用git部署网站到服务器
- 利用git快速部署远程服务器
- Git Push(向远程Github提交本地代码)
- 解决连续点击Toast时发生延时问题
- fgets和fscanf区别
- (42)数组案列之小羊繁殖 联系题
- 部署dubbo服务报错:Failed to read schema document 'http://code.alibabatech.com/schema/dubbo/dubbo.xsd'
- iOS开发笔记——关于Assets.xcassets的学习
- 189 git hooks 2 利用git push向服务器一键部署代码
- Mfc下CString转换为char *
- (43)超级全局变量
- 百度开放平台-快递物流解决方案
- iOS atomic和noatomic
- FragmentTransaction addToBackStack 无效问题
- 快速读入
- [JSOI2008]星球大战
- android TextView 换行问题