自动布署服务器环境,并利用 Git 实现本地代码自动同步到服务器!

这里说的自动布署是两方面的,第一部分是脚本自动布署服务器环境,第二部份是自动布署代码,完成这两部分,在我理解,就算是完成自动部署了。

我们要做的,就是本地写完代码提交 git 后,使用git push 自动将代码推送到测试或生产环境的站点目录。
好的,开工吧!

LNMP线上环境自动布署脚本

使用 此脚本 可在一台全新的 Ubuntu 14.04 LTS 或者 Ubuntu 16 上自动部署适合 Laravel 使用的 LNMP 生产环境。
按照此 文档 安装即可。

但是此方法在使用中会有一些小问题

  1. 网易镜像加速后会出现一些安装错误
    可能是网易镜像没有更新完全。
    需要将网易镜像地址更新为其它地址,可以参考 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
  2. 正常安装后Nginx 启动前需要把 apache 卸载掉,然后再启动 Nginx .
    apt-get purge apache2
    service nginx restart
  3. 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 配置

项目中有些脚本需要在后台运行,比如队列、HorizonSupervisor可以监控后台脚本的运行,再产生异常或是停止后自动重启,保证了脚本不会被异常中断。定时任备也可以直接用 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 协议》,转载必须注明作者和本文链接
Good Good Study , Day Day Up!!
本帖由系统于 6年前 自动加精
Jourdon
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 26

centos部署差别大吗?

6年前 评论
Jourdon

@Aexus centosubuntu 的差别基本上也就环境的安装上,其它的软件设置之类都大同小异的

6年前 评论

先把空的仓库克隆到路径下:git clone blog /home/ubuntu/repo/blog.git
这是是在哪个文件目录执行?

6年前 评论
Jourdon

@许世桓 克隆下来的 blog 是你的站点目录 我这里是 home/ubuntu/www/blog

6年前 评论

@Jourdon 你前面写的是repo后面又写成reop,这个是写错了吗?还是没有哇

6年前 评论
Jourdon

@许世桓 :cold_sweat: 应该是 repo ,手误,写错了,已修改,谢谢提醒!

6年前 评论

@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。这样才可以创建。
麻烦你把执行的命令的目录说清楚呀,这样很难猜的。

6年前 评论
Jourdon

@许世桓 已修改

进入本地共享文件夹,执行

git clone  blog_back root@server_ip:/home/ubuntu/repo/blog.git

将远程的空仓库克隆下来。名称为 blog_back,防止与本地 blog 目录冲突。
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 //此时输入服务器密码即可将本地项目推送到服务器上
6年前 评论

@Jourdon 哈哈,谢谢,要是不对,我还会来骚扰你的。。

6年前 评论
Jourdon

@许世桓 没关系,如果你能完整的做下来,才能说明我写的没有问题,有问题随时艾特我

6年前 评论

@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怎么出这么错呢?

6年前 评论
Jourdon

@许世桓 之前修改的时候马虎了,git 命令写错了,已修改!

6年前 评论
毛仔

你好,您的文档写的很详细,学习了。我还有个问题,我们的项目是本地服务器搭建的gitlab,请问怎么样才能做到自动部署呢?

6年前 评论
Jourdon

@贾济林 额,这里说的自动布署是两方面的,第一部分是脚本自动布署 服务器 环境,第二部份是自动布署代码,完成这两部分,就算是完成自动部署了。

6年前 评论
毛仔

@Jourdon 你好,感谢回复,昨天看着您的文档,把我自己的阿里云服务器上的项目弄成了自动部署,但是您这个方案,代码服务器和项目服务器必须是同一台才可以的吧,我目前的状况是,代码服务器在我们办公室,线上服务器是阿里云,这样的基础上,我也想搞成自动部署,因为现在推项目确实很麻烦,希望听听您的想法,多谢指点

6年前 评论
Jourdon

@贾济林 代码服务器和项目服务器在不在同一台服务器上并不是重点,重点是 git 仓库在哪里, 真正的 代码服务器 其实是在你的本地,而你理解的 代码服务器,其实就是一个远程仓库而已,本地代码服务器只有一个,但是远程仓库可以有多个,可以是测试服务器、正式服务器、github,都可以。

6年前 评论
DianWang

可以结合docker会更加灵活方便

5年前 评论
superwen

还是感觉Delopyer是最好用的。楼主可以看看。

5年前 评论
Jourdon

@DianWang 本地我会用laradock玩玩还行,上线的话还搞不定

5年前 评论
Jourdon

@superwen 有空研究下

5年前 评论
DianWang

@Jourdon laradock 本来就不是线上用的.......

5年前 评论
Jourdon

@DianWang 嗯,我想说docker玩不明白,只会玩玩laradock:sweat_smile:

5年前 评论

你好,我也根据自动部署脚本完成了部署环境。有个问题,phpize这个命令找不到,我想编译swoole。你知道该怎么处理吗?

5年前 评论
Jourdon

@xiaoguo0426 phpize 找不到是因为你没有安装,安装swoole有很多种方法,pecl ,ubuntu下的方法 apt-get 等等,这种问题百度就能找到

5年前 评论

本地项目增加远程仓库关联,不存在项目名冲突的吧
git remote add origin root@server_ip:/home/ubuntu/repo/blog.git
只是推送的时候总是需要输入服务器密码

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!