我的环境
2台机器 git服务器 web服务器
-----------------------------------------
git 服务器上的操作
-----------------------------------------
创建git用户,确认gogs或者gitlab是git用户的进程
生成密钥对(注意切换到git用户下)
ssh-keygen -t rsa
完成之后把公钥写入 web服务器的www用户下的.ssh目录里的authorized_keys文件里,让git用户可以无密码访问web服务器
创建git钩子
进入git 的项目目录
cd /data/git/gogs-repositories/root/test.git
ls hooks/
applypatch-msg.sample commit-msg.sample post-receive post-update.sample pre-applypatch.sample pre-commit.sample pre-push.sample pre-rebase.sample prepare-commit-msg.sample update update.sample
编辑post-receive
cat post-receive
#!/bin/sh
#
# 读取标准输入
read refname
branch="${refname##*/}" 标准的git变量
# 网站地址及网站目录
username="www" 我们需要SSH的用户
Hosts="10.135.129.252" 我们需要SSH的主机IP
Website="test" 我们的项目名字,也就是网站的目录名,仅仅是个目录,绝对路径在WEB服务器上进行配置
# master分支更新线上环境
for Host in ${Hosts}
do
if [ "$branch" = "master" ]; then
echo -e "start host: \033[33m${Host}\033[0m"
ssh ${username}@${Host} "${Website}" 这里的website变量是我们SSH带的参数
echo -e "end host: \033[33m${Host}\033[0m"
fi
-----------------------------------
web服务器
-----------------------------------
创建www用户作为网站目录的属主
生成密钥对,把公钥输入到git里,你知道的。这让我们可以直接利用ssh来操作项目,比如clone和pull
到www的.ssh目录下创建一个脚本
wrapper.sh
ls
authorized_keys id_rsa id_rsa.pub known_hosts wrapper.sh
pwd
/home/www/.ssh
cat wrapper.sh
#!/bin/bash
#define website root
documentroot=/data/www 网站根目录路径
#get git hook args
args="$SSH_ORIGINAL_COMMAND" SSH传递过来的参数
[ -z "$args" ] && echo "args is none" && exit
updatesite(){
[ "$#" -ne 1 ] && echo "error args num" && exit
local www="$1"
local wwwroot=${documentroot}/$www 定义网站根目录的绝对路径
[ ! -d "${wwwroot}" ] && echo -e "no such file or directory $wwwroot" && exit
cd $wwwroot && git pull 用git pull进行操作
}
echo -e "updatesite: \033[32m$args\033[0m"
updatesite "$args"
查看git服务器在公钥
command="~/.ssh/wrapper.sh",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDt4oaQmnPP/v49+Wq3v6aIp2oee+9oruUwdHGvxqJ8BdUZv9Ok67jYoirOzY2kufBdnQcjvZReNr1ohR0w41rELDWQAXaRQG2TRtngag8IaMT2aRw/7QqHJ3kGnTp5q6jruqonjEBgrDJ+K5SjvNNonBnLbEjgrG79C7Yg2lC0f1+6/P9DcWEsR/CzYVJ5Wy+A9aj6kBW8M+ykTtmqjLWKVqz9UKaNPHteQk7lkIjThJym1NsD+t+tb1V2M2qfMuR8l6q3KRlTeXV5lYxH88vQIJQL0OwFHoGGf6pNXOk+XfJakgnN1KFO540U5C2yx2gfYYPQJ7XFVukwWz29Cjw/ git@git-server
可以看到我们在这里定义一个command的权限,意思就是只要是SSH带参数过来的 只能走这里,安全第一
cd /data/www/
git clone xxxx clone好你的项目,
tree
.
|-- test
`-- test1
到这里,基本配置已经差不多完成了
我们来测试一下
--------------------------
测试
--------------------------
登陆到git服务器
切换到git用户下
ssh www@192.168.1.1 test
updatesite: test
Already up-to-date
可以看到 我们的wrapper脚本已经执行了,
随意用git客户端进行push吧,这套基于git 钩子的自动部署就完成了