# 版本管理

微信云托管的容器服务，整体产出路径是「项目代码」-「项目镜像」-「项目版本」-「发布部署」，版本是切实拥有运行的资源，可以直接发布到线上接入流量，而版本的新建需要镜像（即使是代码，也要先完成构建镜像后才能建立版本）

所以版本是服务发布的基础，服务内生成的所有的版本均会显示在「版本列表」中，无论版本是否有流量、是否有实例。

## 新建版本

版本的生成有两种方式：手动创建、流水线创建；以下介绍手动创建方式，流水线方式参见[流水线管理](pipeline)。

在创建服务之后，进入服务详情，点击 TAB 栏中的「版本列表」

继续点击版本列表页中的「新建版本」按钮，弹出新建框

![](https://res8.wxqcloud.qq.com.cn/wxdoc/b8b5e7ac-c5aa-4b60-86cf-9551b9889310.png)

在弹出框中，选择上传方式，配置监听端口和其他高级设置，即可新建版本。

确认新建版本后，将在版本列表中显示该版本当前进度，同时后台产生一个实例用于部署版本。

新建过程最多 2 分钟，你可以点击版本列表中「日志」按钮，看到实时的构建日志，整体分为「构建」和「部署」两个步骤（如上传方式选择“镜像拉取”，则只有部署步骤，详情请看下述第2条-镜像拉取）

以下是版本创建的细节描述：

### 1. 版本名称

版本名称不支持自定义，在版本创建时由后台生成，格式：`服务名-数字自增`，例如：`demo-001`；

### 2. 上传方式

支持本地代码包/代码库拉取/镜像拉取三种方式。

- 本地代码包：支持代码文件夹、代码 zip 压缩包两种方式，上传后，后台会对代码包进行解析并将代码构建为镜像、将镜像推送到服务下绑定的镜像仓库存储，然后基于该镜像部署到容器上；
  - 文件夹或 ZIP 压缩包上传的代码中不能超过 `2 MiB`；
  - 需要上传代码包含正确 `Dockerfile` 的代码目录；
- 代码库拉取：目前支持 [GitHub](https://github.com) 、 [GitLab](https://gitlab.com/) 、 [码云 Gitee](http://gitee.com/) 三种类型仓库，后台将从对应的仓库中拉取代码并将代码构建为镜像，将镜像推送到服务下绑定的镜像仓库存储，然后基于该镜像部署到容器上；
  - 首次使用时，需先将对应仓库授权给微信云托管，授权成功后，当前环境任意服务新建版本使用该仓库下的代码源都不再需要再次授权。
  - 微信云托管仅拉取代码不做任何其他操作，请放心使用；
  - 业务自己搭建的私人仓库因涉及需要填写账密，暂不支持，可将对应服务的代码先同步迁移至[GitHub](https://github.com) 、 [GitLab](https://gitlab.com/) 、 [码云 Gitee](http://gitee.com/) 中的私密仓库中；
- 镜像拉取：选择镜像仓库中的目标镜像，将会直接使用该镜像部署版本；
  - 镜像制作，业务可线下以任意方式构建镜像，而后手动将镜像上传至服务下的镜像仓库，参考[镜像指南](image)；
  - 也可在服务下的流水线中构建镜像，流水线构建好的镜像会自动推送到服务下绑定的镜像仓库存储；

### 3. 监听端口

应用监听端口，这与你的项目有密切关系，比如你在本地开发时，项目访问地址是 `localhost:8080`，则这里的端口就应该是 `8080`，不同的语言和框架默认的端口不同。

如果你的监听端口填写错了，将会导致版本创建失败。

如果你的一个项目内开了多个端口，建议将项目拆成多个服务，使得一个服务对应一个端口，然后在微信云托管中创建多个服务来一一对应。

### 4. 备注

用作辨识当前版本以区分与其他版本，这里自己按照自身需要填写即可，非必要

当选择代码库拉取时，备注这里会自动注入该代码仓库路径提交时的 commit message；

如选择上传代码包/镜像等方式，你未填写备注，则后台在版本生成时自动生成备注信息，格式：操作人微信昵称+时间戳

### 5. Dockerfile 文件

如果你的项目代码中包含 DockerFile，可以选择「有 DockerFile 文件」并指定 dockerfile 文件名称，需要和你在代码根目录的 Dockerfile 文件名称，默认 `Dockerfile`，如有其他命名，与该命名保持一致。

![](https://res8.wxqcloud.qq.com.cn/wxdoc/50f49409-f276-4c96-a0a3-8b908458e8bd.png)

如果你没有 Dockerfile 文件，并且对 Docker 的技术并不了解，可以选择「无 Dockerfile 文件」，并按照自己项目的语言框架，选择对应的信息。此处我们会帮助你生成适合你项目的 DockerFile 文件。

不同语言和框架需要的信息不同，以下是一些说明：

当前支持`PHP`、`Python`、`Node.js`、`JAVA`四种语言

1. PHP 语言：

   - 只支持 PHP7 及以上版本；
   - 监听端口默认写入 8080，不支持修改；
   - 代码根目录中必须包含 composer.JSON,composer.lock 两个依赖文件。具体请看[phpcomposer](https://docs.phpcomposer.com/01-basic-usage.html)，如果没有提供则默认为空。

2. Python 语言

   - 支持 Python2、Python3；
   - 代码根目录中必须有 requirement.txt，里面包含依赖项，详情参考[pip 文档](https://pip.pypa.io/en/latest/user_guide/#requirements-files)
   - 需要在「进程启动命令」中填写项目启动指令，比如 `python main.py`

3. Node.js 语言

   - 支持 node.js:lts
   - 需要在「进程启动命令」中填写项目启动指令，比如 `node index.js` 、 `npm run start`

4. Java 语言

   - 支持 `OpenJDK7(jar)` 、`OpenJDK8(jar)`、`Tomcat7-OpenJDK8(war)`、`Tomcat8-OpenJDK8(war)`
   - 需要在「进程启动命令」中填写项目启动指令，比如 `java -Djava.security.egd=file:/dev/./urandom -Dserver.port=80 -jar /app/target/test.jar`

### 6. 容器规格

可根据服务的资源消耗进行选择，一般等同于传统服务器的规格除以 2-3，比如使用 1 核 2G 的服务器，迁移过来后，可以选择规格为 0.5 核 1G，甚至还可以更少。

内存和 CPU 的搭配规则如下：

| CPU 核心数量 | 支持的内存                        |
| ------------ | --------------------------------- |
| 0.25         | 0.5GB 
 1GB 
 2GB         |
| 0.5          | 1GB 
 2GB 
 3GB 
 4GB |
| 1            | 1 - 8 GB（整数）                  |
| 2            | 4 - 16 GB（整数）                 |
| 4            | 8 - 32 GB （整数）                |
| 8            | 16 - 32 GB （整数）               |
| 12           | 24 - 48 GB （整数）               |
| 16           | 32 - 64 GB （整数）               |

容器规格的设置要与自身业务相关

- 如果规格设置过于低，一个容器实例支撑不了太大的流量，当流量增大时，就会因为弹性扩容产生更多实例副本，以维持流量服务。扩缩更加频繁，也更加灵活。
- 如果规格设置过于高，一个容器实例支撑很多流量，则流量要增加到一定程度才会触发扩容，扩缩不灵活，会造成大量浪费。

算一算，如果你的项目，低规格能承载 10 个请求，成本 1 元；高规格能承载 100 个请求，成本 10 元，若现在有 101 个请求时

低规格需要 11 个实例才能满足，因为 `10请求 * 11 = 110请求 > 101请求`，成本为 `1元 * 11 = 11元`
高规格需要 2 个实例才能满足，因为 `100请求 * 2 = 200请求 > 101请求`，成本为 `10元 * 2 = 20元`

以上低规格会更划算一些，但频繁扩缩容，会导致服务不能及时到位造成一些影响（需要看第8条，配置扩缩容条件保障），合理根据自己的项目消耗和流量，进行合理的规格配比是需要经过衡量和计算的。

### 7. 实例副本数

容器实例个数的最大最小范围阈值

- 如服务需要保证高可用，建议实例副本数最小值设为>=1；
- 如服务需要低成本，无流量时无成本，可将实例副本数最小值设为=0；当该服务 30 min 内无流量则后台会将实例副本数缩容为 0（避免流量偶然波动带来的误判）；再次冷启动时，可能有 30 秒服务延迟；
- 无论实例副本数设置多少，服务生成版本时都会先产生 1 个容器实例，版本生成后再缩容至最小值，因此**版本生成的过程中会产生一定的资源消耗**；

### 8. 扩缩容条件

目前支持 CPU 使用率、内存 使用率两种，当达到阈值时，后台会自动扩（创建）缩（删除）实例，然后检测是否再次达到条件，如果满足条件则继续扩缩容，如此反复直至实例数量达到副本个数的最小值/最大值，或不再满足扩缩容条件时停止自动扩缩容。

- 自动扩容到副本个数最大值后若仍不足以承载业务流量，即便再次达到扩缩容条件，也不会继续创建新的实例，可能导致业务受影响，请评估好业务指标，合理设定副本数最大值；
- 如需提升实例数最大值限额（大于 50），请提交工单处理；

### 9. 日志采集路径

可设置目录或文件，支持设置多个路径。采集到的日志可以在「服务管理 - 日志」中查看。支持标准输出（`stdout`）以及 `*` 通配路径（例：`/logs/*`），使用 `,`（半角逗号）分割，留空将采集标准输出。标准输出日志指的是在服务代码中将日志直接打印到控制台的标准输出(`stdout`)和标准错误(`stderr`)。

### 10. 环境变量

服务版本所需的环境变量，直接传入容器中，以 key value 的形式，可配置多个。

## 实例列表

版本在有实例运行时，会在版本的条目中，显示「实例列表」按钮，点击「实例列表」会显示当前正在运行的所有实例

针对每一个实例，都可以点击条目后的 webshell 直接进入查看。

> 不建议进入实例来进行代码的升级或其他配置变更，变更要在镜像中

有实例运行时，主要有以下两种情况：

- 版本创建成功后，实例副本数最小值大于 0，则会始终保持最小副本数的实例。如果等于 0，则只会在 30 min 内会有 1 个实例；
- 版本有线上流量接入，包括全量接入，和灰度发布过程

## 版本详情

在版本的条目中，点击「详情」蓝色链接按钮，将会显示版本详细信息，包括如下：

- 版本名称、上传方式、镜像名称
- 监听端口
- 备注
- Dockerfile 名称
- CPU 规格、内存规格
- 实例副本数
- 扩缩容条件
- 日志采集路径
- 环境变量

## 版本删除

在版本的条目中，点击「删除」蓝色链接按钮，弹出对话框并确认后即可删除版本

删除条件如下：

- 当版本个数大于 1 时，**有流量的版本不可删除**
- 当服务下仅有 1 个有流量的版本时，可支持该流量版本删除
