prod 环境方案
流程
前置条件
- 测试人员在预发布环境下再次验证功能,团队做上线前的其他准备工作
主流程
-
功能验证通过,相关人员合并 Pull Request
-
(可选项 1)此时 CI 收到 main 分支的 push 事件(由 merge pull_request 产生)
- CI 将做语义化发布,对 main 分支最新 commit 自动打上版本号并书写 ChangeLog
- 只在代码托管平台是 github 和 gitlab 时可以使用
-
(可选项 2)在代码托管平台界面对 main 分支的最新 commit 做 Releas 并打上 tag
-
-
在选项 1 或者选项 2 执行后
- 此时 CI 收到 main 分支的 tag 事件
- 构建镜像并推送到镜像仓库
- 部署到 prod 服务器(生产环境)
- 通知目标服务器拉取哪个镜像
- 如果正在运行容器,则删除
- 如果已存在当前镜像,则删除
- 目标服务器拉取 registry 的镜像
- 把拉取下来的镜像运行成容器
- 通知 k8s 更新
- 通知目标服务器拉取哪个镜像
- 此时 CI 收到 main 分支的 tag 事件
备注
- main 分支禁止主动 Push
- 合代码通过 Pull Request
drone yaml 配置示例
需要准备的 secret
- staging_host
- staging_ssh_key
- gitea_token
配置代码
# ---
# 如果代码托管平台是 github / gitlab 可以使用语义化发布插件
# kind: pipeline
# type: docker
# name: main-merge-pull-request-prod
# platform:
# os: linux
# arch: amd64
# trigger:
# branch:
# include:
# - main
# event:
# include:
# - push
# clone:
# disable: true
# steps:
# - name: semantic-release
# image: gtramontina/semantic-release:17.4.3
# environment:
# GITHUB_TOKEN:
# from_secret: gitea_token
# entrypoint:
# - semantic-release
---
kind: pipeline
type: docker
name: main-tag-prod
platform:
os: linux
arch: amd64
trigger:
# 备注:如果 event 为 tag,则不能写 branch 条件,否则会导致 tag event 失效
event:
include:
- tag
clone:
disable: true
steps:
- name: clone-repo
image: alpine/git
commands:
- git clone ${DRONE_GIT_HTTP_URL} .
- git checkout ${DRONE_BRANCH}
- name: build-and-push-image
image: plugins/docker
settings:
registry:
from_secret: docker_registry
username:
from_secret: docker_username
password:
from_secret: docker_password
repo: gitea.bearcatlog.com/bryant/admin-service
context: .
dockerfile: ./Dockerfile
tags:
- ${DRONE_TAG}
purge: true
compress: true
# TODO 通知 k8s 更新