Hexo 使用 circle ci 部署 Posted on Apr 23, 2019
前言 最近 github 发邮件提醒我大学时白嫖的两年 github 会员到期了,提醒我降级,降级现在好像也没太大影响,毕竟微软爸爸收购 github 后把私库都免费了,也没用过私库多人协作,也够用了。
唯一的问题是当初附赠的私有库的 Travis CI 的会员也不能用了,因为我的博客源文件放在私有库,所以必须找一个替代品(到期后变为了试用版,提供 100 次构建试用)。之前一直看到过 circle ci 有人推荐,看了下是支持私有库的。免费版和收费版只是同时构建任务数的差距而已,抽空折腾了下总算折腾好了。
配置 CI 之前配置 Travis CI 写的配置文件是 yaml 格式,非常简单,在此贴出来:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 language: node_js node_js: stable install: - npm install -g firebase-tools - npm install -g hexo-cli - npm install - sed -i s/'$DEPLOY_TOKEN'/$DEPLOY_TOKEN/g _config.yml - git clone -b geekrainy https://github.com/geekrainy/hexo-theme-element.git themes/element script: - hexo azuresearch - hexo d after_success: - firebase deploy --token=${FIREBASE_API_TOKEN} branches: only: - master
做的事情不多,指定环境,下载依赖,安装主题,构建发布。
但是看了下 circle ci 的配置文件,是基于 Docker 的,概念比较多。研究一番,也写了出来:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 version: 2 jobs: build: docker: - image: circleci/node:8 working_directory: ~/rainylog-hexo steps: - checkout - run: command: | git clone -b geekrainy https://github.com/geekrainy/hexo-theme-element.git themes/element - restore_cache: keys: - dependencies-{{ checksum "package.json" }} - dependencies- - run: command: yarn - save_cache: paths: - node_modules key: dependencies-{{ checksum "package.json" }} - run: command: | yarn build yarn deploy workflows: version: 2 build_and_deploy: jobs: - build: filters: branches: only: - master
这里的 working_directory 指定的是仓库目录,然后就要指定该 job 的一些命令步骤了。这里比较特别的是可以缓存依赖目录,下次构建的时候可以大大缩短构建时间。基于 package.json 的哈希来判定依赖是否有更新,看配置文件一目了然。
和 Travis CI 不同的是,这里如果全局安装 hexo-cli
和 firebase-tools
并不能识别到 hexo
和 firebase
命令。网上的解决方式又说用 sudo 的,有说把 Npm 的全局安装路径修改再添加到 circle 用户的环境变量的。还有说构建一个自己的 Docker 镜像。个人感觉比较麻烦。
我的方案是把这些应该全局安装的工具都安装到项目依赖中,写一个 npm script 调用即可。所以上述配置文件执行了 yarn build
与 yarn deploy
,前者编译生成静态文件,后者发布到 firebase 中。npm script 的配置:
1 2 3 4 "scripts" : { "build" : "hexo azuresearch" , "deploy" : "firebase deploy --token=${FIREBASE_API_TOKEN}" } ,
还有一个不同点是在 circle ci 中可以直接读取到配置的环境变量,不用再像之前的 Travis CI 的配置文件中那样去手动 sed 进去替换了,方便了不少。
至此便可以愉快的玩耍了,关于如何将静态文件部署到 firebase,官方文档讲的很清楚,在此就不展开啦。
-EOF-
monorepo 项目改造反思
夜与梦