此篇主要是介绍一种结合AWS实现的能达到一定敏捷和安全诉求的CI/CD方案。
Jenkins
- 首先需要在内网(云内网或公司内网)配置一台jenkins服务器,这不是本文介绍的重点,如果不会可以Google
- 给应用配置task,例如Java应用,通过Jenkins编译打包完之后,把jar包放在AWS s3的bucket中。
AWS服务器设置
- 在应用服务器上设置一些tags,比如jar:order、version:1.22.0等,如下图:
- 服务器需要配置AWS IAM Role,例如:qa-service,这个Role需要有s3的可读权限,在服务器上配置如下脚本:
#!/usr/bin/env bash
APP=$2
instanceInfo=$(ec2-metadata | grep 'instance-id')
eccTag=(${instanceInfo})
instanceId=${eccTag[1]}
echo "this instance id: ${instanceId}"
update()
{
## 根据ec2的tag【version】获取jar包version
version="$(aws ec2 describe-tags --region cn-northwest-1 --filters "Name=resource-id,Values=${instanceId}" "Name=key,Values=version" | jq '.Tags[0].Value' | sed 's/"//g')"
## 获取需要的jar名称
if [[ -z ${APP} ]]; then
APP="$(aws ec2 describe-tags --region cn-northwest-1 --filters "Name=resource-id,Values=${instanceId}" "Name=key,Values=jar" | jq '.Tags[0].Value' | sed 's/"//g')"
fi
## 从s3获取jar包
echo "pulling jar from s3..."
aws s3 cp --region cn-northwest-1 s3://xxxx/qa/${APP}-${version}-SNAPSHOT.jar /home/xxx/${APP}.jar
}
restart()
{
#切换至root用户
echo "restart app..."
sudo su - root -c "supervisorctl restart ${APP}"
}
if [[ $1 == "update" ]]; then
update
elif [[ $1 == "restart" ]]; then
restart
elif [[ $1 == "reload" ]]; then
update
restart
fi
jq是shell的一个json工具,可以通过yum install jq
安装
AWS s3 和IAM Role的设置可以参考AWS 文档,非常清晰。