美文网首页
jenkins AWS CodeDeploy不停机部署

jenkins AWS CodeDeploy不停机部署

作者: SRE运维博客 | 来源:发表于2021-05-19 09:06 被阅读0次

    此项目的特点是把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/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安装

    安装可参考
    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
    AWS Global Configuration
    Bitbucket Pipeline for Blue Ocean
    Copy Artifact Plugin
    Next Build Number Plugin

    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:$PATH
    export PATH=/usr/local/maven/bin:$PATH
    mvn 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 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包

    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.0
    os: linux
    files:
      - 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/webapps
    hooks:
      BeforeInstall:
        - location: scripts/apparchive.sh
      ApplicationStart:
        - location: scripts/starttomcat.sh
    
    [root@ip-10-0-20-89 scripts]# cat apparchive.sh 
    #!/bin/bash
    mv -f /home/bsh/tools/apache-tomcat-8.5.23/webapps/bshrexxxcipes.war /home/bsh/backup/tomcatback/xxx.war.old
    mv -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 -x
    sudo 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 SRE
    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:/XXXXX/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 的不停机发布已经完成。
    文章原文
    https://cnsre.cn/posts/210310131550

    相关文章

      网友评论

          本文标题:jenkins AWS CodeDeploy不停机部署

          本文链接:https://www.haomeiwen.com/subject/gigujltx.html