# 自动发布集成
# 示例工程
系统应用集成示例工程打开 (opens new window)
# 本内容你将获得
- 自动发布的形式,包含 docker/k8s/jenkinsfile/GithubAction
- 自动发布使用和针对的场景
- 多环境配置的切换和配置
- 应用发布状态检查
- 发布集成钉钉监控和发布效果
# 自动化发布的操作
这里主要是集成自动化的操作,也是 devops 中的一部分,主要是 CICD 整合,达到以下目标:
# 可视化集成
这里集成jenkins自动生成文件,当中集成包括钉钉通知、链路追踪、日志审计集成、多环境构建、镜像中心等,配置如下:
注意点:
- 这里需要提前配置jenkins相关变量,包括maven配置等,具体参考
- 使用阿里云链路跟踪需要提前开通阿里云,一般应用来说是满足的
- 审计日志服务和链路追踪区别在于日志保留和排查
- 注意相关插件性能的问题,这个并不是所有都需要集成添加,建议做一下评估
# docker 发布方式
docker 发布的基础镜像,这部分为默认的基础镜像,包含前端和后台,经过一定的处理
# 后台基础镜像
registry.cn-shenzhen.aliyuncs.com/alinesno-base/openjdk11:11.0.9
# 前端基础镜像
registry.cn-shenzhen.aliyuncs.com/alinesno-base/nginx-alpha:1.1.0
注意相关问题:
- 注意不同的环境可以使用不同的镜像,这里推荐使用最小镜像,具体查看
- nginx 基础镜像已处理 vue 前端出现的 404 问题
- 后台基础镜像相对较大,此需要注意,包含有一定的调试命令
# 后台端容器化发布
通过-D传递相关自定义参数,多种环境切换通过application-env.yml进行切换,运行 docker
k8s 请参考示例工程
运行工程,此处注意不要出现空格
ALIYUN_CR_HOST=registry.cn-shenzhen.aliyuncs.com
ALIYUN_CR_NAMESPACE=alinesno-cloud-incubator
PRO_NAME=alinesno-cloud-base-authority-boot
PRO_VERSION=2.1.2-RC
EXPOSE_PORT=8080
DOCKER_PORT=8080
PROFILES_ACTIVE=pro
docker rm -f $PRO_NAME || true
docker pull $ALIYUN_CR_HOST/$ALIYUN_CR_NAMESPACE/$PRO_NAME:$PRO_VERSION
docker run \
-e JAVA_TOOL_OPTIONS="-Dspring.profiles.active=$PROFILES_ACTIVE" \
-p $EXPOSE_PORT:$DOCKER_PORT \
--name $PRO_NAME \
--restart="always" \
-d $ALIYUN_CR_HOST/$ALIYUN_CR_NAMESPACE/$PRO_NAME:$PRO_VERSION
后台查询容器运行的情况docker ps | grep xxxx,即可查看监控
# 前端容器化发布和更新脚本
ALIYUN_CR_HOST=registry.cn-shenzhen.aliyuncs.com
ALIYUN_CR_NAMESPACE=alinesno-cloud-incubator
PRO_NAME=alinesno-cloud-demo-ui
PRO_VERSION=2.1.2-RC
EXPOSE_PORT=8080
DOCKER_PORT=80
docker rm -f $PRO_NAME || true
docker pull $ALIYUN_CR_HOST/$ALIYUN_CR_NAMESPACE/$PRO_NAME:$PRO_VERSION
docker run \
-p $EXPOSE_PORT:$DOCKER_PORT \
-e API_BASE_URL="http://alinesno-demo.admin.beta.linesno.com" \
-e SERVER_CDN_URL="http://data.linesno.com/alinesno-cloud-demo-ui" \
-e SERVER_STORAGE_UPLOAD_URL="http://alinesno-demo.admin.beta.linesno.com/common/storage/upload" \
-e SERVER_STORAGE_DISPLAY_URL="http://alinesno-demo.admin.beta.linesno.com/common/storage/displayImg/" \
--name $PRO_NAME \
--restart="always" \
-d $ALIYUN_CR_HOST/$ALIYUN_CR_NAMESPACE/$PRO_NAME:$PRO_VERSION
后台查询容器运行的情况docker ps | grep xxxx,即可查看监控
# k8s 发布方式
这里集成的 k8s 配置说明如下,这里只列出主要的配置项,这里推荐一键替换的方式alinesno-cloud-shop-manage-boot,如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: dev-alinesno-cloud-shop-manage-boot
namespace: learner-project
labels:
app: dev-alinesno-cloud-shop-manage-boot
spec:
replicas: 1
revisionHistoryLimit: 2
selector:
matchLabels:
app: dev-alinesno-cloud-shop-manage-boot
strategy:
type: RollingUpdate
template:
metadata:
labels:
app: dev-alinesno-cloud-shop-manage-boot
spec:
imagePullSecrets:
- name: docker-login
containers:
- name: dev-alinesno-cloud-shop-manage-boot
image: registry-vpc.cn-shenzhen.aliyuncs.com/alinesno-cloud/alinesno-cloud-shop-manage-boot:0.0.1-SNAPSHOT
ports:
- containerPort: 8080
protocol: TCP
env:
- name: SPRING_APPLICATION_NAME
value: 'alinesno-cloud-shop-manage-boot'
- name: SERVER_PORT
value: '8080'
# 环境变量的配置,这里建议与spring整合
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 60
periodSeconds: 30
timeoutSeconds: 45
imagePullPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
name: dev-alinesno-cloud-shop-manage-boot
namespace: learner-project
labels:
app: dev-alinesno-cloud-shop-manage-boot
spec:
ports:
- name: http-boot
protocol: TCP
port: 8080
targetPort: 8080
- name: dubbo-provider
protocol: TCP
port: 8180
targetPort: 8180
selector:
app: dev-alinesno-cloud-shop-manage-boot
type: ClusterIP
注意事项:
- 先在命令配置好 docker-login
- 镜像的地址是否正确
- 端口是否正确
- 这里是
application-hub.yml整合的,注意环境变量
# GithubAction 发布方式
github action 是一个优秀的,基于开源的自动化构建,相关对部分免费或者个人来说,这不失为一个较好的选择, 同时插件相当多,稳定性相对较高,当前文档的发布即通过此发布,部分配置如下:
- name: Build the Docker image
run: |
docker version
docker login --username=${{ secrets.DOCKER_USERNAME }} --password=${{ secrets.DOCKER_PASSWORD }} registry.cn-shenzhen.aliyuncs.com
docker build . --file Dockerfile --tag ${{ env.ALIYUN_CR_HOST }}/${{ env.ALIYUN_CR_NAMESPACE }}/${{ env.PRO_NAME }}:${{ env.PRO_VERSION }}
docker push ${{ env.ALIYUN_CR_HOST }}/${{ env.ALIYUN_CR_NAMESPACE }}/${{ env.PRO_NAME }}:${{ env.PRO_VERSION }}
- name: Deploy Docker multiple command
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
password: ${{ secrets.PASSWORD }}
port: ${{ secrets.PORT }}
script: |
docker rm -f ${{ env.PRO_NAME }}
docker pull ${{ env.ALIYUN_CR_HOST }}/${{ env.ALIYUN_CR_NAMESPACE }}/${{ env.PRO_NAME }}:${{ env.PRO_VERSION }}
docker run -p ${{ env.EXPOSE_PORT }}:80 --name ${{ env.PRO_NAME }} --restart="always" -d ${{ env.ALIYUN_CR_HOST }}/${{ env.ALIYUN_CR_NAMESPACE }}/${{ env.PRO_NAME }}:${{ env.PRO_VERSION }}
- name: copy k8s yaml file via ssh password
uses: appleboy/scp-action@master
with:
host: ${{ secrets.K8S_HOST }}
username: ${{ secrets.K8S_HOST_USERNAME }}
password: ${{ secrets.K8S_HOST_PASSWORD }}
port: ${{ secrets.k8S_HOST_PORT }}
source: 'k8s-dev.yaml,k8s-dev-ingress.yaml'
target: 'projects/${{ env.PRO_NAME }}'
- name: Deploy Docker to K8S
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.K8S_HOST }}
username: ${{ secrets.K8S_HOST_USERNAME }}
password: ${{ secrets.K8S_HOST_PASSWORD }}
port: ${{ secrets.k8S_HOST_PORT }}
script: |
kubectl version
kubectl apply -f projects/${{ env.PRO_NAME }}/k8s-dev.yaml
kubectl apply -f projects/${{ env.PRO_NAME }}/k8s-dev-ingress.yaml
具体可查看配置示例查看 (opens new window)
# 应用发布状态检测
应用发布状态检测是确认持续集成发布之后,业务办理是否正常的一个检测,以确保你的自动流程是正确的。 也可以使用编排工具(比如k8s)和巡检工具,但是相对来说,应用发布自检是在服务发布阶段。
以下为应用发布自检的示例说明,以http检测为例:
// 服务发布验证,这里采用http验证方式
stage("等待服务启动") {
steps {
sleep "${SLEEP_TIME}"
}
}
stage("验证服务状态") {
steps {
echo "验证服务是状态"
script {
HTTP_STATUS = sh(script: "curl --insecure -w '%{http_code}' ${HOST_URI}:${EXPOSE_PORT} -o /dev/null \
--header 'Accept: application/json'", returnStdout: true)
echo "验证服务连接返回: ${HTTP_STATUS}"
}
}
}
也可以集成tcp/response/数据库/文件等多种形式,这里不做具体的展开阐述,集成业务监控平台的效果:
# 集成钉钉通知
也可集成邮件通知,这里更加推荐 DingTalk 通知,方便一个入口运维
在 jenkins 中安装dingtalk插件,集成效果如下:
这里主要另一个考虑点是基于ChatOps的操作,集成监控自动化一体化
# 其它
- 无