jenkins AWS CodeDeploy不停机部署
发布日期:2022-02-28 11:05:56 浏览次数:4 分类:技术文章

本文共 6601 字,大约阅读时间需要 22 分钟。

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

jenkins发布流程如下图
SRE运维博客|Linux系统运维|自动化运维|云计算|运维监控

环境准备

AWS 准备

创建 IAM 角色

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

JenkinsCodeDeployProject
SRE运维博客|Linux系统运维|自动化运维|云计算|运维监控
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角色

SRE运维博客|Linux系统运维|自动化运维|云计算|运维监控

Linux 准备

安装jenkins、jdk、maven、aws-cli、git

以上环境安装不做详细说明,

mvn 安装

cd /home/bsh/toolswget https://mirrors.cnnic.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz --no-check-certificatetar  -zxvf apache-maven-3.6.3-bin.tar.gz mv apache-maven-3.6.3 /usr/local/mavenln -s /usr/local/maven/bin/mvn  /usr/bin/mvnvim /etc/profile#最后加入以下内容...###################mvn########################export MAVEN_HOME=/usr/local/mavenexport PATH=$MAVEN_HOME/bin:$PATH...source /etc/profilevim /home/bsh/tools/maven/apache-maven/src/conf/settings.xml#找到mirrors 修改为以下内容...  
alimaven
aliyun maven
Human Readable Name for this Mirror.
http://maven.aliyun.com/nexus/content/groups/public/
...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

Jenkins设置

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

Bitbucket 设置

点击系统设置–打开系统配置

SRE运维博客|Linux系统运维|自动化运维|云计算|运维监控
然后找到 Bitbucket 端点-- 添加 Bitbucket server
SRE运维博客|Linux系统运维|自动化运维|云计算|运维监控
按需填写-- 然后点击管理hooks–点击添加 按需写入自己的Bitbucket 账号密码
SRE运维博客|Linux系统运维|自动化运维|云计算|运维监控
最后保存
SRE运维博客|Linux系统运维|自动化运维|云计算|运维监控

AWS S3 设置

点击系统设置–打开系统配置

SRE运维博客|Linux系统运维|自动化运维|云计算|运维监控
找到 Artifact Management for Builds
SRE运维博客|Linux系统运维|自动化运维|云计算|运维监控
选择Amazon S3 然后保存
SRE运维博客|Linux系统运维|自动化运维|云计算|运维监控
SRE运维博客|Linux系统运维|自动化运维|云计算|运维监控
分别填写S3桶名称和桶下边的文件
SRE运维博客|Linux系统运维|自动化运维|云计算|运维监控

创建一个新的CI JOB

新创建一个自由风格的JOB

SRE运维博客|Linux系统运维|自动化运维|云计算|运维监控

源码管理

按需填入 URL

选择 Bitbucket的账号密码
写入分支
SRE运维博客|Linux系统运维|自动化运维|云计算|运维监控

构建环境

构建前删除工作空间

SRE运维博客|Linux系统运维|自动化运维|云计算|运维监控

构建

选择执行shell

写入jdk以及mvn的变量

export PATH=/home/bsh/tools/jdk1.8.0_221/bin:$PATHexport PATH=/usr/local/maven/bin:$PATHmvn clean package -DskipTests

SRE运维博客|Linux系统运维|自动化运维|云计算|运维监控

SRE运维博客|Linux系统运维|自动化运维|云计算|运维监控

构建后的操作

构建后归档war包

这一步也就是把war包存至S3桶中的一步
点击增加构建后操作步骤
SRE运维博客|Linux系统运维|自动化运维|云计算|运维监控
选择归档成品
SRE运维博客|Linux系统运维|自动化运维|云计算|运维监控
填入之前配置S3桶中下的目录以及文件名称
最后等于war包存在了S3的
S3: /xxxxxx-xxxxx-xxxx/JenkinsCodeDeployProject/xxxx-CI-Artifact/1/artifacts/target/xxxxxxx.war
SRE运维博客|Linux系统运维|自动化运维|云计算|运维监控
最后可别忘记点击保存了 哈哈哈

测试CI构建java工程

Started by user xuewenlongRunning as SYSTEMBuilding 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 artifactsUploaded 1 artifact(s) to https://rgc-solution-server-validation.s3.cn-north-1.amazonaws.com.cn/JenkinsCodeDeployProject/Backend-CI-test/13/artifacts/Recording fingerprintsFinished: SUCCESS

最后可以看到是已经构建完成并且把war包存放在了S3中

登录AWS S3 查看验证war包

SRE运维博客|Linux系统运维|自动化运维|云计算|运维监控

这样的话可以看到是已经完成了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.0os: linuxfiles:  - source: xxx.war    destination: /home/bsh/tools/apache-tomcat-8.5.23/webapps  - source: application-backend.properties    destination: /home/bsh/tools/apache-tomcat-8.5.23/webappshooks:  BeforeInstall:    - location: scripts/apparchive.sh  ApplicationStart:    - location: scripts/starttomcat.sh
[root@ip-10-0-20-89 scripts]# cat apparchive.sh #!/bin/bashmv -f /home/bsh/tools/apache-tomcat-8.5.23/webapps/bshrexxxcipes.war /home/bsh/backup/tomcatback/xxx.war.oldmv -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 -xsudo systemctl restart tomcat

AWS CodeDeploy 配置

在AWS 中找到CodeDeploy 服务

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

创建自由风格的CD JOB

SRE运维博客|Linux系统运维|自动化运维|云计算|运维监控

General

选择 参数化构建过程、然后依次填入一下内容

BuildNumber 是CI构建时的构建数字
SRE运维博客|Linux系统运维|自动化运维|云计算|运维监控
PackageName 为你的war包名称
SRE运维博客|Linux系统运维|自动化运维|云计算|运维监控
SRE运维博客|Linux系统运维|自动化运维|云计算|运维监控

源码管理

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

SRE运维博客|Linux系统运维|自动化运维|云计算|运维监控

构建环境

构建前删除工作空间

SRE运维博客|Linux系统运维|自动化运维|云计算|运维监控

构建

选择执行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

SRE运维博客|Linux系统运维|自动化运维|云计算|运维监控

构建后操作

依次填入CodeDeploy以及S3的配置信息

SRE运维博客|Linux系统运维|自动化运维|云计算|运维监控
到现在jenkins CD 已经配置完成 接下来测试下吧

测试CD发布java工

查看上次CI构建成功的war包

SRE运维博客|Linux系统运维|自动化运维|云计算|运维监控
选择需要发布的BuildNumber 以及填写java 工程的war包名称 然后点击开始构建
SRE运维博客|Linux系统运维|自动化运维|云计算|运维监控
因为在codedeploy 中选择的是一台一台发布,并且启用的负载均衡 所以这个发布的时间会比较长,一般在10分钟以上,但是这种方式也是比较适合生产环境的,因为这样的方式是不停机部署的方式。

控制台输出Started by user SRERunning as SYSTEMBuilding 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.zipRegistering 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

转载地址:https://blog.csdn.net/weixin_47430049/article/details/117015212 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Jenkins AWS CodeDeploy不停机部署
下一篇:AWS使用快照创建实例启动失败

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年03月25日 17时30分36秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

《巴比伦最富有的人》精髓:学会储蓄、谨慎投资,从而走上致富之路 2019-04-26
《经济学通识》:人类会受到“东西不够、生命有限、相互依赖、需要协调”四方面的限制,影响我们的衣食住行 2019-04-26
《不可不知的经济真相》精髓:普通老百姓如何进行楼市和股市的投资 2019-04-26
《中国债券市场》精髓:中国债券市场由政府主导,其最重要的目的是为国家建设筹集资金 2019-04-26
《极简GDP史》精髓:GDP虽有诸多局限性,但是对于社会经济发展仍然有举足轻重的作用 2019-04-26
《经济学是什么》精髓:如何用经济学家的眼光理解个人选择和市场经济? 2019-04-26
《卧底经济学》书中精髓:我们如何正确理解“稀缺”这件事儿? 2019-04-26
《学会花钱》书中精髓:花钱如何掌握分寸,以及如何避开花钱误区 2019-04-26
《定投十年财务自由》书中精髓:我们如何通过定投获得更高的收益? 2019-04-26
《海龟交易法则》精髓:制定对自己有利的交易规则,在风险可控的前提下,当机会出现,你要坚定不移的机械性执行交易 2019-04-26
《彼得·林奇教你理财》书中精髓:如何开始投资,以及我们到底该投资什么? 2019-04-26
《货币简史》书中的精髓:货币产生的起源是什么?货币又是如何发展起来的? 2019-04-26
《摩根财团》精髓:摩根财团与时俱进,在不同时代扮演不同角色,始终走在时代的前列 2019-04-26
《朝贡贸易与仗剑经商》精髓:古代中国朝廷不保护商人,将中国商人置于西方势力的仗剑经商之下 2019-04-26
《华尔街之狼》精髓:摔倒并不是坏事,就怕你因此放弃。 2019-04-26
《微观动机与宏观行为》精髓:个人的微观动机,是如何影响宏观行为结果的? 2019-04-26
《国富论》精髓:亚当·斯密提出的对后世影响深远的三个经济学理论:劳动分工理论、生产要素理论和宏观调控理论 2021-06-29
《动荡的世界》精髓:什么是动物精神?动物精神又是怎么影响2008年全球经济危机的,以及我们该如何预防动物精神,避免危机再次发生。 2021-06-29
《投资最重要的事》精髓:利用逆向思维,掌握既冷静又勇猛的投资方法,成为投资界真正厉害的人。 2021-06-29
《周期》书中的精髓:如何利用周期,掌握世界的发展趋势,实现财富积累。 2021-06-29