# 自动发布集成

# 示例工程

系统应用集成示例工程打开 (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的操作,集成监控自动化一体化

# 其它