此项目的特点是把Jenkins与CodeDeploy相结合做的CICD做的蓝绿发布,CI与CD 是分开的,CI构建完以后以BuildNumber的形式把war包存至AWS的S3桶中。同时在java项目上把java代码与配置文件分离,这样的话我们就可以war包+ 配置文件的形式把项目发布至测试、预生产、生产等环境。在CD发布的过程中CodeDeploy中用到的是 CodeDeployDefault.OneAtATime 如果有一台发布以后健康检查失败,则停止发布另外一台,并吧该台设备从ALB 中剔除。
jenkins发布流程如下图

环境准备

AWS 准备

创建 IAM 角色

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

IAM json
{{< tabs CodeDeploy S3>}}
{{< tab >}}

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

{{</ tab >}}
{{< tab >}}

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

{{</ tab >}}
{{</ tabs >}}

创建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安装

安装可参考
https://www.cnblogs.com/xuewenlong/p/12914876.html
aws-cli 可参考
https://amazonaws-china.com/cn/cli/
jenkins 最新安装包
https://mirrors.tuna.tsinghua.edu.cn/jenkins/war-stable/latest/jenkins.war

jenkins 插件准备

安装插件的过程不再细说
Artifact Manager on S3
AWS Global Configuration
Bitbucket Pipeline for Blue Ocean
Copy Artifact Plugin
Next Build Number Plugin

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: /xxxxxx-xxxxx-xxxx/JenkinsCodeDeployProject/xxxx-CI-Artifact/1/artifacts/target/xxxxxxx.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中创建脚本配置文件等

在创建CD JOB 之前 我们需要在Bitbucket中创建一些脚本配置文件等
以xxx为例目录结构如下

# tree  configuration-file-cicd/
configuration-file-cicd/                     #Bitbucket文件夹
├── xxx                                      #以项目划分Bitbucket文件夹
│   ├── application-xxx-pilot.properties     #xxx预生产配置文件
│   ├── application-xxx-prod.properties      #xxx生产配置文件
│   ├── application-xxx-qa.properties        #xxx测试配置文件
│   ├── appspec.yml                          #CodeDeploy 配置文件
│   └── scripts                              #CodeDeploy调用的脚本文件
│       ├── apparchive.sh
│       └── starttomcat.sh

具体内容展示
配置文件不再展示

# cat appspec.yml
version: 0.0
os: linux
files:- source: xxx.wardestination: /home/bsh/tools/apache-tomcat-8.5.23/webapps- source: application-backend.propertiesdestination: /home/bsh/tools/apache-tomcat-8.5.23/webapps
hooks:BeforeInstall:- location: scripts/apparchive.shApplicationStart:- location: scripts/starttomcat.sh
[root@ip-10-0-20-89 scripts]# cat apparchive.sh
#!/bin/bash
mv -f /home/bsh/tools/apache-tomcat-8.5.23/webapps/bshrexxxcipes.war /home/bsh/backup/tomcatback/xxx.war.old
mv -f /home/bsh/tools/apache-tomcat-8.5.23/webapps/application-xxx.properties /home/bsh/backup/tomcatback/application-xxx.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://XXXX/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 SRE
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:/XXXXX/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 的不停机发布已经完成。
文章原文
https://cnsre.cn/posts/210310131550

jenkins AWS CodeDeploy不停机部署相关推荐

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

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

  2. 剖析AWS CodeDeploy

    2014年底,AWS在"re:invent"大会上发布了三个新的部署.管理服务CodeDeploy ,CodeCommit和CodePipeline.此前AWS已经提供Beanst ...

  3. k8s aws 部署_如何在短短30分钟内使用CircleCI设置到AWS S3的持续部署

    k8s aws 部署 by Adam Watt 通过亚当·瓦特 如何在短短30分钟内使用CircleCI设置到AWS S3的持续部署 (How to setup Continuous Deployme ...

  4. Docker(十二):Docker+Jenkins+Nginx+Spring Boot 自动化部署项目

    前言 虽然Docker已经是风靡全球的容器技术了,统一环境避免环境问题上是Docker的主要吸引点之一,但使用时详细还是会遇到不少问题的,比如个人搭建时曾思考过这些问题: Jenkins官网既然有Do ...

  5. Jenkins +maven+tomcat自动构建部署(学习笔记三十六)

    https://my.oschina.net/denglz/blog/524154 摘要: jenkins + maven + svn + tomcat 自动部署 jenkins  是做什么用的,如果 ...

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

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

  7. Linux下搭建jenkins+svn+http+maven自动化部署

    Linux下搭建jenkins+svn+http+maven自动化部署 服务器设置: 卸载redhat的yum,安装centos的yum,配置第三方yum 1.删除redhat原有的rpm -qa | ...

  8. Docker+Jenkins+Nginx+Spring Boot 自动化部署项目

    Docker通过linux的namespace实现资源隔离.cgroups实现资源控制,通过写时复制机制(copy-on-write)实现了高效的文件操作,在实际开发中可用于提供一次性的环境.微服务架 ...

  9. Jenkins 在 Tomcat 中的部署及代码静态检查工具集成

    Jenkins 的简单部署 在安装了 Jenkins 运行所需的依赖(主要是 JDK)之后,可以通过如下步骤简单快速地部署 Jenkins: 下载 Jenkins. 打开终端并切换至下载目录. 运行命 ...

  10. aws 删除ec2实例_如何在AWS EC2实例上部署Spring Boot应用程序

    aws 删除ec2实例 你好朋友, 在本教程中,我们将看到如何在AWS EC2实例上部署Spring Boot应用程序. 这是我们将要执行的步骤. 1.使用Spring Boot Initialise ...

最新文章

  1. ISO9000管理体系认证申请书
  2. 导入jar包和创建jar文件
  3. 【转】用nohup命令让Linux下程序永远在后台执行
  4. ---------愿 青春与我皆不付---------------------
  5. python怎么转到下一行_Python转到下一行并保存/编辑内容
  6. sqlserver java odbc_Java JDBC------------------ODBC(SQLServer)链接
  7. ASP.NET MVC5 之 分部页
  8. 收回扣、打麻将、开赌场?比亚迪自曝多名员工贪污腐败
  9. 2.AsyncQueryHandler、内容提供者
  10. 动态创建Fastreport
  11. 微软-IT-解决方案-统一沟通-发布会
  12. python叮当猫代码_详细介绍一个利用html+css实现叮当猫的实例代码
  13. python装饰器带参数函数_python带参数装饰器的两种写法
  14. Navicate在同步oracle数据,不同数据库之间同步
  15. ​30 岁了,依然一事无成
  16. java handlerbase_Java Firebase.AuthResultHandler方法代码示例
  17. 基于comsol软件的三维单模光纤模拟
  18. 物联网规划元旦前后出台 定十领域
  19. GPU驱动、CUDA和cuDNN之间的版本匹配与下载
  20. java bsdiff_Android差分包生成和合成新包-bsdiff

热门文章

  1. NDoc - .NET 代码文档生成器
  2. 手机插了sd卡显示无服务器,手机sd卡无法读取之sd卡无文件系统或文件系统不受支持怎么办...
  3. 电脑没有“立体声混音”设备怎么办,虚拟声卡安装教程
  4. vue将图片保存到相册_Vue保存当前页面为图片
  5. 国内主流集群渲染管理软件介绍
  6. linux如何扫描文件格式,Linux系统如何使用扫描仪
  7. zabbix 监控h3c 10508 交换机光衰值
  8. 一文带你走进车联网安全
  9. iPhone iPad Cydia 软件源 大全
  10. 史上最详细的WinHex数据恢复大师(六大章节)视频教程