感受
在进行webhook自动部署的时候,踩了好多好多坑,也查了不少资料,结果却是走了许多弯路,这里我主要讲述我在配置的过程中进行的一系列操作。
操作环境
centos7 , php7 , nginx1.10
具体步骤
- 创建一个用户组
groupadd web
- 创建一个用户(用户目录在/home/web 名称为web 所属组为web)
useradd -d /home/web -m web -g web
- 编辑php-fpm的配置文件并重启php-fpm服务
vim /usr/local/php7/etc/php-fpm.d/www.conf
#修改配置文件中的 user=nobody 与 group=nobody
user=web
group=web
service php-fpm restart
- 生成密钥并查看,复制粘贴将其添加进coding账户中的ssh公钥列表中
sudo -Hu web ssh-keygen -t rsa
cat /home/web/.ssh/id_rsa.pub
- 修改sudoers
visudo
#root ALL=(ALL) ALL 这句下面添加下面这句
web ALL=(ALL) NOPASSWD:ALL
- 通过git克隆代码仓库至/www/web目录(需切换至新用户操作,并且要通过ssh方式克隆,而非https)
su web
git clone git@git.coding.net:xxxxx/xxxxx.git /www/web
- 准备githook.php文件
<?php
$a = shell_exec('cd /www/web/ && git remote update -p && git checkout -f origin/master && git submodule update --init ');
print_r($a);
- 在项目中设置webhook,设置访问githook.php文件的链接地址
相关操作及具体阐释
- 用户组相关操作
#创建用户组
groupadd my_group
#修改用户组
groupmod -n my_group2 my_group #注意:被操作的 要写在最后面
#删除用户组
groupdel my_group2
#查看当前登陆用户所属组
groups
#查看某用户对应的用户组
groups root #root可以替换为其它用户名
#查看所有用户组及其对应id
cat /etc/group
- 用户相关操作
# useradd 、usermod 相关参数
Options:
-b, --base-dir BASE_DIR 设置基本路径作为用户的登录目录
-c, --comment COMMENT 对用户的注释
-d, --home-dir HOME_DIR 设置用户的登录目录
-D, --defaults 改变设置
-e, --expiredate EXPIRE_DATE 设置用户的有效期
-f, --inactive INACTIVE 用户过期后,让密码无效
-g, --gid GROUP 使用户只属于某个组
-G, --groups GROUPS 使用户加入某个组
-h, --help 帮助
-k, --skel SKEL_DIR 指定其他的skel目录
-K, --key KEY=VALUE 覆盖 /etc/login.defs 配置文件
-m, --create-home 自动创建登录目录
-l, 不把用户加入到lastlog文件中
-M, 不自动创建登录目录
-r, 建立系统账号
-o, --non-unique 允许用户拥有相同的UID
-p, --password PASSWORD 为新用户使用加密密码
-s, --shell SHELL 登录时候的shell
-u, --uid UID 为新用户指定一个UID
-Z, --selinux-user SEUSER use a specific SEUSER for the SELinux user mapping
#创建用户
useradd -d /home/web_admin -m web_admin #配置参数在前,名称放在最后
#修改用户
usermod -d /home/web_admin2 -G my_group web_admin #依然是配置参数在前,名称放在最后
#删除用户
userdel web_admin
#查看当前登陆用户
whoami
#查看某个用户
finger web_admin #如果finger程序没有的话,执行yum install finger 安装一个就好了
#查看登录成功的用户记录
last
#查看登录不成功的用户记录
lastb
#查看所有用户
cut -d : -f 1 /etc/passwd #或者 cat /etc/passwd |awk -F \: '{print $1}'
- php-fpm相关操作
#查看php-fpm子进程的运行用户
ps -ef|grep php-fpm
#如果php-fpm子进程的运行用户是nobody,则最好新建一个用户,用来运行php-fpm。另外,php-fpm的父进程一般是root,这个一般无需改动。
#编辑php-fpm配置文件
vim /usr/local/php7/etc/php-fpm.d/www.conf #配置文件位置因人而异,主要看搭环境的时候怎么配的了
#修改配置文件中的 user= 与 group=
#重启php-fpm
service php-fpm restart
- ssh免密码登陆
#指定用户 生成公钥
sudo -Hu web_admin ssh-keygen -t rsa #其中web_admin是指定的用户名
#查看公钥
cat /home/web_admin/.ssh/id_rsa.pub #因为我的是默认操作,所以自动在web_admin下的.ssh文件夹下生成。如果是生成其它用户的,则路径改为那个用户的文件夹路径
#进入coding的ssh公钥设置页面,添加id_rsa.pub文件的所有内容
- 修改sudoers
visudo
#Defaults requiretty 此句无注释
#root ALL=(ALL) ALL 这句下面加一句
web_admin ALL=(ALL) NOPASSWD:ALL
#web_admin为分配的用户名,NOPASSWD为不需要密码的意思
- 准备githook.php文件
<?php
$a = shell_exec('cd /www/web/ && git remote update -p && git checkout -f origin/master && git submodule update --init ');
print_r($a);
/** 先用terminal在项目目录下用运行php-fpm的用户执行php githook.php,针对遇到的问题做特定调整。
* 常见的问题有:
* 1.无执行权限(更改项目所属用户为php-fpm运行用户)
* 2.目录不存在(调整项目路径)
* 3.无法访问远程仓库权限(检查是否在coding中添加ssh密钥)
*/
错误示例一:每次shell_exec执行git操作前都要加cd,否则,git命令无法执行
shell_exec("cd /www/my/blog ");
shell_exec("git status && git remote update -p && git checkout origin/master && git submodule update --init");
错误示例二:用visudo编辑过sudoers文件,并添加web_admin用户之后,无需加sudo
shell_exec("cd /www/my/blog && sudo git status && sudo git remote update -p && sudo git checkout origin/master && git submodule update --init");
-
进入coding的项目设置页面,选择webhook
-
新建webhook,url=http://访问地址/githook.php,无需安全的话token随意,需要token的话,githook.php需增加判断token是否正确的语句 ,coding webhook官方文档
-
测试是否连接
-
更改项目文件所属用户
chown web_admin /www/web_dir/ -R #web_dir为项目目录
如遇其它问题,欢迎再下面评论区交流^_^