1. 创建仓库, 在码云上创建自己的项目仓库
2. 创建公钥,因为我们通过公钥还实现代码的自动更新
一般我们WEB项目都是WWW用户权限,所以我们需要用WWW的身份云创建公钥,不然会在使用GIT时验证失败
2.1 切换到WWW用户
# su www
如果出现错误,就需要开启WWW用户登陆,(创建完公钥后记得把www修改回原来的权限,例如这里的/sbin/nologin)
# vi /etc/passwd
//进入编辑后,找到下面这行,把最后面的改为/bin/bash
例:www:x:1001:1001::/home/www:/sbin/nologin
www:x:1001:1001::/home/www:/bin/bash
2.2 用WWW身份创建公钥
# cd ~
# cd .ssh
# rm -rf ./*
# ssh-keygen -t rsa -C "xxx@xx.com"
//然后就是设置密码了,不设置就一直回车
//上面的命令分别是 1.进入用户目录。2.ssh目录。2.ssh目录下面的文件。3.创建公钥
//接着继续
# cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2E......H *********5@qq.com
//会输出你的公钥,复制到coding绑定公钥即可
这样我们公钥就添加好了
3. 拉取项目
3.1 复制git地址
3.2 拉取代码,进入的项目目录 (用WWW用户身份)
# cd /home/wwwroot/test.sld.com
# git clone git@gitee.com:xxxx/xxxx.git
3.3 修改.git文件夹为www用户组
# chown www:www -R .git
此时,我们项目就已经正常部署到服务器上了
提示:把www用户调整为不可登陆
# su root
# vi /etc/passwd
www:x:1001:1001::/home/www:/sbin/nologin
# 修改为nologin
4. 实现自动部署
4.1 指定 weebhook 推送地址
weebhook 码云上一个webhooks功能 ,可以让我们有修改代码时,发送一个请求到我们指定的地址。我们就通过它来实现自动部署
最后是这样的
4.2 编辑推送地址文件 bs.php
$git = "git"; //默认是用git全局变量,有的环境可能要指明具体安装路径
$branch = ""; //指定pull分支,为空就是默认分支
$logName = "git_data"; //本地日志名称,与当前php文件在同一目录
$savePath = "/home/wwwroot/test.sld.com/"; //网站根目录,初次克隆确保目录为空
$gitSSHPath = "git@gitee.com:***/**.git";//代码仓库SSH地址
$password = "deux.trois"; //在WebHooks设置的密码
$is_test = false;//测试模式,无需密码:true打开,平时false关闭
$isCloned = true;//设置是否已经Clone到本地,true:已经clone,直接pull,false:先clone.
//如果已经clone过,则直接拉去代码
if ($isCloned) {
$requestBody = file_get_contents("php://input");
if (empty($requestBody) && empty($is_test)) {
die('send fail');
}
//解析码云发过来的JSON信息
$content = json_decode($requestBody, true);
//若是主分支且提交数大于0
//密码要正确
if ($content['password'] == $password || !empty($is_test)) {
if ($content['total_commits_count'] > 0 || !empty($is_test)) {
if ($content['ref'] == "refs/heads/$branch" || !$branch || !empty($is_test)) {
$cmd = "cd $savePath && $git reset --hard && $git clean -f && $git pull $branch 2>&1";
$result = shell_exec($cmd); //关键命令,拉取代码,2>&1后台执行
$res_log = "[ PULL START ]" . PHP_EOL;
if (!empty($is_test)) {
$res_log .= date('Y-m-d H:i:s') . '执行测试!' . PHP_EOL;
} else {
$res_log .= date('Y-m-d H:i:s') . '向' . $content['repository']['name'] . '项目的' . $content['ref'] . '分支push了' . $content['total_commits_count'] . '个commit:' . PHP_EOL;
}
$res_log .= $cmd . PHP_EOL;
$res_log .= $result . PHP_EOL;
$res_log .= "[ PULL END ]" . PHP_EOL;
$res_log .= PHP_EOL . PHP_EOL;
file_put_contents($logName . ".log", $res_log, FILE_APPEND);//写入日志
echo $result;
}
}
} else {
file_put_contents($logName . ".log", '密码错误!', FILE_APPEND);
echo '密码错误!';
}
} else {
$res = "[ CLONE START ]" . PHP_EOL;
$res .= shell_exec("$git clone $gitSSHPath $savePath") . PHP_EOL;
$res .= "[ CLONE END ]" . PHP_EOL;
file_put_contents($logName . ".log", $res, FILE_APPEND);//写入日志
}
提示
1. 需要php开启shell_exec
2. shell_exec 执行命令时,如果命令是变量,会执行不成功,如果是直接的命令就没问题,不知道为什么
$cmd = "cd $savePath && $git reset --hard && $git clean -f && $git pull $branch 2>&1";
$result = shell_exec($cmd); // 执行不了
$result = shell_exec("cd /home/wwwroot/test.sld.com/ && git reset --hard && git clean -f && git pull 2>&1"); // 这样就没问题
最终我的bs.php只有如下代码,尴尬!!!
$result = shell_exec("cd /home/wwwroot/test.sld.com/ && git reset --hard && git clean -f && git pull 2>&1");
echo 'success';
到此,我们的就完成了自动部署的所有工作了。
我们可以在webhooks 上面查看我们的提送情况