shengmvvb

代码自动部署到服务器

今天我要介绍一下自己平时包括在工作中使用的部署项目的方式,虽然可能不是很好的方案,但是还是记录一下。

前情提要

今天在这里主要介绍的是使用git加上代码托管平台(ps.以下以gitlab为例,其他平台也是大同小异的) 来方便简洁的部署我们的代码到服务器上。

服务器配置git

首先我们需要在我们要发布代码的服务器上配置好git,不熟悉git的话可以先去廖雪峰老师的网站上看一下git的教程 传送门

首先给服务器安装git

1
$ yum install git

配置你的用户名和密码

1
2
$ git config --global user.name "youremail"
$ git config --global user.email "youremail@gmail.com"

然后需要配置git-ssh key用于同步gitlab中的代码

1
$ ssh-keygen -t rsa -C "youremail@example.com"

此时将你的ssh-key加入到gitlab SSH Keys中

执行脚本的编写

git的配置已经完成,接下里你已经可以使用git clone 、git pull等方式将远程仓库中的代码同步到你的服务器上,但是这样的话每次你在本地修改了代码并上传到gitlab上之后,你都需要登录服务器然后使用git pull命令拉取代码。所以,我们这里编写一个自动脚本来帮助你干这件事,达到自动部署的效果。

1
$ vim git_update.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/bash
while true
do
current_date=`date ""+%Y%m%d`
todaylog="/data/logs/git/git-${current_date}.log"
WEB_PATH='/data/www' # 项目存放目录
WEB_USER='www' # 项目所属用户
WEB_USERGROUP='www' # 项目所属组
pro='project_name'
if [ ! -d $WEB_PATH/$pro ]
then
su $WEB_USER -c "cd $WEB_PATH/ ; git clone 'your git address'"
fi
echo "[$pro] pulling source code..." >>${todaylog}
cd $WEB_PATH/${pro}
su -s /bin/bash $WEB_USER -c "git checkout master" # 此处可修改为其他分支,服务器将会同步这里填写分支上的代码
su -s /bin/bash $WEB_USER -c "git clean -f"
su -s /bin/bash $WEB_USER -c "git pull" >>${todaylog}
su -s /bin/bash $WEB_USER -c "git checkout master" # 同上
echo "Finished..." >>${todaylog}
sleep 10 # 设置拉取代码时间间隔为10秒
done

给脚本权限

1
$ chmod +x git_update.sh

最后后台运行脚本

1
$ nohub sh git_update.sh &

注意点

项目运行的所属用户

一般来说,我们在服务器上配置web服务器时不会使用root用户,而是使用类似于www之类的新建用户组,如果我们直接在脚本中使用root用户 clone/pull 代码,会发现代码所属的用户组是root,然后就会出现web服务器无法执行代码的情况(因为权限不足),所以我们之前配置git用户和邮箱以及ssh-key的时候需要使用www用户组执行这些操作,最后在同步脚本中也需要加上类似注释中的方法,使用www用户组执行clone/pull方法

给予git最小权限

我们配置完git ssh-key之后需要加入gitlab的ssh-key库中,才可以正常执行git操作。但是我们并不需要服务器进行类似于push之类的操作,否则万一服务器被劫持,可能我们连远程仓库中的源代码都无法保住。所幸,gitlab之类的平台都推出了deploy-key,把我们的ssh-key配置到这个地方,我们就会发现我们只能使用clone/pull之类的拉取操作

总结

之前上面的方案已经可以正常的自动部署我们的代码到我们的服务器上了,每次你在本地修改代码之后只要提交/合并你的代码到gitlab-master分支上,服务器将会自动同步gitlab上最新的代码

瞎折腾

总结有时候并不是完结,也许只是一个新的开始 —– 尼古拉斯·大帅比😄

…. to be continue