如何使用git管理已部署项目代码

  • 2017-07-22
  • koko
  • git

(本文首发于 koko.vc)

本教程是为了指导小伙伴们从0开始使用git来管理已部署到生产环境中的应用代码。从一人管理多套应用升级为多人管理一套应用,以达到简化应用运维工作的目的。

安装git

本地、远程git服务器、应用生产环境均需要安装git

git安装指南 https://git-scm.com/book/zh/v1/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git

下载源码

首先将生产环境中的全部源码下载到本地

例:我将生产环境中的全部文件下载到本地目录apache-tomcat-koko

初始化本地git目录

在linux下直接cd到apache-tomcat-koko目录

在windwos下,打开apache-tomcat-koko文件夹,鼠标右键点击文件夹空白处,在弹出的菜单中选择git bash here,打开git命令行窗口

输入命令git init,完成git初始化

输入命令git status 查询当前git状态,可以看到所有文件都是待添加状态。

梳理目录及文件

因为不是所有的目录及文件都需要使用git管理,所以在将文件纳入git仓库前需要梳理目录及文件

梳理目录

例:在此项目中有以下文件夹内容不需要纳入git仓库

/logs/		//日志目录
/temp/		//临时目录
/work/		//缓存目录
/webapps/ROOT/lucene/		//缓存目录

注意,虽然这些目录不需要纳入git仓库管理,但也不是直接删除就行。原因有二:

其一:有些目录系统不会自动生成,删除后应用将不能正常运行。

其二:有的目录系统会自动生成,服务器上生成后,git会提示这些文件夹待处理(虽不影响应用工作,但一看到git清单中有那么多待添加的文件的就不爽)

解决方法: 使用.gitignore文件来让git忽略不需要管理的文件。

这个文件的作用就是告诉Git哪些文件不需要添加到版本管理中。这个文件的完整文件名就是.gitignore,注意最前面有个.。 这样没有扩展名的文件在Windows下不太好创建。

创建方法一: 创建一个文件,文件名为:.gitignore.,注意前后都有一个点。保存之后系统会自动重命名为.gitignore

创建方法二:在cmd命令行中(或者git命令行中)执行 touch .gitignore 创建该文件。

我的.gitignore文件内容如下:

#tomcat缓存
/work
#临时文件
/temp
#日志文件
/logs
#打印内容生成路径
/webapps/ROOT/assets/print/
#用户信息缓存 
/webapps/ROOT/lucene/

添加文件.gitignore后,再执行git status看下变化

可以看到 logs/temp/work/ 几个文件夹从待添加的列表中消失了。

因为将 logs/temp/work/ 文件夹下的内容全部过滤了,对git来说这几个文件夹算是空文件夹。 而git默认不会将空文件夹添加到仓库中。 这相当于直接把文件夹直接删除了。

解决办法之一 分别在 logs/temp/work/ 下再添加一个.gitignore文件,内容不限,目的是要这个文件。

然后执行git add –f logs/.gitignore temp/.gitignore work/.gitignore 强制添加文件到git仓库。

再看git status,这几个目录就已经添加到git仓库了。

梳理文件

如果应用有部署到多个生产环境,每个环境下的配置文件可能不一样,比如应用名称、数据库配置等个性化配置。 如果直接把个性化配置文件纳入git仓库,会导致所有生产环境中个性化配置被覆盖,所以需要预先处理下个性化配置文件。 如果没此需求,可跳过此步。

刚好我这套代码有部署到多个服务器,每个服务器上配置文件并不完全相同。

我处理方法是将个性化配置文件改为模板文件纳入git仓库,并忽略配置文件本身

例:假如配置文件server.xml是一个个性化配置文件.首先在文件.gitignore中添加内容server.xml,让git忽略server.xml; 然后复制配置文件server.xml并重命名为server.xml.template,当作一个模板文件添加到git仓库; 在部署时将模板文件修改成配置文件(将server.xml.template重命名为server.xml),并修改配置内容后使用。这样后期使用git更新源码时不会覆盖掉个性化配置。

我在该项目中共遇到以下这些个性化配置文件:

    bin/catalina.sh	
    conf/server.xml	
    webapps/ROOT/WEB-INF/classes/config/jcache.properties	
    webapps/ROOT/WEB-INF/classes/config/jservice.properties	
    webapps/ROOT/WEB-INF/classes/datasource.properties	
    webapps/ROOT/WEB-INF/classes/exchangedatasource.properties	
    webapps/ROOT/WEB-INF/classes/log4j.properties	
    webapps/ROOT/WEB-INF/classes/spring/service-consumerContext.xml	
    webapps/ROOT/WEB-INF/classes/sso.properties	
    webapps/ROOT/WEB-INF/web.xml	

将本地源码添加到本地git仓库

git add .将所有文件添加到本地有变化文件列表中

git commit -m "初始化应用代码"将有变化的文件提交到本地仓库.参数-m "xxx"是填写本次提交的备注信息.

git status,文件添加到本地仓库以后再查询git状态,可以看到当前工作区已清空,没有待处理文件.

初始化远程git仓库及生产环境中的git目录

在git服务器上初始化git仓库目录

例:服务器类型linux;ip:10.11.1.23;仓库路径:/opt/git/koko.vc;

cd /opt/git/koko.vc 切换到koko.vc目录,没有请新建;

git --bare init 初始化git仓库目录;与本地初始化不同,这里添加了参数--bare;可以看到与本地初始化时仅生成一个.git文件夹不同,服务器端生成了更多的文件夹.

关联本地仓库与远程仓库

在本地git目录下执行 git remote add server root@10.10.1.23:/opt/git/koko.vc 添加远程仓库,server是我自定义的远程服务器名称; 使用root账户登录服务器;服务器地址是10.10.1.23;git仓库路径是/opt/git/koko.vc`;

git push master server将本地代码推送到git服务器.master是本地git默认的分支名称;server刚才添加的远程服务器名称; 第一次连接服务器时会提示是否信任服务器.按提示输入服务器root密码.

输入正确的密码后,git开始上传代码

应用服务器与远程仓库

在生产环境中初始化git目录

建议新建目录测试通过后再替换原应用,而不是直接在原有目录上更新。

例:原有目录是apache-tomcat-koko,现在新建目录apache-atomcat-koko1;

cd /apache-tomcat-koko1

git init

git remote add server root@10.10.1.23:/opt/git/koko.vc

git pull master server 输入密码后下载git服务器中的代码

下载完成之后,可以看到,本地提交的代码已全部通过git同步到生产环境中.

如果之前有处理过个性化配置文件,那现在将该文件还原.

例将server.xml.template 复制并重命名为 server.xml

#cp server.xml.template server.xml

完成个性化配置文件修改,然后就可以启动应用测试是否正常工作.

注意 如果测试应用与正式应用部署在同一服务器,请修改测试应用端口,避免端口冲突.

到此就已达到使用git来管理已部署项的目的.在掌握此方法后就可以去尝试使用git自动部署项目代码啦.

(本文首发于 koko.vc)

评论