<p align="center">
  <img src="images/favicon.ico" width="128" alt="PingCAP Logo" />
</p>
<h1 align="center">PingCAP Chinese CMS Website</h1>

<p align="center">The CMS website of PingCAP. Powered by Strapi️.</p>

## How to development

Into project, run:

```sh
yarn && yarn develop
```

## Git Flow
Trunk-based Development

[Document](https://trunkbaseddevelopment.com)

## Commit Specification

```
[<Author name>]<commit type><#story number> <description>
```

🌰
```
[MyName]feat:#PCW-28 created news page
```

### Commit Type

```shell
chore: add Oyster build script
docs: explain hat wobble
feat: add beta sequence
fix: remove broken confirmation message
refactor: share logic between 4d3d3d3 and flarhgunnstow
style: convert tabs to spaces
test: ensure Tayne retains clothing
```
## 启动项目需要的环境变量列表及必要说明
```
ADMIN_JWT_SECRET：足够长的随机数，运行时用于给用户颁发令牌，更换不会造成影响
DATABASE_HOST：
DATABASE_PORT：
DATABASE_NAME：
DATABASE_USERNAME：
DATABASE_PASSWORD：
OSS_ACCESS_KEY_ID：
OSS_ACCESS_KEY_SECRET：
OSS_REGION：
OSS_BUCKET：
OSS_UPLOAD_PAT：
OSS_BASE_URL：OSS bucket对应的域名：https://www-website-strapi.oss-cn-shanghai.aliyuncs.com
CDN_BASE_URL：CDN 加速域名：https://img1.www.pingcap.com
PIPELINE_PRE_STATUS：获取preview环境部署状态的url
PIPELINE_PROD_STATUS：获取prod环境部署状态的url
PIPELINE_PRE_DEPLOY：触发构建preview环境的url
PIPELINE_PROD_DEPLOY：触发构建prod环境的url
PIPELINE_USER_USR：CI认证用户名
PIPELINE_USER_PSW：CI认证密码
PIPELINE_TOKEN：构建触发使用token，preview和prod值一样
```
非credential的值都配置在jenkins的环境变量里，credential配置在jenkins的凭证下
## 关于CDN加速

由于在最后一天才拿到OSS的CDN加速域名，此时所有配置好的数据已经落库。
所以采用的使OSS的CDN加速生效的方案是在middleware层```./middlewares/cdnUrlReplacer/index.js```依据前端构建需要的API 白名单，将所有API响应的reponse中的原OSS地址替换成CDN地址。
所以如果遇到阿里CDN挂掉等极端情况可以在 ```./config/middleware.js```中将对应的中间件disable掉，或者在CI上将CDN_BASE_URL设置成和OSS_BASE_URL。两种方式都需要在新配置生效后重新构建前端。

## 关于Gatsby构建的不合理设计

Gatsby构建使用的获取strapi数据的插件在设计上存在缺陷，strapi返回的所有media类型中，凡是带有mime字段的，Gatsby无论构建中是否会使用到该数据，都会将该资源拉倒本地。
举个例子：strapi通过插件向阿里OSS上传一个1G的视频并落库到本地，存储下对应的OSS链接，我们期望的是，Gatsby在构建的时候将对应的url链接放到html标签的src上就行，但事实是，Gatsby在构建的时候会将这个1G的文件下载到本地，然后完全忽略它。
这个下载动作会导致构建超时。
解决方案：重写了对应有大视频的api响应，只返回对应的url，忽略了其它mime之类的数据。
_见 cases-cooperation-story 和 static-doc-resource_

## 关于触发CI:
前端定制UI加自定义api，API在```./api/deploy-ci```

## 关于自定义admin-ui
Strapi支持自定义UI，做法是将需要自定义的部分对应的源码拷贝到项目```./admin```目录下，再进行自己的修改。参考： https://strapi.io/documentation/developer-docs/latest/guides/custom-admin.html#update-the-admin-home-page

## Authors
PingCAP


