# 部署发布

微信云托管在部署发布采用了发布单的形式，点击发布即生成一个发布单，在发布过程中的所有操作均记做发布流水记录，让所有操作都可追溯。

部署发布流程包含 3 个子流程，即新建版本、测试、灰度上线，以下将详细说明。

## 部署前准备

1. 请先详细阅读 [开发常识](/minigame/dev/wxcloudrun/src/guide/debug/know)，确保你的场景云托管确实可支持，且你要部署的服务符合开发规范，否则无法成功部署。
2. 正式部署之前，请确保服务在本地 Docker 可以正常运行，否则线上部署一定会有问题。参考文档 [本地调试](/minigame/dev/wxcloudrun/src/guide/debug/index)。

## 发布

创建服务成功后，将在服务列表中显示对应的服务，点击该服务模块即可进入服务详情中，默认的控制台 TAB 即为「部署发布」。

### 首次发布

当前首次发布部署时，有两个子流程，即选择代码和发布。

#### 1. 选择代码

选择代码时，方式来源有 5 种，分别是：

- 绑定 Github 仓库
- 绑定 Gitlab 仓库
- 绑定 Gitee 仓库
- 手动上传代码包
- 拉取镜像

以上前 3 种，拉取代码仓库，会将信息自动保存到「服务设置 - 流水线」中，在后续发布时，可以直接选择流水线发布。

- 代码仓库/流水线的配置，请参考[服务设置 - 流水线](pipeline)。

![image-20210618190217413](https://res8.wxqcloud.qq.com.cn/wxdoc/50387271-5baf-4527-8ab6-5a2e1c74b14b.png)

- 镜像仓库的上传配置，请参考[镜像仓库](image)
- 手动上传代码包形式，配置说明如下：
  - **上传方式：** 支持代码文件夹、代码 zip 压缩包两种方式，大小不能超过 `2 MiB`；
  - **端口：** 项目部署时对外提供服务的端口
  - **目标目录：** 指定目录进行构建过程，不填为根目录
  - **DockerFile 文件：** 有文件则可以指定 Dockerfile 路径和名称，如果没有则可根据框架语言选择官方设定。

首次发布时，还会增加环境变量配置项，后续可以直接在「服务设置 - 基本信息」中修改。

#### 2. 部署发布

选择代码后，就会直接进入部署发布阶段，如果是代码上传（前 4 种），会先将代码构建为镜像，然后将镜像部署；如果是镜像上传，则直接部署。

部署过程的日志会直接显示到控制台中，如果部署出现问题，可以复制右下角的信息给我们反馈，我们会准确定位原因。

![](https://res8.wxqcloud.qq.com.cn/wxdoc/e0b7782a-efeb-4dc3-8328-8e5aebd31713.png)

首次部署时会自动将版本推到线上，接下来即可进行公网访问或者小程序调试。

![image-20210618190217413](https://res8.wxqcloud.qq.com.cn/wxdoc/8934ab30-488a-4700-9197-f6afab8c42cf.png)

### 非首次发布

服务非首次发布，已有流量在服务上，为保证现网服务的稳定性、降低发布风险及减少影响范围，新版本建议做定向测试无问题后，再按一定的流量比例进行灰度上线。

无论选择全量发布还是灰度发布，发布过程都是无损的，此过程中用户感知是平滑的，服务不会中断。

#### 1. 选择代码

选择代码与首次发布基本一致，如果再首次发布时选择了代码仓库构建，或者自己手动在「服务设置 - 流水线」中配置了流水线，则会展示如下方式：

- 执行流水线：首次时会自动保存为流水线，可以随时修改。
- 手动上传代码包
- 拉取镜像

另外在高级设置中多了「灰度发布」，如果不勾选，则部署后将自动推到现网；勾选后则进入测试灰度阶段。

![image-20210618190332019](https://res8.wxqcloud.qq.com.cn/wxdoc/1d324fa0-9ea1-43fc-8d67-989a551cab64.png)

* 点击「发布」，进入部署阶段，如果勾选了灰度发布，之后将
* 点击「取消发布」，则当前发布单结单，页面返回到运行页面；
* **非灰度发布时，会将现网流量 100% 的切到当前版本，如版本有问题或服务流量过大会导致服务崩溃，谨慎操作，建议灰度上线；**

#### 2. 部署发布

阶段与首次发布相同，不再阐述。

#### 3. 测试

选择代码时如勾选「灰度发布」则会进入此阶段，否则将在部署发布后终止。

云托管提供 OpenID 白名单、URL 参数两种测试方式。

OpenID 白名单，点击「更新测试配置」则当前 OpenID 白名单配置生效，根据所填写及勾选的所有小程序开发者的 OpenID 进行加白，对当前发布单的版本只有当前 OpenID 白名单用户可访问。

![image-20210618190424982](https://res8.wxqcloud.qq.com.cn/wxdoc/bd84a22e-406f-40bd-96d9-122130806e43.png)

URL 参数，设定 URL 参数 key 和 value（支持 Glob 表达式），点击「更新测试配置」则当前 URL 参数配置生效，符合条件的请求将路由到当前发布单的版本；

选择 URL 参数测试方式时，至少配置 1 个 key 和 value 条件。

![image-20210618190448501](https://res8.wxqcloud.qq.com.cn/wxdoc/38649a90-7dd9-4eed-bf5f-2a52a4b73340.png)

* 一旦更新测试配置，则当前流程不可返回上一步再重新选择版本
* 如需测试其他版本，则点击「取消发布」结束当前发布流程，重新点击发布选择其他版本走发布流程即可；
* 如当前版本测试无问题，则点击「灰度上线」，灰度流量比例进行上线；
* 测试步骤非必经路径，如不需对版本进行测试，则进入测试流程中时直接点击「灰度上线」，二次确认后即可跳过测试步骤；（建议版本测试后再上线）
* 如此时离开当前流程页面，下次再进来时会在控制台顶部展示部署的 banner，你可以直接点击再次回到部署过程。

#### 3. 灰度上线

调整灰度流量比例对目标发布版本进行灰度上线，点击「调整流量比例」，弹窗输入/加减（10% 粒度）流量比例，确定后，后台将把所填的流量比例切到目标发布版本上。

![image-20210618190549888](https://res8.wxqcloud.qq.com.cn/wxdoc/5d1fea39-75b3-4435-98d3-1937eb884ac9.png)

流量路由规则：用户首次进入时，按照流量比例随机进入某一个有流量的版本中，非首次进入时，该用户将一直进入到首次进入的版本中；

**例：** 版本 1 流量比例为 20%，版本 2 流量比例为 80%；用户 a 有 20% 的概率进入到版本 1 中，如此时随机到版本 1，则在下次用户 a 再访问时继续进入到版本 1 中，不会再随机到版本 2 中，直到下次发布为止。

进入灰度上线步骤后，测试配置失效，可以 OpenID 白名单的方式指定灰度用户；

![image-20210618190719403](https://res8.wxqcloud.qq.com.cn/wxdoc/e3cba8e9-9090-4841-8538-34ab5a1d7590.png)

指定后，对应的 OpenID 用户将脱离流量比例的随机路由规则，进入到当前灰度中的版本；

版本灰度的过程中，下方提供目标发布版本的监控视图、发布版本日志用作灰度上线过程中观察目标发布版本情况；

* 只支持最多 2 个版本有流量；
* 进入灰度上线后，测试阶段测试配置失效，且不可再回到上一步骤；
* 支持将灰度流量比例回调，如将 30% 调整到 10%；
* 如此时离开当前流程页面，下次再进来时还会显示当前流程页面内容；点击发布后，如不取消发布，则部署发布将一直处于发布流程中；

#### 4. 回退

在灰度上线的过程中，如发现版本存在问题，可通过「回退」终结当前发布流程，目标发布版本流量比例置零；

#### 5. 结单

目标发布版本流量比例调整到 100%，已完成发布流程，如想退出发布页面，可点击「结单」完成发布；

## 历史版本

每次进行部署发布时，都会在创建版本，你可以在控制台中看到历次的版本信息，部署日志和规格配置。

版本创建时，「服务配置 - 基础信息」里的规格、副本数、扩缩容条件、环境变量信息，会锁定在版本中，不可以再次更改。

版本分线上、线下两种状态：

- 线上时，版本会遵循配置信息，保持最小的副本数。
- 线下时，版本会无视配置信息，在下线半小时内缩容到 0，并一直保持，直到再次被推到线上。

**版本在二次回退或重新上线时，只会遵循版本创建时的配置信息，而不会读取现在的配置信息。**

除了线上版本不可删除外，其余的版本均可以删除

## WebShell

请前往[登录实例 WebShell 文档](webshell)

## 回退

回退操作可以将线上流量接入之前的版本，一般用于线上故障或业务回滚场景中。

回退时只能向前回退，即高版本回退到低版本，不可反向回退。

如果你回退操作失误，选择的版本过于低，想要回退到稍微高一点的版本，则可以新建发布单，或者在「服务设置 - 基础信息」中直接点保存，将会触发一个新的版本，然后再此新版本的基础上再重新回退到正确的版本中。

回退时会先将目标版本的实例数保持到版本创建时的最小副本数，然后再接入现网。（**在这里重复强调，是版本创建时的配置，不是回退发起时的配置**）

## 版本发布和回退的举例说明

版本发布和回退涉及的一些点，直接说明有点烧脑，在这里举一个形象的例子说明这一系列的过程和作用效果：

- 新建服务后，创建「版本-001」，服务配置为 0.5 核、1GB、副本数 1-50，扩缩容条件内存大于 60%，日志采集路径 `stdout`，环境变量 `A=1`，发布到现网。
- 此时修改配置为副本数 0-50，其他保持原样，自动触发创建「版本-002」，此时「版本-001」因为下线，缓存 2 分钟后，无视副本数设置，缩容实例为 0。
- 从「002」回退到「001」，此时先将「001」的实例数创建到当时最小副本数 1，然后接入现网，「002」版本下线，缓存 2 分钟后缩容实例为 0。
- 发布新版本，保持最后的服务配置（副本数 0-50），创建「版本-003」，此版本接入到现网，「001」下线，缓存 2 分钟后实例为 0。
- 修改服务配置为 1 核、2GB，副本数 1-50，自动触发创建「版本-004」，此时版本「003」下线，缓存 2 分钟后缩容实例为 0。
- 从「004」回退到「003」，因为「003」最小副本数为 0，所以不创建实例，直接接入现网，「004」下线，缓存 2 分钟后缩容实例为 0，无视副本数设置。
- 此时线上版本为「003」，版本所用的配置为「003」创建时的配置，即 0.5 核、1GB、副本数 0-50，扩缩容条件内存大于 60%，日志采集路径 `stdout`，环境变量 `A=1`

## 版本发布缓存说明

新版本发布成功后，旧版本还会缓存 2 分钟时间。这段短暂的时间内，你将在控制台看到新旧版本同时都有实例，且部分请求还会走到旧版本。

旧版本缓存 2 分钟再正式下线，是出于平滑过渡的考虑，且新版本上线后如果异常需要快速回滚，旧版本的缓存能立刻生效，不影响业务。
