目的
实现思路
(第一次接触OSS和SemaphoreCI,第一反应是一脸懵逼,。。。。。)先了解SemaphoreCI和阿里云OSS是什么吧!
======== 实现脚本(上传文件到哪里,怎么上传,如何控制上传文件的数量大小,) ======== 本地如何运行脚本 ======== CI上部署
实现路径
利用OSS的官方文档查看API并提取目标API(如本地上传文件API)实现脚本。阿里云OSS中包含各种API并支持各种编程语言,可根据需求选择(本次我们使用的是nodejs)。具体代码如下所示:
const OSS = require('ali-oss');
const fs = require('fs');
const child_process = require('child_process');
// 目标文件的相对路径
const remoteResourcePath = './dist';
// OSS配置
const client = new OSS({
region: 'oss-cn-shenzhen',
accessKeyId: process.env.ALIYUN_ACCESS_KEY_ID,
accessKeySecret: process.env.ALIYUN_ACCESS_KEY_SECRET,
bucket: 'xunlugaokao-school',
});
client.useBucket('xunlugaokao-school');
function adjustUploadFilesOrder(filesArray) {
// 上传所有文件
...
}
function uploadStaticResource(filesArray){
const version = child_process.execSync("git describe --tag",{shell:true,encoding:"utf8"}).replace(/[\r\n]/g,"");
filesArray && filesArray.forEach(e => {
const stat = fs.lstatSync(`./dist/${e}`);
// e是文件还是文件夹
if(stat.isDirectory()) {
// 读static中的文件并依次上传
const files = fs.readdirSync(`./dist/${e}`);
files.forEach(item => {
// 文件加上版本号
const newName = item.split('.').splice(-1).shift() === 'html'? `${item}`:`${version}/${e}/${item}`;
client.put(newName,`${remoteResourcePath}/${e}/${item}`);
})
}else {
const newName = e.split('.').splice(-1).shift() === 'html'? `${e}`:`${version}/${e}`;
client.put(newName,`${remoteResourcePath}/${e}`);
}
})
client.put(`index_${version}.html`,`${remoteResourcePath}/index.html`);
}
function deploy() {
try {
const filesArray = fs.readdirSync(remoteResourcePath);
const files = adjustUploadFilesOrder(filesArray)
uploadStaticResource(files);
} catch (err) {
console.log (err);
}
}
deploy()
脚本实现后,在本地运行验证脚本成功。。。。
package.json中配置scripts命令,npm run deploy即可运行脚本。
"deploy": "node deploy.js"
进入semaphoreCI官网,semaphoreCI是一个可以帮助你自动运行设置的命令的“小机器人”,添加project后按照文档指示添加你需要运行的命令。
CI部署,参考deploy your application实现运行脚本文件
感想
最开始的时候,是在是不知道怎么下手,完成后回头看呢,...。。。不过如此。。。。。
- 遇到问题,首先应该明确目的,明确后一步一步来就没想象中的那么难。
- 多读官方文档,仔细,认真。