使用git做服务器端代码的部署
传统部署方案
windows 远程桌面
FTP/SFTP
登录服务器pull github代码
Phing(PHP专业部署工具)
git 自动部署流程图
![]() |
服务器端准备工作:
0. 这些工作都在root或有管理权限的帐号下进行,下面以root为用户,切换到其他用户的时候会提示
1. 确保安装了git
2. 为了安全起见,新建一个专门用于代码部署的无特权用户
useradd -m deployuser
passwd deployuser #设置该用户的密码,也可根据喜好配置成免密码登陆
3. 新建一个目录作为要部署代码的根目录,如:
mkdir /var/www/html/deploy
4. 将这个目录的属主和属组都改为上面新建的用户deployuser
cd /var/www/html
chown deployuser:deployuser deploy
5. 切换到部署代码的专用用户
su deployuser
6. 进入项目根目录,初始化为git仓库
cd deploy
git init
7. 【重要】让仓库接受代码提交
git config receive.denyCurrentBranch ignore
[可选] git config core.worktree ~/www
[可选] git config --bool receive.denyNonFastForwards false #禁止强制推送
至此,一个空的git仓库就在服务器上建好了,仓库的地址为:
ssh://deployuser@ipaddress/var/www/html/deploy/.git
本地仓库准备工作:
1. 通过 git clone 或 git pull 从 github 仓库上将代码获取到本地
2. 将服务器添加到远程仓库列表,使用名字来区分不同的服务器,如测试服务器可以叫做testing
git remote add testing ssh://deployuser@ipaddress/var/www/html/deploy/.git
3. 将本地代码提交到测试服务器上面
git push testing master
回到服务器端:
1. 更新服务端 git 仓库状态并检出文件
cd /var/www/html/deploy
git update-server-info
git checkout -f
OR:
git checkout branch_name # 如果push的不是master分支
2. 检查是不是将文件更新进来了
3. 设置服务器端更新钩子 post-update
cd .git/hooks
新建 post-receive 或将 post-receive.sample 重命名为 post-receive
touch post-receive
OR:
mv post-receive.sample post-receive
vim post-receive
将如下内容复制到文件中
#!/bin/sh
unset GIT_DIR
cd ..
git checkout -f
注: 第3步的操作将post-receive 替换为 post-update也可以, 不过需要先将post-update中的exec git update-server-info这一行删掉
后续代码的更新:
1. github 有更新的时候 pull 更新本地部署仓库
2. 然后本地先 push 到测试服务器进行测试
3. 测试通过之后 push 到正式服务器进行上线
4. 代码的回滚:
*服务器端回滚:推荐 git reset --hard HEAD^
本地仓库回滚: 无需登陆服务器即可实现代码回滚,git reset HEAD^ 保留代码回滚,然后使用 git push remote_name local_branch_name -f 强制推送
使用过程中需要注意的问题:
1. 需要约定好 git 不能更新的操作要怎么处理,比如新增数据库的字段,新安装必要的扩...
使用git做服务器端代码的部署的更多相关文章
- 做了一个简易的git 代码自动部署脚本
做了一个简易的git 代码自动部署脚本 http://my.oschina.net/caomenglong/blog/472665 发表于2个月前(2015-06-30 21:08) 阅读(200 ...
- 搭建Git服务器环境----Git hooks代码自动部署
引言:自己想搭一套git的服务端环境,不想用github码云等.经多方资料整合,实验总结,以下是亲测有效的方式.可用于公司日常开发 一.搭建Git环境 ① 安装 Git Linux 做为服务器端系统, ...
- GIT服务器实现web代码自动部署
之前在一台vps服务器上面搭建了Git服务器,用来做代码管理,方便团队开发.但是问题也就相应的来了,使用git可以轻松的上传代码,而由于做的是web开发,每次还都得到服务器上把代码手动pull或者复制 ...
- Pull Request的过程、基于git做的协同开发、git常见的一些命令、git实现代码的review、git实现版本的管理、gitlab、GitHub上为开源项目贡献代码
前言: Pull Request的流程 1.fork 首先是找到自己想要pull request的项目, 然后点击fork按钮,此时就会在你的仓库中多出来一个仓库,格式是:自己的账户名/想要pull ...
- Eclipse集成Git做团队开发:代码管理
在日常开发工作中,我们通常使用版本控制软件管理团队的源代码,常用的SVN.Git.与SVN相比,Git有分支的概念,可以从主分支创建开发分支,在开发分支测试没有问题之后,再合并到主分支上去,从而避免了 ...
- 使用 Git Hooks 实现自动项目部署
最近在某服务器上面搭建 git 开发和部署环境,git 开发环境很简单,按照 ProGit 一书的相关知识就可以轻松搞定,实现了类似 Github 的使用 SSH + 私有 Clone 的方式. 关于 ...
- 持续集成之⑤:jenkins结合脚本实现代码自动化部署及一键回滚至上一版本
持续集成之⑤:jenkins结合脚本实现代码自动化部署及一键回滚至上一版本 一:本文通过jenkins调用shell脚本的的方式完成从Git服务器获取代码.打包.部署到web服务器.将web服务器从负 ...
- Java代码自动部署
注:本文来源于<it小熊> [ ①Java代码自动部署-总结简介] 代码部署是每一个软件开发项目组都会有的一个流程,也是从开发环节到发布功能必不可少的环节.对于Java开发者来说,Java ...
- jenkins结合脚本实现代码自动化部署及一键回滚至上一版本
持续集成之⑤:jenkins结合脚本实现代码自动化部署及一键回滚至上一版本 一:本文通过jenkins调用shell脚本的的方式完成从Git服务器获取代码.打包.部署到web服务器.将web服务器从负 ...
随机推荐
- CC2540 USB Dongle 使用说明
CC2540做的USB Dongle可以烧写不同的固件从而做很多PC端的应用,下面我们来介绍下下载固件的方法和一些典型应用: 下载接口: 3V3引脚连接到CC Debugger的Target Volt ...
- 读书笔记——《图解TCP/IP》(4/4)
经典摘抄 第八章 应用层协议概要 1.应用协议是为了实现某种应用而设计和创造的协议. 2.TCP/IP的应用层包含了管理通信连接的会话层功能.转换数据格式的表示层功能,还包括与对端主机交互的应用层功能 ...
- ssh2 php扩展
如何通过PHP启动和关闭远程服务器上的某个软件,譬如Memcached.对于俺这个刚刚掌握PHP编程皮毛的菜鸟来说,最直接不过的想法就是用exec函数执行SSH命令呗,先把运行Apache+PHP的服 ...
- netstat 查看TCP状态值
一.TCP 状态值 netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' CLOSED:无连接是活动的或正在进行LI ...
- 安装Postman
原文地址:http://blog.csdn.net/ouyang111222/article/details/45743831 ** (一)安装篇 ** Postman是一款功能强大的网页调试与发送网 ...
- mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication解决办法
mysqlnd是个好东西.不仅可以提高与mysql数据库通信的效率,而且也可以方便的设置一些超时.如,连接超时,查询超时.但是,使用mysqlnd的时候,有个地方需要注意.就是服务端的密码格式不能使用 ...
- nccmp - 比较netcdf的文件内容 - 编译安装
1. 简介 Compares two NetCDF files in-place to find specific variables, dimensions and/or attributes th ...
- 【tips】判断两个整数是否是同一个数量级
leetcode刷题的时候,需要用到,已知整数A,B,且A>B,判断AB是否是同一数量级的. 第一想到的是不停地除以10,得到每个数字的数量级再进行比较,太麻烦: 转而向转化成字符串比较,还是麻 ...
- iOS获取的NSDate date时间与实际相差8个小时
NSDate *startDate = [NSDate date];NSTimeZone *zone = [NSTimeZone systemTimeZone];NSInteger interval ...
- NSDate如何获取一个月后的日期
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateCo ...
