v0.2方向指南(已归档)


技术达成

本版本需要完成自动化 CI/CD,


 ①              ②               ③              ④
开发 ---> gitlab.itzkp.com ---> GitHub ---> notes.itzkp.com

其中  ②③ 步骤借助于 jenkins.itzkp.com 的功能进行构建,最终效果是达成 ④


CI/CD 具体细节

  • 1.本地开发提交到GitLab上之后,触发 任务1,Jenkins会将 GitLab提交内容,提交到 GiHub
  • 2.GitHub提交成功之后,触发 任务2,Jenkins 会将GitHub上的文件拉取到本地(阿里云服务器),然后借助Node程序,根据规则生成正确的静态文件,然后打包发到 腾讯云服务器(notes.itzkp.com环境),重启pm2(如果可以直接替换内容的话,可能不需要重启)

Node中间处理程序具体规则

var fs = require("fs");
var path = require('path')
var stat = fs.stat;

// 首页介绍文档模板
let dataReadme = `---
home: true
heroImage: https://itzkp-1253302184.cos.ap-beijing.myqcloud.com/github%E5%9B%BE%E7%89%87/notes/3.png
actionText: 🔥速查 →
actionLink: /1.quickcheck/
features:
- title: 快速查阅
  details: 多节点CDN加速,让网站访问速度更快;优化目录结构,让用户查阅更快
- title: 保证网站高度可用
  details: 自动化工具实现CI/CD,快速更新此网站,不断成长,不断完善,给用户越来越优质的体验
- title: 项目思想核心
  details: 学过的东西,时间花一遍就行,剩下的交给此项目,不担心遗忘,举一反三,触类旁通,这是项目达到的最终效果,此项目可能达不到最终效果,但是作为另一个可以达到此效果项目(no996happy)的前置知识库还是可以的
footer: MIT Licensed | © Copyright 2019 朱昆鹏 - All Rights Reserved
---`

function init() {

  // 判断如果有docs目录,就删除掉 docs目录
  // node 只可以删除空文件夹和文件 ,所以只可以递归删除文件夹下文件
  if (fs.existsSync(path.join(__dirname,'docs'))) {
    delDir(path.join(__dirname,'docs'))
  }

  // 创建目录
  fs.mkdirSync(path.join(__dirname, 'docs'))
  fs.mkdirSync(path.join(__dirname, './docs/.vuepress'))
  console.log('1.如果上面没有报错,文件夹就创建成功 (同步)')

  // 复制 1.quickcheck && 2.note 到 docs目录下(涉及到node文件夹的复制)
  exists('./1.quickcheck','./docs/1.quickcheck',copy) // 文件夹复制
  exists('./2.note','./docs/2.note',copy) // 文件夹复制
  console.log('2.文件夹复制成功 (异步)')


  // 0 复制 README.md 到 docs/下面,要不会vuepress会产生404
  fs.writeFile('./docs/README.md', dataReadme,  function(err) {
    if (err) {
      return console.error(err);
    }
    console.log('0. README.md写入成功(异步)')
  })

  // ① :将 record.md 内容复制到 1.quickcheck 和 2.note下,并且名字都叫做 README.md
  // 异步读取
  fs.readFile('record.md', function (err, data) {
    
    if (err) {
        return console.error(err);
    }
    // console.log("异步读取: " + data.toString());

    // 异步写入
    fs.writeFile('./docs/1.quickcheck/README.md', data,  function(err) {
      if (err) {
          return console.error(err);
      }
      console.log("4.quickcheck README.md 数据写入成功! (异步)");
    });

    fs.writeFile('./docs/2.note/README.md', data,  function(err) {
      if (err) {
          return console.error(err);
      }
      console.log("5.note README.md 数据写入成功! (异步)");
    });

  });


  // ② 遍历 1.quickcheck 和 2.note 文件夹,生成路径导航

  // 读取目录,并根据此生成规则写入 config.js中
  let strOne = ''
  let one = fs.readdirSync('./1.quickcheck')
  one.forEach(item => {
      if (!/.md/.test(item) && item !== '.DS_Store') {

        let files2 = []
        let files2Str = ''
        fs.readdirSync(path.join('./1.quickcheck', item)).forEach( item1 => {
          // Mac系统下的问题
          if (item1 !== '.DS_Store') {
            files2.push(`${path.join(path.join('./1.quickcheck', item), item1)}`)
          }
        })

        files2.forEach( item2 => {
          files2Str += `
          '${item2}',`
        })

        strOne += `
          {
            title: '${item}',
            children: [${files2Str}]
          },
        `
      }
  })

  let strTwo = ''
  let two = fs.readdirSync('./2.note')
  two.forEach(item => {
      if (!/.md/.test(item) && item !== '.DS_Store') {

        let files2 = []
        let files2Str = ''
        fs.readdirSync(path.join('./2.note', item)).forEach( item1 => {
          // Mac系统下的问题
          if (item1 !== '.DS_Store') {
            files2.push(`${path.join(path.join('./2.note', item), item1)}`)
          }
        })

        files2.forEach( item2 => {
          files2Str += `
          '${item2}',`
        })

        strTwo += `
          {
            title: '${item}',
            children: [${files2Str}]
          },
        `
      }
  })

  // 写入
  let configStr = `
  module.exports = {
    title: 'Notes',
    description: '知识速查(了不起的个人工具库)',
    head: [
      ['link', { rel: 'icon', href: '/favicon.ico' }]
    ],
    themeConfig: {
      repo: 'https://github.com/zhukunpenglinyutong/notes',
      //导航
      nav: [
        { text: '速查', link: '/1.quickcheck/' },
        { text: '笔记', link: '/2.note/' }
      ],
      // 侧边栏
      sidebar: {
        '/1.quickcheck': [
          ${strOne}
        ],
        '/2.note': [
          ${strTwo}
        ]
      }
    },
    serviceWorker: true,
  }
  `

  fs.writeFile('./docs/.vuepress/config.js', configStr,  function(err) {
    if (err) {
        return console.error(err);
    }
    console.log("3.configStr 数据写入成功!(异步)");
  })

}

// 复制文件夹的辅助函数
function copy (src, dst) {
  //读取目录
  fs.readdir(src,function(err,paths){
      // console.log(paths)
      if(err){
          throw err;
      }
      paths.forEach(function(path){
          var _src=src+'/'+path;
          var _dst=dst+'/'+path;
          var readable;
          var writable;
          stat(_src,function(err,st){
              if(err){
                  throw err;
              }
              
              if(st.isFile()){
                  readable=fs.createReadStream(_src);//创建读取流
                  writable=fs.createWriteStream(_dst);//创建写入流
                  readable.pipe(writable);
              }else if(st.isDirectory()){
                  exists(_src,_dst,copy);
              }
          });
      });
  });
}
// 复制文件夹(主)
function exists (src, dst, callback) {
  //测试某个路径下文件是否存在
  fs.exists(dst,function(exists){
      if(exists){//不存在
          callback(src,dst);
      }else{//存在
          fs.mkdir(dst,function(){//创建目录
              callback(src,dst)
          })
      }
  })
}

// 删除文件夹
function delDir(path){
  let files = [];
  if(fs.existsSync(path)){
      files = fs.readdirSync(path);
      files.forEach((file, index) => {
          let curPath = path + "/" + file;
          if(fs.statSync(curPath).isDirectory()){
              delDir(curPath); //递归删除文件夹
          } else {
              fs.unlinkSync(curPath); //删除文件
          }
      });
      fs.rmdirSync(path);
  }
}

init() // 启动


使用


CI/CD 具体细节(简易版)


- jenkins.itzkp.com

配置 Jenkins ---> notes.itzkp.com 服务器 免密登录,Jenkins服务器上打包完成之后,将文件发送到 notes服务器上面

原来是想在其他服务器上配置 Jenkins 的,但是可惜,远程传输这块不会,spc 可以传,但是不能进行覆盖文件夹的操作!!!,所以打算在 notes.itzkp.com  服务器上配置 Jenkins


// // 整体思路梳理
// ① Jenkins检测 GitHub钩子,触发之后,将 GitHub上的文件下载到 腾讯云上面,
// ② 然后执行 Node处理程序
// ③ 然后重启 pm2

// // 预计问题思考
// ① Jenkins放到 阿里云服务器上,是否能控制到 腾讯云服务器上的信息(本地的我试过,可以,sh脚本也没问题)
// ② 集成错误还有邮件信息的发送,Jenkins我还不太会

实现sh代码


npm install

npm run build

rm -rf /notes/dist

cp -r ./docs/.vuepress/dist/ /notes/


开发周期预估

  • v0.2 版本,要有一条完善的 CI/CD 链路,才能作为最基础的支撑(预计完成6月20日左右) 🔥

  • 更改:2016.6.16 借助Jenkins实现简单的CI/CD,可归档(v0.3版本增加很多方法然后归档)


后记

不可否认的自高考以来我的学习水平就一直降低很多,要不说有的高中学习能力好的人,在大学之后的职场生活中学习的也非常的棒,这里我深切的感受到是学习方法的问题

举例一:我高中就不喜欢总结,因为高中是体育特长生,早上晚上都在训练,上课也比较疲惫,能跟上老师讲课就可以了,高考前受伤体育没考了,走的正常分数线,但是......,高中不喜欢总结,于是成绩不理想,压线过了本科线但是没报上,上了专科,在专科这几年因为参与了很多事情,导致我对于学习方法这块一直没有思考过,甚至也没有认识到其中的重要性,最近准备换工作了(还能待一些时间),有时间静下来思考一下了

我发现,我核心的学习方法中有一个重大误区,就是学习到一个知识点之后,就沾沾自喜,自以为是,于是乎,我经常被这种喜悦冲击,导致我不记录当时理解时候的感悟,这样就导致了我很长时间之后可能会有一个知识的遗忘,然后如果还需要学习的话,可能还需要花同样的时间,这......就非常的可怕了

举例二:高考我有一门学科比较好,对的试卷,应该是满分💯,就是理综里面的生物,为什么这个分数很高呢,因为这个是我唯一一个整理笔记,然后不断重构笔记的学科(重构了3次以上,每次都是重写一份,写厚,再写薄,在写厚),那时候距离高考只有1个月了,我用了同样的方法在数学身上,结果成绩提高了50多分,这也很大程度上,让我压线过了本科线,但可惜没报上,但是不后悔,要说后悔的,就是我最近,已经过去三年了,我才意识到这个学习模型的重要性,记录 ---> 重构(不断优化)---> 记录

分析:上面的那个模型蕴含着,理解,复习,记录,一系列很重要的东西,看似很简单,似乎触手可及,但这些都是我目前或缺的,所以 v0.2 方向的目标是 做最好的速查笔记(并不断完善)