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 的不停機發布已經完成。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM