基于git hook的自动化部署

为什么80%的码农都做不了架构师?>>>   hot3.png

我的环境

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 [email protected] test
updatesite: test
Already up-to-date

可以看到 我们的wrapper脚本已经执行了,

 

随意用git客户端进行push吧,这套基于git 钩子的自动部署就完成了

转载于:https://my.oschina.net/jastme/blog/997814

你可能感兴趣的:(git,运维)