此项目的特点是把Jenkins与CodeDeploy相结合做的CICD做的蓝绿发布,CI与CD 是分开的,CI构建完以后以BuildNumber的形式把war包存至AWS的S3桶中。同时在java项目上把java代码与配置文件分离,这样的话我们就可以war包+ 配置文件的形式把项目发布至测试、预生产、生产等环境。在CD发布的过程中CodeDeploy中用到的是 CodeDeployDefault.OneAtATime。假如有AB 两台业务服务器,发布前把A服务器从ALB 中剔除,确保只有B服务器在线。剔除以后进行发布项目,项目发布完毕,进行健康检查,如果通过则自动将A服务器添加到ALB中,如果健康检查失败则停止继续发布,确保B服务器是可用的。
jenkins发布流程如下图

环境准备

AWS 准备

创建 IAM 角色

我这边给到jenkins 角色的权限是 CodeDeploy 和S3 的所有权限
JenkinsCodeDeployProject
CodeDeploy json

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"codedeploy:*",
"s3:*"
],
"Resource": "*"
}
]
}
S3 json

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"codedeploy:*",
"s3:*"
],
"Resource": "*"
}
]
}
创建EC2实例
准备一台EC2 需要IAM要拥有CodeDeploy和S3权限的角色 也就是我们创建的IAM角色
 

Linux 准备

安装jenkins、jdk、maven、aws-cli、git
以上环境安装不做详细说明,

mvn 安装

cd /home/bsh/tools
wget https://mirrors.cnnic.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz --no-check-certificate
tar -zxvf apache-maven-3.6.3-bin.tar.gz
mv apache-maven-3.6.3 /usr/local/maven
ln -s /usr/local/maven/bin/mvn /usr/bin/mvn
vim /etc/profile
#最后加入以下内容
...
###################mvn########################
export MAVEN_HOME=/usr/local/maven
export PATH=$MAVEN_HOME/bin:$PATH
...
source /etc/profile
vim /home/bsh/tools/maven/apache-maven/src/conf/settings.xml
#找到mirrors 修改为以下内容
...
<mirrors>
<mirror>
<id>alimaven</id>
<mirrorOf>aliyun maven</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
</mirrors>
... mvn -version

jenkins、jdk安装

安装可参考
aws-cli 可参考
jenkins 最新安装包
 

jenkins 插件准备

安装插件的过程不再细说
Artifact Manager on S3
 

Jenkins设置

在插件安装完以后在部署项目之前我们需要做一些设置

Bitbucket 设置

点击系统设置--打开系统配置
然后找到 Bitbucket 端点-- 添加 Bitbucket server
按需填写-- 然后点击管理hooks--点击添加 按需写入自己的Bitbucket 账号密码
最后保存
 
 
 

AWS S3 设置

点击系统设置--打开系统配置
找到 Artifact Management for Builds
选择Amazon S3 然后保存
 
分别填写S3桶名称和桶下边的文件
 

创建一个新的CI JOB

新创建一个自由风格的JOB

源码管理

按需填入 URL
选择 Bitbucket的账号密码
写入分支

构建环境

构建前删除工作空间

构建

选择执行shell
写入jdk以及mvn的变量
export PATH=/home/bsh/tools/jdk1.8.0_221/bin:$PATH
export PATH=/usr/local/maven/bin:$PATH
mvn clean package -DskipTests
 
 

构建后的操作

构建后归档war包
这一步也就是把war包存至S3桶中的一步
点击增加构建后操作步骤
选择归档成品
填入之前配置S3桶中下的目录以及文件名称
最后等于war包存在了S3的
S3: /rgc-solution-server-validation/JenkinsCodeDeployProject/Backend-CI-Artifact/1/artifacts/target/bshrecipes.war
最后可别忘记点击保存了 哈哈哈
 

测试CI构建java工程

Started by user xuewenlong
Running as SYSTEM
Building in workspace /root/.jenkins/workspace/Backend-CI-test
[WS-CLEANUP] Deleting project workspace...
[WS-CLEANUP] Deferred wipeout is used...
The recommended git tool is: NONE
...
过程略
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 19.375 s
[INFO] Finished at: 2020-09-01T09:03:27Z
[INFO] ------------------------------------------------------------------------
Archiving artifacts
Uploaded 1 artifact(s) to https://rgc-solution-server-validation.s3.cn-north-1.amazonaws.com.cn/JenkinsCodeDeployProject/Backend-CI-test/13/artifacts/
Recording fingerprints
Finished: SUCCESS
最后可以看到是已经构建完成并且把war包存放在了S3中

登录AWS S3 查看验证war包

这样的话可以看到是已经完成了CI 打包归档至S3桶中。
 

创建一个新的CD JOB

Bitbucket中创建脚本配置文件等

以backend为例目录结构如下

在创建CD JOB 之前 我们需要在Bitbucket中创建一些脚本配置文件等
 
# tree  configuration-file-cicd/
configuration-file-cicd/ #Bitbucket文件夹
├── backend #以项目划分Bitbucket文件夹
│ ├── application-backend-pilot.properties #backend预生产配置文件
│ ├── application-backend-prod.properties #backend生产配置文件
│ ├── application-backend-qa.properties #backend测试配置文件
│ ├── appspec.yml #CodeDeploy 配置文件
│ └── scripts #CodeDeploy调用的脚本文件
│ ├── apparchive.sh
│ └── starttomcat.sh

具体内容展示

配置文件不再展示
# cat appspec.yml
version: 0.0
os: linux
files:
- source: bshrecipes.war
destination: /home/bsh/tools/apache-tomcat-8.5.23/webapps
- source: application-backend.properties
destination: /home/bsh/tools/apache-tomcat-8.5.23/webapps
hooks:
BeforeInstall:
- location: scripts/apparchive.sh
ApplicationStart:
- location: scripts/starttomcat.sh

# cat apparchive.sh
#!/bin/bash
mv -f /home/bsh/tools/apache-tomcat-8.5.23/webapps/bshrecipes.war /home/bsh/backup/tomcatback/bshrecipes.war.old
mv -f /home/bsh/tools/apache-tomcat-8.5.23/webapps/application-backend.properties /home/bsh/backup/tomcatback/application-backend.properties.old
# cat starttomcat.sh
#!/bin/bash -x
sudo systemctl restart tomcat
 

AWS CodeDeploy 配置

在AWS 中找到CodeDeploy 服务
选择创建应用程序
写入应用程序名称,和EC2/本地 点击创建应用程序
选择刚才创建的应用程序 点击部署组 选择创建部署组
依次填入相关信息。这个是要在jenkins中用到的
选择我们一开始创建的IAM 角色
部署类型选择就地(这边的蓝绿部署的话要用到自动扩展这个对于目前我们的业务来说比较浪费设备)
选择需要发布的EC2
部署方式为一台一台发布
启用负载均衡,发布好一台后做健康检查,如果健康检查不通过则发布停止。
 

创建自由风格的CD JOB

 

General

选择 参数化构建过程、然后依次填入一下内容
BuildNumber 是CI构建时的构建数字
PackageName 为你的war包名称
 
 

源码管理

选择GIT,这里的URL是java项目配置文件的地址 选择配置文件所在的分支我这边是存放在dev分支

构建环境

构建前删除工作空间

构建

选择执行shell
使用aws cli 命令把S3中的war包拿下来
#从S3桶中拿取war包
aws s3 cp s3://rgc-solution-server-validation/JenkinsCodeDeployProject/Backend-CI-Artifact/${BuildNumber}/artifacts/target/${PackageName} backend/ --region cn-north-1 --no-progress
#记录使用
echo "${JOB_NAME}-${BUILD_NUMBER}-Test" > backend/versionfile
#配置文件重命名
cp backend/application-backend-prod.properties backend/application-backend.properties
 

构建后操作

依次填入CodeDeploy以及S3的配置信息
到现在jenkins CD 已经配置完成 接下来测试下吧

测试CD发布java工程

查看上次CI构建成功的war包
选择需要发布的BuildNumber 以及填写java 工程的war包名称 然后点击开始构建
 
因为在codedeploy 中选择的是一台一台发布,并且启用的负载均衡 所以这个发布的时间会比较长,一般在10分钟以上,但是这种方式也是比较适合生产环境的,因为这样的方式是不停机部署的方式。
控制台输出
Started by user xuewenlong
Running as SYSTEM
Building in workspace /root/.jenkins/workspace/Backend-CD-Prod
[WS-CLEANUP] Deleting project workspace...
[WS-CLEANUP] Deferred wipeout is used...
...
过程略
...
Uploading zip to s3://rgc-solution-server-validation/JenkinsCodeDeployProject/Backend-CD-Prod/PROD/#5-Backend-CD-Prod-5-Test.zip
Registering revision for application 'BackendCICD'
Creating deployment with revision at {RevisionType: S3,S3Location: {Bucket: rgc-solution-server-validation,Key: JenkinsCodeDeployProject/Backend-CD-Prod/PROD/#5-Backend-CD-Prod-5-Test.zip,BundleType: zip,ETag: 5eb4e102812cc69f9c73084b06fdcfb1},}
Finished: SUCCESS

验证CD部署java工程

最好的验证方法就是登录服务器查看一下
我这边就不做验证了
截止到此 jenkins 配合AWS codedeploy 的不停机发布已经完成。

jenkins AWS CodeDeploy不停机部署的更多相关文章

  1. AWS DevOps – 配合Jenkins和CodeDeploy实现代码自动化部署

    AWS DevOps – 配合Jenkins和CodeDeploy实现代码自动化部署 Amazon ElastiCache 连接至 Redis 节点 通过 AWS Command Line Inter ...

  2. jenkins+git+maven搭建自动化部署项目环境

    简介    折腾了两个晚上,趁着今晚比较有空,把jenkins+git+maven搭建自动化部署项目环境搭建的过程记录一下,这里我把github作为git的远程仓库(https://github.co ...

  3. Jenkins使用FTP进行一键部署及回滚(Windows)

    前提条件: 1.必须有两台服务器,一个是生产环境,另一个是测试环境. 2.两台服务器上都必须安装了Jenkins. 3.其中,生产环境上的Jenkins已经开通的CLI的权限(Windows参考:ht ...

  4. 基于Jenkins,docker实现自动化部署(持续交互)

      前言 随着业务的增长,需求也开始增多,每个需求的大小,开发周期,发布时间都不一致.基于微服务的系统架构,功能的叠加,对应的服务的数量也在增加,大小功能的快速迭代,更加要求部署的快速化,智能化.因此 ...

  5. .NET持续集成与自动化部署之路第一篇——半天搭建你的Jenkins持续集成与自动化部署系统

    .NET持续集成与自动化部署之路第一篇(半天搭建你的Jenkins持续集成与自动化部署系统) 前言     相信每一位程序员都经历过深夜加班上线的痛苦!而作为一个加班上线如家常便饭的码农,更是深感其痛 ...

  6. 基于Jenkins,docker实现自动化部署(持续交互)【转】

      前言 随着业务的增长,需求也开始增多,每个需求的大小,开发周期,发布时间都不一致.基于微服务的系统架构,功能的叠加,对应的服务的数量也在增加,大小功能的快速迭代,更加要求部署的快速化,智能化.因此 ...

  7. 解放双手 | Jenkins + gitlab + maven 自动打包部署项目

    前言 记录 Jenkins + gitlab + maven 自动打包部署后端项目详细过程! 需求背景 不会偷懒的程序员不是好码农,传统的项目部署,有时候采用本地手动打包,再通过ssh传到服务器部署运 ...

  8. DevOps之零停机部署

    “零停机部署(ZDD)可在不中断现有服务的情况下部署新版系统.” 通过ZDD方式部署应用程序时,可在确保用户不会遭遇应用程序停机的前提下将新版应用引入生产环境.从用户和公司的角度来看,这应该是最佳部署 ...

  9. Jenkins使用FTP进行一键部署及回滚2(Windows)(项目实践)

     转载:http://www.cnblogs.com/EasonJim/p/6295372.html Jenkins使用FTP进行一键部署及回滚2(Windows)(项目实践) 前提: 这一篇是继上一 ...

随机推荐

  1. 前端知识点--CSS overflow 属性

    问题:如何加滚动条? 给div 设置css 样式overflow:scroll div { width:150px; height:150px; overflow:scroll; } -------- ...

  2. DC-8靶机

    仅供个人娱乐 靶机信息 下载地址:http://www.five86.com/downloads/DC-8.zip 一.主机扫描 二.信息收集 http://192.168.17.135/robots ...

  3. 微信小程序 -- 英语词典 (小程序插件)

    英语词典小程序 基于英语词典小程序插件 - 提供开源地址 项目地址 英语词典小程序插件: 微信小程序 词典 真题基础服务插件(gitee.com) 功能特色 [x] 全面详实的经典词库,详细释义覆盖约 ...

  4. JavaScript-编译与闭包

    编译原理 尽管 JavaScript 经常被归类为"动态"或"解释执行"的语言,但实际上它是一门编译语言.JavaScript 引擎进行的编译步骤和传统编译语言 ...

  5. insert()与substr()函数

    insert()函数与substr()函数 insert()函数: insert ( pos, str2);--将字符串str2插入到原字符串下标为pos的字符前 insert (pos, n, c) ...

  6. BurpSuite 2020.5安装教程

    Burpsuite2020.5安装教程 Burpsuite2020.5需要在Java11的环境下才可正常运行. 所以首先安装Java11: 安装Java11 Java SE的安装非常简单,直接下一步, ...

  7. JavaScript学习05(操作DOM)

    操作DOM DOM(文档对象模型) 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model). HTML DOM 模型被结构化为对象树: 通过这个对象模型,Java ...

  8. 结合场景使用Redis缓存与数据库同步

    Redis缓存与MySQL数据库与同步 什么场景用到了Redis缓存? 1.广告数据 2.搜索时,分类品牌名称,分类名称和规格数据 3.购物车 4.支付 问题:如何实现? 1.广告数据 先查询Redi ...

  9. 聊一聊中台和DDD(领域驱动设计)

    本次分享价值:本次分享主要针对中台.微服务和领域模型的理念.本质及其构建方法论进行探讨.对领域分析的价值所在就是寻求"千变万化"中相对的"稳定性.第一性",然后 ...

  10. 如何在github上fork以及同步原作者代码

    参考网址:https://blog.csdn.net/llll2020/article/details/86140488 转  GitHub上fork别人打代码后如何保持和原作者同步的更新 </ ...