原文连接javascript
印记中文的成立主要是为了协助社区更好地翻译与部署文档。最近联合腾讯云一块儿设计了一套有效提高访问速度及下降流量消耗成本的方案,即 COS 对象存储服务 及 CDN 加速方案。本文主要描述方案大致的实现过程,若是你是技术文档的管理者,苦于没有优秀的文档部署方案,能够联系印记中文(docschina),咱们会提供接入服务。若是你遇到性能问题,咱们也能够提供免费的技术咨询服务css
QQ群:492361223 html
也能够关注咱们的公众号:java
官网:docschina.orgnode
通常而言,对公有代码,通常采用 Github + Travis-CI 存放及构建方式。而对于私有代码来讲,则会直接使用 Bitbucket + Pipeline (Bitbucket自有的构建服务)。(点击如下标题展开详细内容)nginx
master
分支,用于存放文档源码,另外一个是
gh-pages
分支,用于存放生成的文档文件。
.travis.yml
文件,用于 Travis-CI 构建和部署咱们的项目,下面是求全配置,表示仅在在
master
分支有
push
或者
pull request
事件的时候,才会触发构建,使用语言是
node.js
,版本是
6.x
,首先运行完安装依赖的
npm install
以后,再运行
bash ./scripts/deploy.sh
。
javascript branches: only: - master language: node_js node_js: - "6" script: - bash ./scripts/deploy.sh sudo: required install: - npm install
./scripts/deploy.sh
脚本中,主要就是承担构建、鉴权,以及代码推送的功能。
javascript // deploy.sh 第一部份,用于构建代码 npm run dist
javascript // deploy.sh 第二部份,用于与github鉴权 REPO=`git config remote.origin.url` SSH_REPO=${REPO} git config --global user.name "Travis CI" git config --global user.email "ci@travis-ci.org" git remote set-url origin "${SSH_REPO}" openssl aes-256-cbc -K $encrypted_7562052d3e34_key -iv $encrypted_7562052d3e34_iv -in scripts/deploy_key.enc -out scripts/deploy_key -d chmod 600 scripts/deploy_key eval `ssh-agent -s` ssh-add scripts/deploy_key
javascript // deploy.sh 第三部份,用于向github推送代码 chmod -R 777 node_modules/gh-pages/ npm run deploy // dist是生产代码目录,deploy 所跑脚本是 gh-pages -d dist,最终将代码推送到gh-pages 分支
javascript ssh-keygen -t rsa -b 4096 -C ci@travis-ci.org Enter file in which to save the key (/var/root/.ssh/id_rsa): deploy_key
enter
跳过。
Enter passphrase (empty for no passphrase):
deploy_key.pub
文件,将内容复制,而后到线上代码仓库
https://github.com/<your name>/<your repo>/settings/keys
中,添加 ssh public key。
javascript travis encrypt-file deploy_key
deploy.sh
中,而且将
deploy_key.enc
文件复制到
scripts
目录下。记得千万不要上传
deploy_key.pub
文件。
javascript openssl aes-256-cbc -K $encrypted_7562052d3e34_key -iv $encrypted_7562052d3e34_iv -in scripts/deploy_key.enc -out scripts/deploy_key -d
javascript travis login
https://bitbucket.org/account/user/username/ssh-keys/
,或者点击网站左下角头像,进入
Bitbucket Setting,
Security,
SSH keys,进行公钥添加。
deploy.sh
脚本,也略有一些出入。
javascript // deploy.sh 第一部份,用于构建代码 npm run dist
javascript // deploy.sh 第二部份,用于与github鉴权 REPO=`git config remote.origin.url` SSH_REPO=${REPO} git config --global --replace-all user.name "xxxxxx" git config --global --replace-all user.email "xxxxxx@gmail.com" git remote set-url origin "${SSH_REPO}" chmod 600 scripts/id_rsa eval `ssh-agent -s` ssh-add scripts/id_rsa ssh -T git@bitbucket.org
javascript // deploy.sh 第三部份,用于向github推送代码 chmod -R 777 node_modules/gh-pages/ npm run deploy // dist是生产代码目录,deploy 所跑脚本是 gh-pages -d dist,最终将代码推送到gh-pages 分支
设置 Webhook,是用于在构建完毕后,向部署服务器发起请求,触发自动部署的脚本。只要跟部署服务器约定好 url
路径,而后根据须要配置好 webhook
便可。git
Github
Webhook
设置的截图。
Bitbucket
的
Webhook
设置截图。
Vue Bucket
的文件列表页面,目前是空的。到
基础配置,中开启
静态网站配置。CNAME
解析。直接用上图的域名和
CNAME
值。
HTTP2
,还能够去申请
HTTPS
证书,腾讯云能够申请免费的
HTTPS
证书。
js, css, png, jpg
等带有
md5
的资源能够长久缓存,而
html
等资源则不宜缓存。
HTTPS
证书 和 开启
HTTP2
。
Github
或者
Bitbucket
发出来
Webhook
请求,而后根据请求参数,去运行脚本自动将文件部署到腾讯云 COS 存储服务当中。
koa + pm2
部署一个小型服务,根据参考运行腾讯云
COS
文件上传脚本,而后用
nginx
反向代理技术将请求代理到此小型服务中。
腾讯云 COS
文件上传脚本,本人推荐 Java 与 Python 版本的,尤为是 Python 版本的比较容易安装部署。
gh-pages
分支代码处,先行更新代码,而后再运行文件上传工具,将文件依次上传到
COS
服务中。
COSCMD
工具的一个简单示例:
javascript const execSync = require("child_process").execSync, moment = require("moment"), fs = require("fs-extra"), path = require("path"); // COSCMD 基本配置 const config = { "appid": "xxx", "secret_id": "xxx", "secret_key": "xxx", "timeout": 60, "max_thread": 20, }; // 执行命令方法 function exeCmd(cmd) { var result = execSync(cmd); console.log(`[${moment().format('YYYY-MM-DD HH:mm:ss')}]${result}`); } exports.index = function* () { // 从请求 url 参数中得到 project 和 cos 部署节点区域的值 const project = this.params.project || '', region = this.params.region || 'cn-east'; console.log(`[${moment().format('YYYY-MM-DD HH:mm:ss')}],${project} is starting to update. The region is ${region}!`); // gh-pages 分支代码存放位置 const codePath = path.join(`/docs/files/${project}`); if (!fs.existsSync(codePath)) { this.response.status = 400; console.log(`${codePath} does not exist`); return; } // 更新 gh-pages 文件 const updateCommand = `cd ${codePath};sudo git pull origin gh-pages;sudo git reset --hard gh-pages;`; exeCmd(updateCommand); // 更新 COSCMD 配置 const configCommand = `coscmd config -a ${config.secret_id} -s ${config.secret_key} -u ${config.appid} -b ${project} -r ${region} -m ${config.max_thread}`; exeCmd(configCommand); // 筛选要上传的文件或文件夹 let info = fs.readdirSync(`/docs/files/${project}`, 'utf-8'); info = info.filter((item) => { if (item.indexOf('.') === 0) { return false; } return true; }); // COSCMD 上传文件 info.forEach((item) => { let syncCommand = ''; let stat = fs.statSync(path.join(`/docs/files/${project}/${item}`)); if (stat.isDirectory()) { syncCommand = `sudo coscmd upload -r /docs/files/${project}/${item} ${item}/`; } else { syncCommand = `sudo coscmd upload /docs/files/${project}/${item} ${item}`; } exeCmd(syncCommand); }); this.body = "success";