利用Coding的webhook自动部署项目

感受

在进行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");
chown web_admin /www/web_dir/ -R  #web_dir为项目目录

如遇其它问题,欢迎再下面评论区交流^_^

添加新评论