此項目的特點是把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 的不停機發布已經完成。