
简介

AWS CodePipeline 是一种完全托管的持续集成与持续交付服务,可以帮助您实现发布管道的自动化,从而实现快速而可靠的应用程序和基础设施更新。代码一旦发生更改,CodePipeline 都会根据您定义的发布模型自动构建、测试和部署您的发布流程。这使您能够快速而可靠地提供各种功能和更新。您可以将 AWS CodePipeline 与 GitHub 等第三方服务或您自己的自定义插件轻松集成。利用 AWS CodePipeline,您只需按实际使用量付费。没有前期费用或长期承诺。
AWS CodeBuild 是一项完全托管的持续集成服务,可编译源代码、运行测试以及生成可供部署的软件包。使用 CodeBuild,您无需预置、管理和扩展自己的构建服务器。CodeBuild 可以持续扩展并同时处理多项构建任务,因此您的构建任务不会在队列中等待。您可以使用预先打包的构建环境快速开始,也可以创建使用您自己的构建工具的自定义构建环境。使用 CodeBuild,将按使用计算资源的分钟数向您收取费用。
AWS CodeDeploy 是一项将软件自动部署到各种计算服务(例如 Amazon EC2、AWS Fargate、AWS Lambda 和本地服务器)的完全托管的部署服务。借助 AWS CodeDeploy,您可以更轻松地快速发布新功能,避免在应用程序部署过程中出现停机,并简化应用程序的更新工作。您可以使用 AWS CodeDeploy 自动执行软件部署,而无需执行容易出错的手动操作。服务根据您的部署需求进行扩展。
本文介绍CodePipeline结合Codebuild + Codedeploy 实现EC2持续集成!

EC2部署配置

启动实例省略...
EC2 Role配置如下

EC2安装配置如下
命令“Service_name”需要更改,我使用的是Dockerfile & docker启动程序。需要改的自行更改。
$ Service_name='You project service name' && \
$ sudo yum -y install docker ruby && \
$ sudo systemctl start docker && \
$ sudo systemctl enable docker && \
$ sudo mkdir -p /home/ec2-user/jar && \
$ sudo docker pull openjdk:8-slim && \
$ sudo cd /opt && \
$ sudo wget https://aws-codedeploy-us-west-1.s3.us-west-1.amazonaws.com/latest/in$ stall -O /opt/install && \
$ sudo chmod 700 /opt/install &&
$ sudo /opt/install auto && \
$ sudo service codedeploy-agent status && \
$ cat << EOF >/home/ec2-user/Dockerfile
$ FROM openjdk:8-slim
$ COPY ${Service_name}.jar /${Service_name}.jar
$ CMD java -jar ${Service_name}.jar
$ EOF

配置代码

在项目目录存放脚本文件
runtime-versions运行版本是java,详情请看:https://docs.aws.amazon.com/zh_tw/codebuild/latest/userguide/build-env-ref-available.html
01
buildspec.yml
参考:https://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/build-spec-ref.html
phases/pre_build/commands
构建前准备的构建命令参数
phases/build/commands
构建所准备的命令参数
phases/post_build/commands
构建后准备的构建命令参数
artifacts/files
需要上传哪些文件到S3 部署,需要准备 “部署脚本、项目包”
artifacts/discard-paths
指定是否在输出中报告文件目录,no 保持结构目录不变,yes只保留目录文件
version: 0.2
phases:
install:
runtime-versions:
java: corretto8
pre_build:
commands:
- echo Logging in to AWS ECR...
- $(aws ecr get-login --region us-east-1)
- export REPOSITORY_URI="You git url"
- export COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
- export IMAGE_TAG=${COMMIT_HASH:=latest}
- export PROJECT=java
build:
commands:
- echo build started at `date`
- mvn clean package -B
- echo Building the Docker image...
- docker build -t $REPOSITORY_URI:latest .
- docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG
post_build:
commands:
- echo build completed at `date`
- echo Pushing the Docker images...
- docker push $REPOSITORY_URI:latest
- docker push $REPOSITORY_URI:$IMAGE_TAG
artifacts:
files:
- aws/java-v.1.0.1.jar
- appspec.yml
- deploy/start.sh
- deploy/stop.sh
- deploy/bak.sh
- deploy/check.sh
- deploy/install.sh
discard-paths: yes
02
appspec.yml
参考:https://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/reference-appspec-file.html
version
此部分指定 AppSpec 文件的版本。请勿更改此值。版本是必需的。当前,允许的唯一值为 0.0
os
本部分指定您部署到的实例的操作系统值。版本是必需的。可以指定以下值:
linux— 实例是亚马逊 Linux、Ubuntu 服务器或 RHEL 实例
Windows— 实例为 Windows Server 实例
使用字符串指定 os
file
此部分指定应在部署的 Install 事件期间复制到实例的文件的名称
hooks/ApplicationStop
生命周期脚本“Stop”指定
hooks/BeforeInstall
生命周期脚本“Install”指定
hooks/ApplicationStart
生命周期脚本“Start”指定
version: 0.0
os: linux
files:
- source: /
destination: /home/ec2-user/jar
hooks:
ApplicationStop:
- location: deploy/stop.sh
timeout: 300
runas: root
BeforeInstall:
- location: deploy/check.sh
timeout: 300
runas: root
- location: deploy/bak.sh
timeout: 300
runas: root
AfterInstall:
- location: deploy/install.sh
timeout: 300
runas: root
ApplicationStart:
- location: deploy/start.sh
timeout: 300
runas: root
stop.sh
#!/bin/bash
NAME='You service name'
sudo docker rm -f $NAME
start.sh
#!/bin/bash
NAME='You service name'
sudo docker-compose -f /data/docker-compose/docker-compose.yml up -d $NAME
bash.sh
#!/bin/bash
HOME='You java dir'
BAK_PATH='You bak dir'
BAK_NAME='You service name'
DATE=`date '+%Y-%m-%d-%H-%M-%S'`
[[ ! -d $BAK_PATH ]] && mkdir -p $BAK_PATH
cd $HOME
cp -f *.jar $BAK_PATH/${DATE}_${BAK_NAME}
cd ${BAK_PATH}
##备份保留5个
ls -lt |awk 'NR>6{print $NF}'|xargs rm -rf
check.sh
#!/bin/bash
WORK='You workdir'
HOME='You java dir'
PULL='You pull dir'
BAK='You bak dir'
[[ ! -d $HOME ]] && sudo mkdir -p $HOME
[[ ! -d $PULL ]] && sudo mkdir -p $RUN
[[ ! -d $BAK ]] && sudo mkdir -p $BAK
sudo chown ec2-user.ec2-user $HOME
install.sh
#!/bin/bash
PULL='You pull dir'
HOME='You java dir'
NAME='You service name'
cd $PULL
sudo rm -f *source*.jar
sudo mv *.jar $HOME/${NAME}
sudo rm -rf ${PULL}/*

配置Codepipline流水线

01
codepipline配置结果图

02
点击创建项目,配置codepipline git仓库
Repository name "仓库名称"
Branch name "分支名称"
Start the pipline on source code change "检查git分支提交自动更新流水线"
Out arifact format "输出源,使用Codepipline default"
Varable namespace "定义一个命名空间,自取名"
Output artifacts "定义codepipline输出下一步源名称,下一个目标引用(下面会看到)"

03
配置codedebuild源
Action name "定义这个流水线步骤名称"
Action provider "选择AWS CodeBuild"
Region "选择你的目标区域,这是我是US West"
Input artifacts "输入源,选择我们上一步定义github源名称 SourceArtifact"
Project name "项目名称创建(点击Create Project)目标显示CodeBuild窗口,下一步会讲解"
Environment variables "定义变量,如果有需要的情况"
Build type "选择Single build 单独构建(当这个流水线执行完毕后,执行下一步更新),Batch Build 并发构建,按项目实际情况选择"
Variable namespace "定义一个命名空间,自取名"
Output artifacts "定义codepipline输出的下一步源名称,下一个目标引用(下面会看到)"

定义 Project name(CodeBuild )项目 source源

参考:https://docs.aws.amazon.com/zh_tw/codebuild/latest/userguide/build-env-ref-available.html
images "定义codebuild时使用的镜像源(只用于codebuild打包使用)"
Environment type "选择 Linux环境"
Timeout "build超时配置"
Comput "选择build时打包镜像的配置大小"
Privileged "是否使用root权限"
Service role "权限角色需要codepipline、codebuild权限,iam创建,这里不在介绍"
VPC + Environment + File systems "配合ECS、EKS等容器构建时使用,这里配合Codedeploy+EC2构建,不再介绍"
定义 Environment

Brtach service role "使用角色"
Maximum builds allowed in batch "构建数"
Batch timeout "构建超时"
Artifacts upload location "上传使用的s3 路径,自定义"
Packaging "打包类型zip"
cache type "不需要缓存,看自己情况"
Encryption key "自动创建key"
Logs "定义cloudwatch logs或者s3日志输出,不然构建无法查看日志打包记录"
04
配置codedeployment源
Action name "定义名称"
Action provider "选择部署器"
Region "地域"
Input aritfacts "输入源"
Application name "配置应用组(下面会教程)"
Deployment group "配置部署组(下面会教程)"
Variable namespace "定义一个命名空间,自取名"

创建应用程序组

创建部署组

选择部署方式,就地还是蓝绿,蓝绿需要使用ELB
如果选择Auto scaling 方式 auto组会自动创建生命周期自动更新服务项目包内容

触发器 & 警报 触发发版状态,需要编写相关脚本,这里之后再提供
是否回滚?

配置完毕!流水线正常运行!自行测试构建!

大坑记录

最好不要复制配置,因为有的aws默认不复制上也没有提示
脚本的名称不要写死 不然容易出错
aws build 应用时,最好选择core aws自带的版本构建,否则奇怪的问题出现。。。
codedeploy 多次错误时,尤其脚本错误了,agent会有缓存,需要删除/opt/codedeployment/*/
参考:
[1] buildspec.yaml:https://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/build-spec-ref.html
[2] appspec.yaml:https://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/reference-appspec-file.html
[3] 镜像提供的配置 https://docs.aws.amazon.com/zh_tw/codebuild/latest/userguide/build-env-ref-available.html
[4] codepipeline指南 https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html



如果觉得本文对你有帮忙,请拿起您 金贵的小手 给作者点一杯Coffee吧!
"关注我,一起学习,共同进步!"





