Git + Docker 多环境自动化部署

威尔we 等级 382 0 1

日常项目开发过程中,一般都有多套环境,比如开发、测试和生产。各个环境部署的代码版本不一致,手动一个个来部署效率低且容易出错。如果项目采用了敏捷开发方式,可能每天需要部署几十次。手动方式更加不可行,因此必须要把多环境的部署工作自动化。本文将介绍在笔者参与项目中实际推行的一种方案,供大家参考。

整体方案

Git + Docker 多环境自动化部署

当开发人员 push 代码到 develop、release 和 master 分支时将自动触发构建 Docker 镜像,然后部署到分支对应的开发环境。

Git 分支模型

每套环境部署的代码版本都不一样,还在开发中的功能只能部署到开发环境,已经开发完成的功能可以部署到测试环境,测试通过的功能才能部署到生产环境。依托于 Git 强大的分支功能,我们可以轻松地为每个环境维护一个分支,适当的时候在分支之间进行代码的合并。但分支多了容易混乱,开发人员可能搞不清什么时候应该提交到哪个分支。所以团队里需要制定一个分支管理规范,或者说确定一个分支模型。

Git + Docker 多环境自动化部署

上图是 Git-flow 的分支模型。图中 develop 和 master 为长线分支,feature、release 和 hotfix 为短线分支。develop、release 和 master 分别部署到开发环境、测试环境和生产环境。develop 分支用来汇总下个版本功能的提交,在下个版本的 release 分支创建之前不允许提交非下个版本的功能到 develop 分支。当下个版本的所有功能开发完成后,从 develop 分支创建下个版本的 release 分支来测试,测试过程中 bug 修复需要提交到该 release 分支。测试完成后,将 release 分支合并到 master 分支去上线,同时还要把 release 分支上的 bug 修复合并回 develop 分支,最后删除 release 分支。

Git-flow 的安装请参考官方文档,安装完成后会给 git 命令增加一个子命令 flow,使用这个子命令可以简化分支操作。

初始化

为了能在 Git 项目里使用 git flow 命令,需要先初始化 Git-flow。

> git flow init
Initialized empty Git repository in /Users/jagger/tmp/git-flow/.git/
No branches exist yet. Base branches must be created now.
Branch name for production releases: [master]
Branch name for "next release" development: [develop]

How to name your supporting branch prefixes?
Feature branches? [feature/]
Release branches? [release/]
Hotfix branches? [hotfix/]
Support branches? [support/]
Version tag prefix? [] 

所有需要输入的地方直接回车,使用默认值就可以。

开发

对新功能的开发,如果功能较大建议创建一个 feature 分支来进行,小的话就直接在 develop 分支上进行。当 feature 分支功能开发完成后,合并到 develop 分支,然后删除该 feature 分支。

> git flow feature start rss-feed
Switched to a new branch 'feature/rss-feed'

Summary of actions:
- A new branch 'feature/rss-feed' was created, based on 'develop'
- You are now on branch 'feature/rss-feed'

Now, start committing on your feature. When done, use:

     git flow feature finish rss-feed

> git flow feature finish rss-feed
Switched to branch 'develop'
Already up-to-date.
Deleted branch feature/rss-feed (was 810a2a4).

Summary of actions:
- The feature branch 'feature/rss-feed' was merged into 'develop'
- Feature branch 'feature/rss-feed' has been removed
- You are now on branch 'develop' 

通过简单的 git flow feature startgit flow feature finish 两条指令就能完成上述工作。

测试

当下个版本的功能都已开发完成,就可以从 develop 分支创建下个版本的 release 分支来测试。测试过程中的 bug 修复需要提交到该 release 分支。

> git flow release start 2.0
Switched to a new branch 'release/2.0'

Summary of actions:
- A new branch 'release/2.0' was created, based on 'develop'
- You are now on branch 'release/2.0'

Follow-up actions:
- Bump the version number now!
- Start committing last-minute fixes in preparing your release
- When done, run:

     git flow release finish '2.0' 

发布

测试通过后,合并 release 分支到 master 和 develop 分支,然后删除 release 分支。

> git flow release finish 2.0
Switched to branch 'master'
Deleted branch release/2.0 (was 810a2a4).

Summary of actions:
- Latest objects have been fetched from 'origin'
- Release branch has been merged into 'master'
- The release was tagged '2.0'
- Release branch has been back-merged into 'develop'
- Release branch 'release/2.0' has been deleted 

Docker 自动化部署

各个环境的分支代码都有了,但怎么快速可靠地把分支代码部署到对应环境了?使用 Docker 可以大大简化部署的复杂性,因为它解决了应用对系统环境的依赖问题,使得应用部署变成了一项十分简单的工作。借助于 GitLab Webhook 和 容器编排服务,可以实现当分支代码有 push 的时候,自动把该分支代码部署到对应环境。

这里以 DaoCloud 容器编排服务为例来讲解。当然大家可以选择任意其它第三方或自己搭建的容器编排服务,操作方式都类似。

创建项目

一个项目对应一个 Git 仓库,项目存在的目的是为了构建和部署应用镜像。DaoCloud 除了支持 GitHub、Bitbucket 这类公有服务,自己搭建的 GitLab 服务也支持。

Git + Docker 多环境自动化部署

每次分支代码有 push 的时候,都会触发构建镜像。

Git + Docker 多环境自动化部署

通过流程定义来配置要执行的操作和顺序,一般按照“测试 => 构建 => 部署”这样的流程。每个操作都可以单独配置触发条件,比如 push 到指定分支。

创建主机集群

主机集群由安装了 Docker Engine 的多台服务器构成,通过在服务器上安装 DaoCloud Monitor 来把它加入到某个主机集群。部署应用时需指定用来运行应用的主机集群,或者集群里的某台服务器。

Git + Docker 多环境自动化部署

上面的 dev 集群只包含一台本地的 MacBook Pro。

编排应用

编排应用就是把应用编制排放到主机集群上去运行。大多数时候应用都依赖其它后端服务,比如 MySQL、Redis 等,启动应用时需要把它们一起启动起来,并且相互之间可互相访问。这样的一组应用在 Docker Compose 里称为 Stack。

下面我们创建了三个开发环境的 Stack,分别为应用服务 Stack zqc-dev,数据库服务 Stack db-dev,缓存服务 cache-dev。之所以不把数据库和缓存服务跟应用服务放在一个 Stack 里,是因为数据库和缓存服务属于公共服务,会被多个应用服务共享,放在某个应用服务里不合适。

Docker Compose 会为每个 Stack 创建一个默认的网络,以便 Stack 里的各个服务之间可以互相访问。那么 Stack 之间了?zqc-dev 需要访问 db-dev 里的数据库服务和 cache-dev 里的缓存服务。很简单,只要把 zqc-dev 里的应用服务加入到 db-dev 和 cache-dev 的网络里就可以了。具体可参考下面的应用服务 Docker Compose 配置文件。

Git + Docker 多环境自动化部署

应用服务 Stack。

version: '2'
services:
  zqc-server:
    image: daocloud.io/jaggerwang/zqc-server:develop-6be5996
    environment:
      ZQC_DIR_DATA: /data
      ZQC_SERVER_DEBUG: 'true'
      ZQC_SESSION_SECRETKEY: xxxxxxxx
      ZQC_LOG_LEVEL: debug
      ZQC_MONGODB_ZQC_ADDRS: mongo:27017
      ZQC_REDIS_ZQC_ADDRESS: redis:6379
      ZQC_REDIS_ZQC_DB: 1
      ZQC_STORAGE_BUCKETS_ZQC_ENDPOINT: oss-cn-shanghai.aliyuncs.com
    ports:
    - 10200:1323
    volumes:
    - /Users/jagger/data/zqc/server:/data
    networks:
    - db-dev
    - cache-dev
networks:
  db-dev:
    external:
      name: db-dev_default
  cache-dev:
    external:
      name: cache-dev_default 

应用服务 Docker Compose 配置文件。

Git + Docker 多环境自动化部署

数据库服务 Stack。

version: '2'
services:
  mysql:
    image: index.docker.io/library/mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: xxxxxxxx
    ports:
    - 10000:3306
    volumes:
    - /Users/jagger/data/db/mysql:/var/lib/mysql
  mongo:
    image: index.docker.io/library/mongo:3.4
    ports:
    - 10001:27017
    volumes:
    - /Users/jagger/data/db/mongodb:/data/db 

数据库服务 Docker Compose 配置文件。

Git + Docker 多环境自动化部署

缓存服务 Stack。

version: '2'
services:
  redis:
    image: redis:4.0
    command:
    - redis-server
    - --appendonly
    - 'yes'
    ports:
    - 10010:6379
    volumes:
    - /Users/jagger/data/cache/redis:/data 

缓存服务 Docker Compose 配置文件。

参考资料

  1. Git-flow
  2. Docker Compose

本文转自 https://blog.jaggerwang.net/git-docker-multiple-env-deploy/,如有侵权,请联系删除。

收藏
评论区

相关推荐

git常见用法和核心策略
版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。 (http://build800.com/2018/02/12/gitStudy/%E7%A8%8B%E5%BA%8F%E5%91%98
golang 不翻墙安装golang.org/x/net
下载安装golang.org/x/net其实网上有很多的文章,但总的归来是有两种: 方法一: 为了使包的导入方式不变,我们需要在src目录下面构造目录结构 $mkdir p $GOPATH/src/golang.org/x/ $cd $GOPATH/src/golang.org/x/ $git clone https://git
快速实现在linux系统上安装Git
一.git介绍 Git 是用于 Linux内核开发的版本控制工具。与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持(wingeddevil注:这得分是用什么样的服务端,使用http协议或者git协议等不太一样。并且在push和pull的时候和服务器端还是有交互的。),使源代码的发布和交流极其方便
git常用命令
关注公众号QXF069 克隆版本:git clone  path路径 <directory  若默认则是文件的名字。 查看远程版本库的地址   git remote v | verbose 将本地版本库和远程URL关联起来 git remote add t branch <name(origin) <Repository U
Git + Docker 多环境自动化部署
日常项目开发过程中,一般都有多套环境,比如开发、测试和生产。各个环境部署的代码版本不一致,手动一个个来部署效率低且容易出错。如果项目采用了敏捷开发方式,可能每天需要部署几十次。手动方式更加不可行,因此必须要把多环境的部署工作自动化。本文将介绍在笔者参与项目中实际推行的一种方案,供大家参考。 整体方案 整体方案(https://imghe
Virtual DOM 的原理与实现
只贴代码 不解释过程 勿喷 ; 环境搭建1.克隆$ git clone https://github.com/cvgellhorn/webpackboilerplate.git$ npm install $ npm install @babel/plugintransformreactjsx savedev2.配
docker入门基本命令
docker基础命令 docker images 查看镜像列表 docker ps a 查看所有docker容器 ,a 指的是所有包括以关闭的容器 docker rm 655e69 删除容器,655e69 指的是容器Id docker rmi nginx:latest 删除镜像 ,:latest为制定版本 docker pull ngin
多人协作必备技能Git
<section id"nice" datatool"mdnice编辑器" datawebsite"https://www.mdnice.com" style"fontsize: 16px; color: black; padding: 0 10px; lineheight: 1.6; wordspacing: 0px; lettersp
容器DevOps,原来如此简单
当开发团队把代码提交到 Git 应用仓库的那一刻,他们心里在想什么?祈祷没有bug?渴望回家补觉?产品经理Go Die?对,也不对。因为这只是最终发布万里长征的一小步,接下来要面对测试环境、生产环境、客户环境,我这明明没问题到你那就崩的环境……其实,对开发和运维人员来说,心里最想的是一次创建或配置,可以在任意地方正常运行。据扯,2017年程序员们最痛恨的一首
聊聊golang的DDD项目结构
序本文主要研究一下golang的DDD项目结构interfacesfoodappserver/interfacesinterfaces git:(master) tree.|____fileupload| |____fileformat.go| |____fileupload.go|____food_handler.go|__
GIT常用命令
1、初始化本地Git存储库 language git init2、创建远程存储库的本地副本 language git clone ssh://git@github.com/[username]/[repositoryname].git3、检查状态 language git status4、将文件添加到暂存区 language git add [fil
Git基础命令教程
Git学习 git 之前,我们需要先明白一个概念,版本控制! 版本控制 什么是版本控制版本控制(Revision control)是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术。 实现跨区域多人协同开发 追踪和记载一个或者多个文件的历史记录 组织和保护你的源代码和文档 统计工作量
最方便的git教程使用大全,让你玩转git!!!
本篇是介绍廖雪峰老师官方网站中Git教程的学习笔记我感觉可以学到很多东西,可以使你简单上手,也可以供你复习时候使用。每个开发都可以从master上克隆一个本地版本库,就算没有网络,也可以提交代码到本地仓库、查看log、创建项目分支等等每个版本库都可以创建无限个分支,分支是个完整的目录,且这个目录拥有完整的实际文件 一、安装网上搜一下安装教程,这里就不介绍了安
git 本地代码提交到远程仓库
git 将本地代码添加到远程仓库 1. 本地初始化使用git init进行初始化可以使用ls a就可以看到.git文件 2.创建远程仓库点击复制仓库地址 3. 连接远程仓库shell git remote add origin https://gitee.com/test/test.git 4. 将远程仓库的文件pull到本地git pull rebase
git基本操作
一、Git下载安装1、git官网:https://gitscm.com/2、官网下载较慢也可以去找国内镜像:https://npm.taobao.org/mirrors/gitforwindows/3、安装完成后鼠标右键出现以下标志代表安装完成:二、git上传代码到远程仓库(以coding为例)1、在磁盘本地创建一个git仓库,如下图创建一个文件夹gitcs