Aws CodePipeline流水线部署Ec2

  1. CodeBuild

  1. 创建构建项目

  1. 登录CodeBuild控制台单击创建项目,输入项目名称。

  1. 选择codeBuild的源(我选择S3,选择具体的S3存储桶,同时输入S3具体的名称或文件夹)。

  1. 选择环境(由于不是Docker部署所以选择aws托管的镜像)。

  1. 输入项目中CodeBuild配置文件的地址默认为根目录下(默认与Src同级)。

  1. 这里如果使用流水线可以不选(这里为CodeBuild所生成的构件,CodeBuild配置文件中artifacts:files:下写的所有文件都会生成到构件中选的位置。)

  1. 输出日志可以选择输出到CloudWatch中或者S3指定存储桶中,单击创建项目。

  1. 配置文件简单解析

  1. version必需的映射。表示构建规范版本。建议使用 0.2。

  1. phases/install/runtime-versions 指定版本

  1. pre_build/commands 如果指定 pre_build,则为必需的序列。包含一系列标量,其中每个标量代表在构建之前 CodeBuild 运行的单个命令。 CodeBuild按照,按照,按照,从头到尾运行每条命令。

  1. post_build/commands 如果post_build已指定,则为必填项。包含一系列标量,其中每个标量代表构建后 CodeBuild运行的单个命令。 CodeBuild 按照,按照,按照,从头到尾运行每条命令。

  1. artifacts/files必需的序列。表示包含构建环境中的输出项目的位置。包含一系列标量,其中每个标量表示一个相对于原始构建位置或基本目录 (如果已设置) 的单独位置, CodeBuild 可在此处查找构建输出项目(codeBuild要输出什么内容给CodeDeploy用

  1. discard-paths 指定是否在输出中展平构建构件目录。如果未指定此项或包含 no,则将输出构建构件,并且其目录结构保持不变。如果此项包含 yes,则将所有构建构件放置在同一个输出目录中

  1. 具体参考AWS官方文档(https://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/build-spec-ref.html#build-spec-ref-syntax

  1. !!!!一定注意空格问题

version: 0.2
phases:
  install:
    runtime-versions:
      java: corretto11
  pre_build:
    commands:
      - echo Nothing to do in the pre_build phase...
  build:
    commands:
      - echo Build started on `date`
      - mvn test
  post_build:
    commands:
      - echo Build completed on `date`
      - mvn package
artifacts:
  files:
    - target/demo-0.0.1-SNAPSHOT.jar
    - appspec.yml
    - shell.sh
  discard-paths: yes
  1. 2.CodeDeploy

  1. 创建部署组

  1. 首先创建一个CodeDeploy的服务角色(具体如何创建角色参考aws文档https://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/getting-started-create-service-role.html#getting-started-create-service-role-console

  1. 最简单的角色权限目录以及aws托管的权限AWSCodeDeployRole

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "CodeDeployAccessPolicy",
            "Effect": "Allow",
            "Action": [
                "autoscaling:*",
                "codedeploy:*",
                "ec2:*",
                "lambda:*",
                "ecs:*",
                "elasticloadbalancing:*",
                "iam:*",
                "s3:*",
                "ssm:*"
            ],
            "Resource": "*"
        }
    ]
}
  1. 开始创建应用程序,输入程序名称,选择Ec2

  1. 应用程序页面创建单击创建部署组

  1. 输入部署组的名称,服务角色选择刚刚创建的角色,部署类型选择就地部署

  1. 环境配置选择Amazon Ec2实例,标签组中的键选择Name,值选择Ec2的名称

  1. 使用 AWS Systems Manager 进行代理配置选择从不(后面手动装代理)

  1. 部署设置选择CodeDeployDefault.OneAtATime,单击创建部署组

  1. Ec2中创建代理

  1. 如果403可能是Ec2的权限不够

sudo yum update
sudo yum install ruby
sudo yum install wget
#!/bin/bash
CODEDEPLOY_BIN="/opt/codedeploy-agent/bin/codedeploy-agent"
$CODEDEPLOY_BIN stop
yum erase codedeploy-agent -y
cd /home/ec2-user
wget https://codedeploy-us-east-1.s3.us-east-1.amazonaws.com/latest/install
chmod +x ./install
  1. 给Ec2的角色策略

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": "*"
        }
    ]
}
  1. 配置文件简单解析

  1. 如果 source 指的是文件,则仅将指定的文件复制到实例中destination所写的位置。

  1. 如果 source 指的是目录,则将该目录中的所有文件都复制到实例destination所写的位置。

  1. 如果source是单斜杠,则您的修订版中的所有文件都将复制到该实例destination所写的位置。

  1. ValidateService— 这是最后一个部署生命钩指示。它用于验证部署已成功完成。

  1. runas 表示用root的身份运行脚本。

  1. 具体官方文档参考(https://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/reference-appspec-file-structure-hooks.html)。

  1. !!!!一定注意空格问题。

version: 0.0
os: linux
files:
  - source: /demo-0.0.1-SNAPSHOT.jar
    destination: /webapps/Config
hooks:
  ValidateService:
    - location: /shell.sh
      timeout: 180
      runas: root
  1. CodePipeline

  1. 创建流水线

  1. 指定名称,选择新服务角色

  1. 选择代码源为S3,选择代码所在的存储桶,更改检测项选择 Amazon CloudWatch Events ,即s3只要上传了新代码直接触发流水线。

  1. 添加构建阶段,项目名称为CodeBuild时创建的名称。

  1. 添加部署阶段,选择CodeDeploy时创建的程序名称以及部署组。

  1. 点击下一步,之后创建流水线,这时S3上只要问选定的文件更新就会自动触发流水线

  1. 文件示例

  1. 文件结构示例

  1. 脚本文件示例

#!/bin/bash
SERVICE_NAME=demo-0.0.1-SNAPSHOT
SERVICE_PID=$(ps x | grep $SERVICE_NAME | grep -v grep | awk '{print $1}')    

if [ -n "$SERVICE_PID" ]; then
        echo "kill the instance[$SERVICE_PID]!!!"
        kill -9 $SERVICE_PID
fi;

cd /webapps/Config
java -jar $SERVICE_NAME.jar >/dev/null 2>&1 &
  1. CodeBuild踩到的坑

  1. 压缩格式可能有问题换一种压缩格式尝试一下

  1. 权限文件,最简单的办法S3文件设置为公开,或者去给CodeBuild角色S3权限

  1. 如果提示某一个目录下没有指定文件,可以确认一下项目是否可以正常打包

  1. CodeDeploy踩的天坑

  1. 找不到脚本

  1. 去查看buildspec.yml文件中artifacts:files是否写了这个脚本,如果写了可以尝试用CodeBuild的构件,把构件输出到S3查看是否有这个文件,如果没有则表示buildspec.yml配置文件有问题

  1. appspec.yml配置文件编写有误

自己把版本写成了0.2,正确0.0

  1. windows里编写的脚本再linux可能会出现错误,所以最好时再linux里写完通过Cli传到S3,然后复制到项目中

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值