• 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: /rgc-solution-server-validation/JenkinsCodeDeployProject/Backend-CI-Artifact/1/artifacts/target/bshrecipes.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中创建脚本配置文件等

    以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://rgc-solution-server-validation/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 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://rgc-solution-server-validation/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 的不停机发布已经完成。
  • 相关阅读:
    团队项目01应用场景
    团队项目冲刺第一阶段03
    团队冲刺第一阶段02
    团队冲刺第一阶段01
    基于 Scrapy-redis 的分布式爬虫详细设计
    创建CrawlSpider爬虫简要步骤
    如何将redis中的数据导入到本地MongoDB和MySQL数据库
    远程访问ubuntu下mysql的问题
    vi命令汇总
    Chrome/FireFox处理JSON的插件
  • 原文地址:https://www.cnblogs.com/xuewenlong/p/13601226.html
Copyright © 2020-2023  润新知