自动布署服务器环境,并利用 Git 实现本地代码自动同步到服务器!
这里说的自动布署是两方面的,第一部分是脚本自动布署服务器环境,第二部份是自动布署代码,完成这两部分,在我理解,就算是完成自动部署了。
我们要做的,就是本地写完代码提交 git
后,使用git push
自动将代码推送到测试或生产环境的站点目录。
好的,开工吧!
LNMP线上环境自动布署脚本
使用 此脚本 可在一台全新的 Ubuntu 14.04 LTS
或者 Ubuntu 16
上自动部署适合 Laravel 使用的 LNMP 生产环境。
按照此 文档 安装即可。
但是此方法在使用中会有一些小问题
- 网易镜像加速后会出现一些安装错误
可能是网易镜像没有更新完全。
需要将网易镜像地址更新为其它地址,可以参考 Ubuntu 官方模版 来更新镜像。
我使用的是阿里云的镜像替换了网易的镜像。
更新为vi /etc/apt/sources.list
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse ##測試版源 deb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse # 源碼 deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse ##測試版源 deb-src http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse # Canonical 合作夥伴和附加 deb http://archive.canonical.com/ubuntu/ xenial partner deb http://extras.ubuntu.com/ubuntu/ xenial main
- 正常安装后
Nginx
启动前需要把apache
卸载掉,然后再启动Nginx
.apt-get purge apache2 service nginx restart
redis
默认没有启动service redis-server start // 启动 redis service redis-server status // 查看 redis service redis-server stop // 停止 redis
配置Git自动部署
创建Git远程仓库
我们用一个独立的路径来做远程仓库。
然后在仓库的路径下,创建一个git裸仓库:
cd /home/ubuntu/repo/
git init --bare blog.git
git
默认是禁止 push
的,所有要设置允许 push
:
vi config
修改或添加如下内容:
[receive]
denyCurrentBranch = ignore
编辑自动部署脚本
自动部署用到 git hooks
,在 git
路径下有个 hooks
文件夹,里面有一些示例。我们把 post-update.sample
重命名为 post-update
,并进行编辑:
mv post-update.sample post-update
vi post-update
#!/bin/sh
#
# An example hook script to prepare a packed repository for use over
# dumb transports.
#
# To enable this hook, rename this file to "post-update".
#exec git update-server-info
unset GIT_DIR
NowPath=`pwd`
DeployPath="/home/ubuntu/www/blog"
cd $DeployPath
git pull origin master
composer install
cd $NowPath
echo 'deploy success'
exit 0
这样每当 push master
分支到服务器时,都会自动切换到 DeployPath
,也就是 Nginx root
路径,执行 git pull origin master
从仓库拉去最新 master
分支,并执行 composer install
,如果项目 composer
有变更则安装,没有变更则不会安装。
部署路径初始化
先把空的仓库克隆到 home/ubuntu/www/
路径下 :
git clone /home/ubuntu/repo/blog.git
服务器的配置就级别完成了,此 blog
即为你的站点目录
接下来 创建一个专门的git用户:
# useradd gituser
# passwd gituser
将仓库目录home/ubuntu/repo/blog.git
及网站目录 home/ubuntu/www/blog
所有人改为 gituser
也可以拷贝一个公钥到服务器上,后续在本地进行git操作时不需要输入密码,跟GitHub一样,需要的可以自行搜索,这里不详细介绍了。
推送git仓库
进入本地共享文件夹,执行
git clone gituser@server_ip:/home/ubuntu/repo/blog.git blog_back
将远程的空仓库克隆下来。名称为 blog_back
,防止与本地 blog
目录冲突。
注意此处使用的是 git用户
ok,现在我们来创建一个项目
本地创建项目并提交 Git
composer create-project --prefer-dist laravel/laravel blog
mv blog_back/.git blog/.git //将 .git 目录拷贝过来即可在此目录操作 git
cd blog
git add -A
git commit -m 'init'
git push origin master //此时输入服务器密码即可将本地项目推送到服务器上
这里我使用的是默认的
root
用户,我们可以单独设置一个git
用户,也可以使用公钥的形式,类似于github
的方式。
安装 Composer
打开命令行并依次执行下列命令安装最新版本的 Composer
:
php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');"
//下载安装脚本 - composer-setup.php - 到当前目录。
php composer-setup.php //执行安装过程。
php -r "unlink('composer-setup.php');" //删除安装脚本
执行第一条命令下载下来的 composer-setup.php
脚本将简单地检测 php.ini
中的参数设置,如果某些参数未正确设置则会给出警告;然后下载最新版本的 composer.phar
文件到当前目录。
打开命令行窗口并执行如下命令将前面下载的 composer.phar
文件移动到 /usr/local/bin/
目录下面:
sudo mv composer.phar /usr/local/bin/composer
进程监控器 Supervisor
配置
项目中有些脚本需要在后台运行,比如队列、Horizon
,Supervisor
可以监控后台脚本的运行,再产生异常或是停止后自动重启,保证了脚本不会被异常中断。定时任备也可以直接用 Supervisor
来执行,Supervisor
还可以写入执行成功或失败的日志,方便查看。
此脚本默认安装了 supervisor
,我们只需设置好启动即可。
配置
在 /etc/supervisor/conf.d/
下新建一个配置文件 horizon.conf
,写入以下内容
[program:horizon]
process_name=%(program_name)s_%(process_num)02d
command=php /home/ubuntu/www/site/artisan horizon //启动脚本命令。
autostart=true //随着supervisord的启动而启动
autorestart=true //自动重启
user=ubuntu // 用户组
numprocs=1 // 启动进程,根据脚本决定
redirect_stderr=true //重定向stderr到stdout
stdout_logfile=/var/log/supervisor/horizon.log //日志 注意日志目录的权限
接下来就可以启动 supervisord
了。
supervisord -c /etc/supervisord.conf //启动
supervisorctl shutdown //关闭
supervisorctl reload //重新载入配置
```
好了。到这里自动布署就完成了,接下来就是尽情的敲代码吧!
* [`Packagist / Composer`中国全量镜像](https://pkg.phpcomposer.com/)
* [Ubuntu 14/16 下的 Laravel LNMP 线上环境自动部署脚本](https://learnku.com/laravel/t/2814/ubuntu-1416-under-the-laravel-lnmp-online-environment-automatically-deploy-scripts)
* [利用Git搭建自动部署的Laravel环境](https://blog.csdn.net/kbkaaa/article/details/70943401?utm_source=itdadao&utm_medium=referral)
我的小站 [茄盒网](http://www.qiehe.net/)
本作品采用《CC 协议》,转载必须注明作者和本文链接
centos部署差别大吗?
@Aexus
centos
和ubuntu
的差别基本上也就环境的安装上,其它的软件设置之类都大同小异的@Jourdon 受教了!谢谢你!
先把空的仓库克隆到路径下:git clone blog /home/ubuntu/repo/blog.git
这是是在哪个文件目录执行?
@许世桓 克隆下来的
blog
是你的站点目录 我这里是home/ubuntu/www/blog
@Jourdon 你前面写的是repo后面又写成reop,这个是写错了吗?还是没有哇
@许世桓 :cold_sweat: 应该是
repo
,手误,写错了,已修改,谢谢提醒!@Jourdon 哈哈,没有事儿。还有一个问题,就比如,我们的共享文件夹是Code目录下,那么你,执行git clone root@server_ip:/home/ubuntu/repo/blog.git,在Code目录下回产生一个blog文件夹,如果你创建一个blog的laravel项目的话,会报错说已经存在blog了,那么是不是,执行git clone root@server_ip:/home/ubuntu/repo/blog.git,然后cd blog目录下,在composer create-project --prefer-dist laravel/laravel blog。这样才可以创建。
麻烦你把执行的命令的目录说清楚呀,这样很难猜的。
@许世桓 已修改
进入本地共享文件夹,执行
将远程的空仓库克隆下来。名称为
blog_back
,防止与本地blog
目录冲突。ok,现在我们来创建一个项目
本地创建项目并提交
Git
@Jourdon 哈哈,谢谢,要是不对,我还会来骚扰你的。。
@许世桓 没关系,如果你能完整的做下来,才能说明我写的没有问题,有问题随时艾特我
@Jourdon 在 /home/ubuntu/www 下目录执行
root@super:/home/ubuntu/www# git clone blog /home/ubuntu/repo/blog.git
fatal: repository 'blog' does not exist
报上面的错,所以在/www这个目录下还需要git init或是其他操作嘛?
不然git clone怎么出这么错呢?
@许世桓 之前修改的时候马虎了,
git
命令写错了,已修改!你好,您的文档写的很详细,学习了。我还有个问题,我们的项目是本地服务器搭建的gitlab,请问怎么样才能做到自动部署呢?
@贾济林 额,这里说的自动布署是两方面的,第一部分是脚本自动布署 服务器 环境,第二部份是自动布署代码,完成这两部分,就算是完成自动部署了。
@Jourdon 你好,感谢回复,昨天看着您的文档,把我自己的阿里云服务器上的项目弄成了自动部署,但是您这个方案,代码服务器和项目服务器必须是同一台才可以的吧,我目前的状况是,代码服务器在我们办公室,线上服务器是阿里云,这样的基础上,我也想搞成自动部署,因为现在推项目确实很麻烦,希望听听您的想法,多谢指点
@贾济林 代码服务器和项目服务器在不在同一台服务器上并不是重点,重点是
git
仓库在哪里, 真正的代码服务器
其实是在你的本地,而你理解的代码服务器
,其实就是一个远程仓库而已,本地代码服务器只有一个,但是远程仓库可以有多个,可以是测试服务器、正式服务器、github
,都可以。可以结合docker会更加灵活方便
还是感觉Delopyer是最好用的。楼主可以看看。
@DianWang 本地我会用laradock玩玩还行,上线的话还搞不定
@superwen 有空研究下
@Jourdon laradock 本来就不是线上用的.......
@DianWang 嗯,我想说docker玩不明白,只会玩玩laradock:sweat_smile:
你好,我也根据自动部署脚本完成了部署环境。有个问题,phpize这个命令找不到,我想编译swoole。你知道该怎么处理吗?
@xiaoguo0426 phpize 找不到是因为你没有安装,安装swoole有很多种方法,pecl ,ubuntu下的方法 apt-get 等等,这种问题百度就能找到
本地项目增加远程仓库关联,不存在项目名冲突的吧
git remote add origin root@server_ip:/home/ubuntu/repo/blog.git
只是推送的时候总是需要输入服务器密码