运用京东云代码托管、云编译、云部署等产品进行蓝绿部署简单实践


前几天我们以一种较为传统的方式在京东云上简单实践了基于Jenkins+Docker+Git 的CI流程,主要利用一些开源技术来实现,今天我们运用在京东云的3款开发者工具来简单实践下蓝绿部署。


一、操作说明

1.产品与概念了解

代码托管:
基于Git的代码托管工具,用户可将代码托管到京东云中。产品包含代码提交、存储、下载、分支管理与对比、合并、历史等功能,为京东云持续交付全流程提供源代码托管服务。

云编译:
云编译服务为开发者提供基于容器的自动化持续集成服务。支持多语言构建环境,构建产出支持包/镜像,查看构建结果及日志。编译构建实现容器化隔离,支持自定义构建容器,为产品的持续集成提供上游基础服务,提升研发效率。

云部署:
云部署是集多种部署类型、部署方式于一身的强大部署工具。使用云部署,您可以轻松的将程序包部署到京东云主机中。同时,支持多种部署策略与部署配置,灵活可调配。与负载均衡、高可用组等产品相联动,实现云端部署。

京东云云部署-蓝绿部署:
蓝绿部署,是一种先对部署组中未承接流量的分组(蓝组或绿组)内的云主机进行新版本部署,再通过切换路由的方式实现版本更替的部署方式。
具体来说:

image

1)在上线前,仅蓝组或绿组中的一组(比如蓝组),通过负载均衡,承接流量,对外提供服务。
2)开始部署,对未承接流量的组(比如绿组)进行新版本的部署。此时,蓝组仍然继续提供服务。
3)当绿组部署完毕,将绿组主机注册到指定负载均衡后端服务所关联的虚拟服务器组列表中,此虚拟服务器组为自动新建。
与此同时,将蓝组所在的负载均衡虚拟服务器组删除。蓝组不再提供服务,绿组提供服务。

详细介绍请参考:

https://docs.jdcloud.com/cn/codedeploy/deployment-type

2.文档操作说明

下面以将代码托管中的源代码,经过云编译,生成程序包,然后使用云部署产品蓝绿部署到云主机中为例,列举出基本服务,以帮助快速入门。

基本操作流程如下:

1)将提供的示例代码下载到本地进行编辑后上传到京东云代码托管仓库;

2)在云编译中,对代码托管的示例源代码进行编译构建,生成程序包;

2)然后使用云部署,将程序包部署到云主机中;

3)使用负载均衡的公网IP加端口,可访问示例代码

文档操作示例图

image

二、准备工作

1.新建云主机

在地域:华北-北京,新建2台云主机,具体信息如下:

创建方式:自定义创建
镜像:官方 CentOS CentOS 7.4 64位
规格:通用型 2c4g
存储:默认选项
网络:选择已有的私有网络及子网、选择默认安全组开发全部端口
基本信息:填写主机名、密码。这里填写主机名为:devops-ecs-hcc01/02

image

更改主机名:
主机①


1[root@113 ~]# hostnamectl set-hostname devops-ecs-hcc01
2[root@113 ~]# hostname devops-ecs-hcc01
3[root@113 ~]# logout
4[root@devops-ecs-hcc01 ~]# 

主机②


1[root@112 ~]# hostnamectl set-hostname devops-ecs-hcc02
2[root@112 ~]# hostname devops-ecs-hcc02
3[root@112 ~]# logout
4[root@devops-ecs-hcc02 ~]# 

安装Agent:

其他地域云主机安装方法参考:https://docs.jdcloud.com/cn/devops/install-agent


1#华北-北京    
2wget -c http://devops-hb.s3.cn-north-1.jcloudcs.com/ifrit/ifrit-agent-external-v0.01.448.0742c84.20190327191802.bin -O installer && sh installer -- -a zero-agent,hawkeye-agent,log-agent,ark-query /usr/local/share/jcloud/ifrit && rm -f installer

执行结果如下:

image

2.新建负载均衡实例及监听器

在地域:华北-北京,新建负载均衡实例,具体信息如下:

地域:华北-北京 
可用区:可用区A 
私有网络:请选择与云主机一致的私有网络 
带宽:1Mbps
名称:devops-slb-hcc

接下来,在此负载均衡实例中,新建监听器,点击“添加监听”,进入到新建监听器页面。

image

image

具体信息如下:

监听协议[端口]:Http 80
空闲链接超时:60
默认后端服务:新建后端服务
后端服务名称:devops-slb-backend-hcc
端口:9011
调度算法:加权轮询
健康检查方式:HTTP

3.上传示例代码至代码托管

如下操作是将此示例代码放到代码托管产品中,代码示例地址为:https://code.jdcloud.com/devops-demo/java-demo.git

新建私有项目

第一步:创建项目,代码托管地址:https://code.jdcloud.com/

image

输入项目名称,点击Create project

image

image

创建完成后,我们能看到一些命令行介绍提示

image

配置SSH密钥

创建项目完成后,我们从提示可以看到提供两种pull或push方式,分别为SSH和HTTPS,我这里选择用SSH

image

第一步:任选一台咱们刚开始创建的云主机,在云主机上进行SSH密钥生成


 1[root@devops-ecs-hcc01 ~]# yum install git -y
 2[root@devops-ecs-hcc01 ~]# git config --global user.name "hanchaochao"
 3[root@devops-ecs-hcc01 ~]# git config --global user.email "hanchaochao5@jd.com"
 4[root@devops-ecs-hcc01 ~]# ssh-keygen -t rsa -C "hanchaochao5@jd.com"
 5Generating public/private rsa key pair.
 6Enter file in which to save the key (/root/.ssh/id_rsa): 
 7Enter passphrase (empty for no passphrase): 
 8Enter same passphrase again: 
 9Your identification has been saved in /root/.ssh/id_rsa.
10Your public key has been saved in /root/.ssh/id_rsa.pub.
11The key fingerprint is:
12SHA256:z0TcCqkyplsxENQK/KJKSIK4NXJJzn9TnuhJpeZOuaQ hanchaochao5@jd.com
13The key's randomart image is:
14+---[RSA 2048]----+
15|..o.             |
16|.....    o .     |
17|o=oo    o o .    |
18|=oOo   .oo .     |
19|==.o* .*S.o      |
20|+. o.=B.o+       |
21|o . .*+o  o      |
22|.  o ++.         |
23|  . E.o          |
24+----[SHA256]-----+
25[root@devops-ecs-hcc01 ~]# cat .ssh/id_rsa.pub
26ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDFv6mC/EHXCIHTcwcn5DwSEGiy4m+x5hTmlrRZUfEmQWn8slyMWktyHOmXvKMI9I4Gr0WZuR+Yekq7vawF8kBAPhM1G97TuHmLRI......
27[root@devops-ecs-hcc01 ~]# 

image

第二步:

登录代码托管平台:https://code.jdcloud.com/,将生成的密钥公钥添加到代码托管里

image

image

image.gif

示例代码下载

真实情况如果您已经有现成代码,则跳过这一步直接按照代码上传步骤上传即可。

在上一步骤新建的云主机中进行如下操作


 1[root@devops-ecs-hcc01 ~]# mkdir test
 2[root@devops-ecs-hcc01 ~]# cd test/
 3[root@devops-ecs-hcc01 test]# git init
 4Initialized empty Git repository in /root/test/.git/
 5[root@devops-ecs-hcc01 test]# git clone https://code.jdcloud.com/devops-demo/java-demo.git
 6Cloning into 'java-demo'...
 7remote: Enumerating objects: 216, done.
 8remote: Counting objects: 100% (216/216), done.
 9remote: Compressing objects: 100% (171/171), done.
10remote: Total 216 (delta 39), reused 176 (delta 21)
11Receiving objects: 100% (216/216), 1.02 MiB | 0 bytes/s, done.
12Resolving deltas: 100% (39/39), done.
13[root@devops-ecs-hcc01 test]# ll
14total 0
15drwxr-xr-x 5 root root 126 Apr  9 15:34 java-demo
16[root@devops-ecs-hcc01 test]# 

image.gif

更改代码分支

执行如下命令,我们发现有两个分支,分别为devops-demo和master,而我们现在在devops-demo分支上,为方便后续蓝绿部署操作更直观,我们将此分支重命名为blue,并复制这个分支为green


 1[root@devops-ecs-hcc01 java-demo]# git branch
 2* devops-demo
 3  master
 4[root@devops-ecs-hcc01 java-demo]# git branch -m blue
 5[root@devops-ecs-hcc01 java-demo]# git branch
 6* blue
 7  master
 8[root@devops-ecs-hcc01 java-demo]# git branch green
 9[root@devops-ecs-hcc01 java-demo]# git branch
10* blue
11  green
12  master
13[root@devops-ecs-hcc01 java-demo]# 

image

示例代码上传

将下载到云主机的示例代码上传到我们自己的代码托管项目里


 1[root@devops-ecs-hcc01 test]# cd java-demo/
 2[root@devops-ecs-hcc01 java-demo]# git checkout blue
 3Already on 'blue'
 4[root@devops-ecs-hcc01 java-demo]# git remote rm origin
 5[root@devops-ecs-hcc01 java-demo]# git remote add origin git@code.jdcloud.com:jdc-12/java-demo-hcc.git         
 6[root@devops-ecs-hcc01 java-demo]# git add .
 7[root@devops-ecs-hcc01 java-demo]# git commit
 8# On branch blue
 9nothing to commit, working directory clean
10[root@devops-ecs-hcc01 java-demo]# git push --all -f
11Warning: Permanently added the ECDSA host key for IP address '116.196.123.158' to the list of known hosts.
12Counting objects: 216, done.
13Delta compression using up to 2 threads.
14Compressing objects: 100% (153/153), done.
15Writing objects: 100% (216/216), 1.02 MiB | 0 bytes/s, done.
16Total 216 (delta 39), reused 216 (delta 39)
17remote: Resolving deltas: 100% (39/39), done.
18remote: 
19remote: To create a merge request for blue, visit:
20remote:   https://code.jdcloud.com/jdc-12/java-demo-hcc/merge_requests/new?merge_request%5Bsource_branch%5D=blue
21remote: 
22remote: To create a merge request for green, visit:
23remote:   https://code.jdcloud.com/jdc-12/java-demo-hcc/merge_requests/new?merge_request%5Bsource_branch%5D=green
24remote: 
25To git@code.jdcloud.com:jdc-12/java-demo-hcc.git
26 * [new branch]      blue -> blue
27 * [new branch]      green -> green
28 * [new branch]      master -> master
29[root@devops-ecs-hcc01 java-demo]# 

image

回到代码托管控制台,我们发现我们的代码已经被上传到我们新建的项目中了,而且能看到两个分支,分别为bluegreen

image

三、开始编译

为便于效果展示,我们将蓝绿部署的显示页面更改下,分别对应git上不同的分支: 
** 更改地址:**
/src/main/resources/web/index.html
更改内容:
blue:Blue-Hello Devops!
green:Green-Hello Devops!
** blue分支更改步骤如下:**

image

image

green分支更改步骤如上。

image

在云编译中进行编译构建

在云编译中新建任务

image

如前面提到的,我们需要将代码的两个分支(bluegreen)分别编译成不同的包,然后再进行发布,这样的话更直观。

蓝部署****配置信息具体如下:

  • 任务名称:devops-ci-hcc-blue

  • 镜像来源:官方

  • 编译镜像:maven/maven3.6.0-jdk8

  • 代码源:京东云-代码托管

  • 仓库地址:请根据实际情况进行填写,例如jdc-12/java-demo-hcc(如果您代码托管操作正确,则在下拉框中便可看到)

  • 代码分支:蓝部署选择blue

  • 构建规范:插入构建命令

  • 构建命令:


 1---
 2# 设置环境变量
 3#envs:
 4#  - name: 'name1' 环境变量的名
 5#    value: 'value1' 环境变量的值
 6#  - name: 'name2' 用列表的方式设置多个值
 7#    value: 'value2'
 8
 9# 设置编译的命令
10#cmds: 
11#  - name: 'do make'  编译步骤名称
12#    cmd: 'make'      编译命令,默认 PATH 路径下执行,其他请写明绝对路径
13#  - name: 'do install'
14#    cmd: 'make install'
15cmds:
16  - name: 'chmod'
17    cmd: 'chmod a+x ./build.sh'
18  - name: 'demo'
19    cmd: './build.sh'
20
21# 编译产物存储目录, 必填项
22out_dir: 'output'

  • 构建类型:应用包

  • 存储空间:选择你创建的对象存储Bucket

  • 存储目录:这个是选填项,我这里填了devops-hcc

  • 超时:2小时

  • 计算规格:4GB,4vCPU

  • 通知频率:不发送

image.gif

image.gif

点击保存并构建

image.gif

至此,已将蓝部署示例代码编译成功,并上传到对象存储,华北-北京空间中。

image.gif

在云编译中新建任务

image.gif

绿部署****配置信息具体如下:

  • 任务名称:devops-ci-hcc-green

  • 镜像来源:官方

  • 编译镜像:maven/maven3.6.0-jdk8

  • 代码源:京东云-代码托管

  • 仓库地址:请根据实际情况进行填写,例如jdc-12/java-demo-hcc(如果您代码托管操作正确,则在下拉框中便可看到)

  • 代码分支:绿部署选择green

  • 构建规范:插入构建命令

  • 构建命令:


 1---
 2# 设置环境变量
 3#envs:
 4#  - name: 'name1' 环境变量的名
 5#    value: 'value1' 环境变量的值
 6#  - name: 'name2' 用列表的方式设置多个值
 7#    value: 'value2'
 8
 9# 设置编译的命令
10#cmds: 
11#  - name: 'do make'  编译步骤名称
12#    cmd: 'make'      编译命令,默认 PATH 路径下执行,其他请写明绝对路径
13#  - name: 'do install'
14#    cmd: 'make install'
15cmds:
16  - name: 'chmod'
17    cmd: 'chmod a+x ./build.sh'
18  - name: 'demo'
19    cmd: './build.sh'
20
21# 编译产物存储目录, 必填项
22out_dir: 'output'

  • 构建类型:应用包

  • 存储空间:选择你创建的对象存储Bucket

  • 存储目录:这个是选填项,我这里填了devops-hcc

  • 超时:2小时

  • 计算规格:4GB,4vCPU

  • 通知频率:不发送

image

image

点击保存并构建

image

至此,已将蓝绿部署示例代码编译成功,并分别对应代码的blue分支和green分支,在华北-北京对象存储中可查看蓝部署和绿部署对应的编译产出物。

image

接下来,将开始使用云部署将程序包部署到云主机上。

四、开始部署

1.新建应用及部署组

在“部署应用”页,选中与云主机、对象存储相同的地域后,点击“新建应用”

image

跳转到“新建应用”页。

在“新建应用”页,首先填写应用信息。应用名称:devops-app-hcc

image

点击"新建"按钮

接下来,在应用中新建部署组,

image

有以下选项:

部署组名称:请填写部署组名称,devops-group-hcc

部署类型:请选择“蓝绿部署”

部署目标:点击“选择”按钮,在弹窗中选择云主机。支持三种选择过滤条件:高可用组(目前灰度开放)、标签、IP。这里请选择在上一步中创建的云主机,即主机名为:devops-ecs-hcc01加入蓝组,主机名为:devops-ecs-hcc02加绿组

使用负载均衡:是

负载均衡实例:请选择华北-北京地域中已有的负载均衡实例,devops-slb-hcc

负载均衡后端服务:请选择上一项中指定的负载均衡实例下的后端服务,devops-slb-backend-hcc

高级选项:保持默认选项

image

填写部署组的基本信息后,请点击“新建”,将进行应用中部署组的新建。

创建成功后,将跳转到“应用详情”页。

image

Alt text

2.新建部署

对于单个部署组,可支持的操作有:发起部署、部署历史、编辑、删除。

点击“发起部署”按钮,进入到“发起部署任务”页,有以下选项:

  • 部署描述:非必须,为本次部署的描述信息

  • 部署来源:支持多种部署来源,请选择云编译

  • 云编译任务名称:请填写devops-ci-hcc-blue

  • 云编译构建序号:请填写上一步中编译成功的构建序号

  • 部署来源文件类型:请选择.tar.gz

  • 操作命令:请选择输入部署操作命令,使用表单功能,填写具体操作命令,如下:

部署内容: 源目录或文件:/    目标目录:/home
停止脚本:/home/bin/stop.sh
启动脚本:/home/bin/start.sh
检查脚本:不填写
脚本执行账号:  root       
脚本超时时间(s):100

注意:
1、初次部署不要填写停止脚本路径;
2、初次执行部署的部署目标为蓝组,也就是devops-ecs-hcc01

image

image

填写部署任务信息后,请点击发起部署,将触发部署操作。

将跳转到“部署详情”页,由于我们是初次部署,所以部署目标为蓝组

image

部署完成后,我们到负载均衡虚拟服务器组里能看到蓝组的devops-ecs-hcc01云主机已经关联

image

3.查看部署结果

在“部署任务详情”页,可见本次部署的进展情况。在部署过程中,支持“取消”。

点击指定实例的“查看日志”,可见按照工作流展示的日志,工作流详见:

https://docs.jdcloud.com/cn/codedeploy/workflow。

image

验证蓝组部署结果 http://负载均衡公网IP

image

接下来部署绿组,我们找到初次部署的部署历史,点击重新部署,配置如下:

  • 部署描述:非必须,为本次部署的描述信息

  • 部署来源:支持多种部署来源,请选择云编译

  • 云编译任务名称:请填写devops-ci-hcc-green

  • 云编译构建序号:请填写上一步中编译成功的构建序号

  • 部署来源文件类型:请选择.tar.gz

  • 操作命令:请选择输入部署操作命令,使用表单功能,填写具体操作命令,如下:

部署内容: 源目录或文件:/    目标目录:/home
停止脚本:/home/bin/stop.sh
启动脚本:/home/bin/start.sh
检查脚本:不填写
脚本执行账号:  root      
脚本超时时间(s):100

注意:
1、此次执行部署的部署目标为绿组,也就是devops-ecs-hcc02

devops-ecs-hcc02(绿组)部署成功

image

部署绿组后,我们到负载均衡虚拟服务器组里能看到蓝组的devops-ecs-hcc01云主机已经换成了绿组的devops-ecs-hcc02云主机

image

验证绿组部署结果 http://负载均衡公网IP

image

至此,京东云代码托管+云编译+云部署蓝绿部署简单实践完成。

image

*点击“阅读原文”跟着文档一起操作吧~

欢迎点击“链接”了解更多精彩内容

image

阅读原文

posted @ 2019-05-06 18:50  京东科技开发者  阅读(1181)  评论(0编辑  收藏  举报