CodeBuild
创建构建项目
登录CodeBuild控制台单击创建项目,输入项目名称。
![](https://img-blog.csdnimg.cn/img_convert/bf256c5fba0c2286be93923e92a86eaa.png)
选择codeBuild的源(我选择S3,选择具体的S3存储桶,同时输入S3具体的名称或文件夹)。
![](https://img-blog.csdnimg.cn/img_convert/aeeb480fc41970c2e93a461894aeedc6.png)
选择环境(由于不是Docker部署所以选择aws托管的镜像)。
![](https://img-blog.csdnimg.cn/img_convert/8e8ef0d4b10802ce089c2c78beab6b0b.png)
输入项目中CodeBuild配置文件的地址默认为根目录下(默认与Src同级)。
![](https://img-blog.csdnimg.cn/img_convert/1905220e035cd28ad475d95aeddf2bb7.png)
这里如果使用流水线可以不选(这里为CodeBuild所生成的构件,CodeBuild配置文件中artifacts:files:下写的所有文件都会生成到构件中选的位置。)
![](https://img-blog.csdnimg.cn/img_convert/475cc9e0ae02b3aecd8dbb381a0605c4.png)
输出日志可以选择输出到CloudWatch中或者S3指定存储桶中,单击创建项目。
![](https://img-blog.csdnimg.cn/img_convert/87d8886d542194a0435802ad0dc7e936.png)
配置文件简单解析
version必需的映射。表示构建规范版本。建议使用 0.2。
phases/install/runtime-versions 指定版本
pre_build/commands 如果指定 pre_build,则为必需的序列。包含一系列标量,其中每个标量代表在构建之前 CodeBuild 运行的单个命令。 CodeBuild按照,按照,按照,从头到尾运行每条命令。
post_build/commands 如果post_build已指定,则为必填项。包含一系列标量,其中每个标量代表构建后 CodeBuild运行的单个命令。 CodeBuild 按照,按照,按照,从头到尾运行每条命令。
artifacts/files必需的序列。表示包含构建环境中的输出项目的位置。包含一系列标量,其中每个标量表示一个相对于原始构建位置或基本目录 (如果已设置) 的单独位置, CodeBuild 可在此处查找构建输出项目(codeBuild要输出什么内容给CodeDeploy用)
discard-paths 指定是否在输出中展平构建构件目录。如果未指定此项或包含 no,则将输出构建构件,并且其目录结构保持不变。如果此项包含 yes,则将所有构建构件放置在同一个输出目录中
具体参考AWS官方文档(https://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/build-spec-ref.html#build-spec-ref-syntax)
!!!!一定注意空格问题
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
2.CodeDeploy
创建部署组
首先创建一个CodeDeploy的服务角色(具体如何创建角色参考aws文档https://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/getting-started-create-service-role.html#getting-started-create-service-role-console)
最简单的角色权限目录以及aws托管的权限AWSCodeDeployRole
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "CodeDeployAccessPolicy",
"Effect": "Allow",
"Action": [
"autoscaling:*",
"codedeploy:*",
"ec2:*",
"lambda:*",
"ecs:*",
"elasticloadbalancing:*",
"iam:*",
"s3:*",
"ssm:*"
],
"Resource": "*"
}
]
}
开始创建应用程序,输入程序名称,选择Ec2
![](https://img-blog.csdnimg.cn/img_convert/9cc0b6bd736793fbef3b4cb22abd48e4.png)
应用程序页面创建单击创建部署组
输入部署组的名称,服务角色选择刚刚创建的角色,部署类型选择就地部署
![](https://img-blog.csdnimg.cn/img_convert/2c679b2feb9a9ce15ae74ac3fa737f6d.png)
环境配置选择Amazon Ec2实例,标签组中的键选择Name,值选择Ec2的名称
![](https://img-blog.csdnimg.cn/img_convert/e415311bfc1a9844f19186540d2056bb.png)
使用 AWS Systems Manager 进行代理配置选择从不(后面手动装代理)
![](https://img-blog.csdnimg.cn/img_convert/392201c09d43ec8b41a37645cb4b6287.png)
部署设置选择CodeDeployDefault.OneAtATime,单击创建部署组
![](https://img-blog.csdnimg.cn/img_convert/b3660d236a4c1546fcfb0d45253fb079.png)
Ec2中创建代理
如果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
给Ec2的角色策略
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": "*"
}
]
}
配置文件简单解析
如果 source 指的是文件,则仅将指定的文件复制到实例中destination所写的位置。
如果 source 指的是目录,则将该目录中的所有文件都复制到实例destination所写的位置。
如果source是单斜杠,则您的修订版中的所有文件都将复制到该实例destination所写的位置。
ValidateService— 这是最后一个部署生命钩指示。它用于验证部署已成功完成。
runas 表示用root的身份运行脚本。
!!!!一定注意空格问题。
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
CodePipeline
创建流水线
指定名称,选择新服务角色
![](https://img-blog.csdnimg.cn/img_convert/f9581c27012d7483dd67b90e76055b38.png)
选择代码源为S3,选择代码所在的存储桶,更改检测项选择 Amazon CloudWatch Events ,即s3只要上传了新代码直接触发流水线。
![](https://img-blog.csdnimg.cn/img_convert/0b6babbdae716d511bf9778c5e95ac0a.png)
添加构建阶段,项目名称为CodeBuild时创建的名称。
![](https://img-blog.csdnimg.cn/img_convert/52128f1b5a6275a7147956422aa1a52f.png)
添加部署阶段,选择CodeDeploy时创建的程序名称以及部署组。
![](https://img-blog.csdnimg.cn/img_convert/1cb4a71517989e68020a2f7ea86ca53c.png)
点击下一步,之后创建流水线,这时S3上只要问选定的文件更新就会自动触发流水线
文件示例
文件结构示例
![](https://img-blog.csdnimg.cn/img_convert/4741b68b50784a10a1a8119917e6073f.png)
脚本文件示例
#!/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 &
CodeBuild踩到的坑
压缩格式可能有问题换一种压缩格式尝试一下
![](https://img-blog.csdnimg.cn/img_convert/cf55c5f0be44670e8afc3f93a07031e2.png)
权限文件,最简单的办法S3文件设置为公开,或者去给CodeBuild角色S3权限
![](https://img-blog.csdnimg.cn/img_convert/ac66d6c92767161f0dc555cc5f645b8d.png)
如果提示某一个目录下没有指定文件,可以确认一下项目是否可以正常打包
CodeDeploy踩的天坑
找不到脚本
去查看buildspec.yml文件中artifacts:files是否写了这个脚本,如果写了可以尝试用CodeBuild的构件,把构件输出到S3查看是否有这个文件,如果没有则表示buildspec.yml配置文件有问题
![](https://img-blog.csdnimg.cn/img_convert/17f387b0cc13261507e45461c1a9faed.png)
appspec.yml配置文件编写有误
自己把版本写成了0.2,正确0.0
![](https://img-blog.csdnimg.cn/img_convert/7e9eaf90a3fdaa0ffabe9c4a39426f44.png)
windows里编写的脚本再linux可能会出现错误,所以最好时再linux里写完通过Cli传到S3,然后复制到项目中