提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
阿里云服务器(Ubuntu 18.04.4 LTS),自己搭建个网站(Koa),通过git代码提交实现自动发布。
一、准备仓库
1、创建git账号
用于提交代码,不设置密码,仅接受密钥方式登录。
设置环境变量GIT_ROOT作为git仓库的根目录,所有仓库都在${GIT_ROOT}
文件夹下,并在此处建立一个空的文件夹${GIT_ROOT}/trigers
用于接收代码仓库更新信号。
2、安装git
3、创建仓库
环境变量PROJECT_NAME作为要新建的仓库名称
# 以git用户的身份
su - git
export PROJECT_NAME=abc.xyz.com
mkdir -p ${GIT_ROOT}/${PROJECT_NAME}.git
(cd ${GIT_ROOT}/${PROJECT_NAME}.git && git init --bare)
二、自动化
1、为仓库添加钩子,当仓库有代码提交时写更新信号
# 创建文件夹——信号存储位置
mkdir -p ${GIT_ROOT}/trigers
#
hook=${GIT_ROOT}/${PROJECT_NAME}.git/hooks/post-update
grep '^#' ${hook}.sample > ${hook}
echo "exec touch ${GIT_ROOT}/trigers/${PROJECT_NAME}.updated" >> ${hook}
2、准备仓库变更处理的定时任务
任务处理脚本:
#!/bin/bash
# -*- coding: utf-8 -*-
# file:/home/git/bin/update.sh
# 更新服务器
# By HanYZ
# 2020-08-26
# 本文件所在文件夹的上一级
# ROOT=$(dirname $(cd $(dirname $0); pwd))
BAK=${HOME}/bakup
TRIGERS=${GIT_ROOT}/trigers
CODE=${HOME}/code
mkdir -p ${BAK}
echo $(date +%Y%m%d%H%M) 开始处理......
# 每个更新标志
for fullname in $(find ${TRIGERS} -type f -name '*.updated'); do
# 文件名
filename=$(basename $fullname)
# 仓库对应的文件夹名称
name=${filename%.*}
if [ -d ${CODE}/${name}/.git ]; then
# 代码更新
(cd ${CODE}/${name} && git pull && [ -e package.json ] && npm install && (npm run build))
# 若有不同的文件夹需要发布,在此处添加
case $name in
"compound")
# 设置发布目标文件夹
dist=${HOME}/publish/${name}
# 检测编译结果,备份之前版本并发布新版本
[ -e ${CODE}/${name}/dist ] && mv $dist ${BAK}/$(date +%Y%m%d%H%M) && mv ${CODE}/${name}/dist ${dist}
;;
esac
# 清除代码更新标识
rm -rf ${fullname}
fi
done
echo $(date +%Y%m%d%H%M) 处理完成......
echo
定时任务
crontab -e
添加如下行
*/10 * * * * /home/git/bin/update.sh>>/home/git/log/job.log
总结
利用git的hook在接收到提交后写一个信号,定时任务根据信号进行更新处理。