jenkins AWS CodeDeploy不停机部署
此项目的特点是把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: /solution/JenkinsCodeDeployProject/
最后可别忘记点击保存了 哈哈哈
测试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://solution.s3.cn-north-1.amazonaws.com.cn/JenkinsCodeDeployProject/ 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://solution/JenkinsCodeDeployProject/Backend-CI/${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://solution/JenkinsCodeDeployProject/ Registering revision for application 'BackendCICD' Creating deployment with revision at {RevisionType: S3,S3Location: {Bucket: solution,Key: JenkinsCodeDeployProject/Backend-CD-Prod/PROD/#5-Backend-CD-Prod-5-Test.zip,BundleType: zip,ETag: 5eb4e102812cc69f9c73084b06fdcfb1},} Finished: SUCCESS
验证CD部署java工程
最好的验证方法就是登录服务器查看一下
我这边就不做验证了
截止到此 jenkins 配合AWS codedeploy 的不停机发布已经完成。