PHP实现git部署

背景

小公司上班,原先的系统还在使用传统的ftp上传部署,部署太麻烦,也不好管控线上的代码.在网上找了下git部署的教程.一路跟着下来,碰到了不少坑.现在把整个过程发出来,希望可以帮助到大家.

账号相关

useradd -m git    //新增git账号

ssh-keygen        //密钥生成,如果已经有了可略过

su git       //切换至git账号

cd ~   //切换到git账号根目录

mkdir .ssh    //创建.ssh目录

cat /密钥存放目录/xxx.pub >> ~/.ssh/authorized_keys     //设置公钥

此处一定要注意权限问题,否则密钥登入无法生效,各文件夹对应的权限如下

.ssh文件夹权限   700
id_rsa   600
id_rsa.pub   644
authorized_keys  600

文件权限设置

将git与站点运行nginx或者apache的用户放同一用户组,如www
vim /etc/passwd   找到git账号与www账号,将git账号的组标识变更为与www组标识一致
站点所属者设置为git,用户组设置为 www     //假设nginx与git 都归属于www用户组
目录权限设置775 ,文件权限设置为664

仓库代码

服务器端
cd 站点目录
git init   //初始化目录

git配置

git config receive.denyCurrentBranch ignore     //设置仓库接受代码提交

设置sudo免密

vim /etc/sudoers

# Defaults        secure_path 中若没有你要的命令,要注意添加
# php的命令默认需要在 secure_path最后面添加    :/usr/local/php/bin"
在  root ALL=(ALL) ALL 下面一行添加
git ALL=(ALL) NOPASSWD:ALL     
# 保存退出   ,这样针对laravel 要重启队列命令就可以使用了.
# sudo php artisan queue:restart

钩子设置

cd .git/hooks    //切换至站点钩子目录
touch post-receive    //创建接收提交时钩子
// 钩子文件内容如下:

#!/bin/sh
# 设置账号创建文件的默认权限
umask 002   
unset GIT_DIR
cd ..
git checkout -f
# 执行PHP钩子逻辑
/usr/bin/curl http(s)://域名/钩子文字位置/hook.php

# 如果有使用laravel队列则需要重启队列进程,让新代码生效
# sudo php artisan queue:restart
exit 0

hook.php内容

<?php
/**
 * git上传执行钩子
 */
//TODO 安全限制
//TODO 其他钩子行为
// 清除opcache
if (version_compare(PHP_VERSION, '5.5.0', '>=')) {
    opcache_reset();
}

增加钩子可执行权限

chmod a+x .git/hooks/post-receive

本地代码
git remote add 远程仓库名称 ssh://git@IP地址:/站点目录    //添加远程仓库
git push 远程仓库名称  master 

特别注意

用户上传的图片目录一定要做好文件忽视动作,否则有可能在清除未追踪文件时将此部分文件删除,造成灾难性结果

    原文作者:工具
    原文地址: https://segmentfault.com/a/1190000012463755
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞