V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yuanfnadi
V2EX  ›  程序员

利用 Daocloud 完成 Hexo 的持续部署

  •  
  •   yuanfnadi · 2017-08-11 21:33:17 +08:00 · 3153 次点击
    这是一个创建于 2664 天前的主题,其中的信息可能已经有所发展或是发生改变。

    原文链接 http://blog.diamondyuan.com/2017/08/10/Continuous_Deployment_for_Hexo/

    本文不仅限于 hexo,可以适用于任何项目。

    因为买了阿里云的服务器,而且受不了 Github 的速度,就准备把自己的博客迁移到国内的网站。而且把网站放在 docker 里以后,无论在哪台服务器,只要安装了 docker,都可以很快捷得部署自己的博客。之前先说一下

    思路,一开始我是把 blog 的源码(不含 node_modules )直接 copy 到 hexo 的镜像中,然后下载 npm 的模块,再执行 generate。执行完以后把 public 目录下的文件全部复制到一个 nginx 的镜像下面。需要部署的时候,只需要拉取那个 nginx 镜像就可以了。

    但是这样有一个缺点,每次更新博客,都要重新下载一遍 node_modules。如果不换国内源的话,发布一次要等很久。于是就换了一个思路。因为博客的依赖基本上是不变的,package-lock.json 与 package.json 基本上不更新,所以可以先把这两个文件复制到 hexo 里面,预先下载好,生成一个新的 base 镜像。每次发布的时候,都从这个镜像开始动手。只需要 hexo g。然后就可以把 public 文件提取了。build 速度从原来的 7 分钟提升到了 40 秒。等依赖或者插件更新的时候,可以手动更新一下 base 镜像。

    思路有了,那就开始动手布置吧。详细文件可以看我的 Github 希望大家喜欢的话可以 star。

    首先是 base 镜像,除非添加新的插件或者 hexo 更新,不然基本上不会替换。

    FROM emitting/hexo
    MAINTAINER FandiYuan  <[email protected]>
    ADD package-lock.json /temp/
    ADD package.json /temp/
    RUN cd /temp && \
        npm install
    CMD ["bash"]
    

    构建镜像,主要基于 base 镜像是把博客源码复制进去,然后生成 public 文件。

    FROM daocloud.io/diamondyuan/blog-base:latest
    MAINTAINER FandiYuan  <[email protected]>
    ADD / /blog
    RUN mv /temp/node_modules /blog/node_modules && \
        hexo g
    CMD ["bash"]
    

    发布镜像 把博客的 html 文件复制到 nginx 镜像中。

    如果是部署在 github,那么可以把这个文件替换成一个有 git 的镜像,把代码提交到 git 中。

    FROM nginx:stable-alpine
    MAINTAINER FandiYuan  <[email protected]>
    copy /blog/public/ /usr/share/nginx/html/
    

    本来这样就可以了,原本是准备自己造一套轮子的,但是后来实在是嫌麻烦,就直接用了 daocloud 的服务,反正也不要钱,还可以为自己服务器节约一些硬盘。如果用 docker 官方的 hub,我不是很清楚提取文件和打包应该如何,可能需要自己在本机写一下脚本吧。其他的博客生成器使用思路都差不多,只需要改一下 dockerfile 的命令就好了。

    窝在 daocloud 上建了两个项目。blog 和 blog-base。都关联了 github。还有两个 ymal 文件,直接贴出来。

    第一个是 blog-base 的流程,只有装新的插件而且打 tag 以后,才会触发这项目,更新 base。

    version: 3
    stages:
    - 构建阶段
    默认构建任务:
      label: release-image
      stage: 构建阶段
      job_type: image_build
      only:
        tags:
        - .*
      build_dir: /
      cache: true
      dockerfile_path: /Dockerfile/Dockerfile.base.build
    

    第二个上 blog 项目,用了两个 dockerfile。每次更新代码会先临时生成一个镜像,提取出 public 文件后复制到 nginx 的镜像中。这些操作都在 daocloud 的服务器上完成,不需要占用自己电脑的空间。我一个空的 hexo 博客+nginx 大约是 15mb。而一个 node+hexo 的镜像在 700mb 左右。

    version: 3
    stages:
    - build
    lite-build:
      stage: build
      job_type: lite_image_build
      only:
        branches:
        - ^master$
      compile:
        build_dir: /
        dockerfile_path: /Dockerfile/Dockerfile.build
      extract:
      - /blog
      package:
        build_dir: /
        dockerfile_path: /Dockerfile/Dockerfile.deploy
    

    最后只需要拉取最终生成的镜像,就可以在任何电脑上布置自己的博客了。更新博客的话只需要往 hexo/source/_posts 里添加一篇文件并且 push 到 github,就会自动触发 daocloud,构建一个新的博客镜像。基于这个镜像,窝在 daocloud 上发布了一个应用,并且设置为自动更新。每次有新的镜像出来就会自动拉取镜像到我的阿里云上,并且发布。

    这个思路可以用在任何的项目上,比如我司的 JAVA 项目,就是把源码拷贝到一个 gradle 的镜像里,构建好以后提取 jar 出来,再放到一个只有 jre 的镜像中。可以缩小最终生成的 docker 镜像的大小。

    另外有一个求助,我 github 上的博客遇到了问题。 不知道为什么,这个页面的图片有时候会刷新出来,有时候就消失了。是用了 jamespan 写得 hexo 插件。而且其他人用这个插件没问题,只有我自己会这样。一直无法解决感觉好难受。还有其他类似的服务或者插件有这种功能吗?

    第 1 条附言  ·  2017-12-22 17:49:15 +08:00
    博客域名 blog.yfd.im
    10 条回复    2017-08-12 12:30:07 +08:00
    yuanfnadi
        1
    yuanfnadi  
    OP
       2017-08-11 21:35:06 +08:00
    全部的超链接居然都没了。
    1 http://diamondyuan.com/favorite/ 照片流
    2 博客源文件 https://github.com/GeorgeYuen/blog
    neoFelhz
        2
    neoFelhz  
       2017-08-11 23:14:32 +08:00 via Android   ❤️ 5
    让我前排装几个逼:
    《使用 DaoCloud 让 Hexo 持续集成》 https://blog.nfz.moe/archives/hexo-auto-deploy-with-daocloud.html
    《用 Flow.CI 让 Hexo 持续集成》 https://blog.nfz.moe/archives/hexo-auto-deploy-with-flow-ci.html
    《使用 Gitlab CI 实现 Hexo 持续部署》 https://blog.nfz.moe/archives/hexo-auto-deploy-with-gitlab-ci.html
    《使用 Travis CI 持续构建 Hexo 》 https://blog.nfz.moe/archives/hexo-auto-deploy-with-travis-ci.html
    我博客的 Repo 地址: https://github.com/neoFelhz/MyBlog

    说实话,论使用 CI 持续集成 Hexo,我不认为有人比我更有经验。
    codermagefox
        3
    codermagefox  
       2017-08-11 23:17:03 +08:00
    就是因为有这么多破事,我选择用 leanote...
    acrisliu
        4
    acrisliu  
       2017-08-11 23:19:12 +08:00
    一直是 Docker + Jenkins 自动构建和部署
    HypoChen
        5
    HypoChen  
       2017-08-11 23:25:50 +08:00
    如果有公共依赖的话,有个 Base 镜像是个好主意。
    如果还是需要下载依赖的话,这是个提速的好东西: http://guide.daocloud.io/dcs/nexus-12003450.html
    cnnblike
        6
    cnnblike  
       2017-08-11 23:44:56 +08:00
    @acrisliu 试试用 drone.ci ,轻量+可以用代码描述
    ryd994
        7
    ryd994  
       2017-08-12 01:07:48 +08:00
    构建镜像………
    其实你只需要 webhook+运行而已……
    winglight2016
        8
    winglight2016  
       2017-08-12 11:27:08 +08:00
    想优化 node module 下载速度,可以使用 yarn,基本上无缝使用
    neoFelhz
        9
    neoFelhz  
       2017-08-12 11:59:39 +08:00 via Android
    对了,node 镜像用 Alpine Linux,可以大大减小 docker image 大小,有效加快构建速度。
    yuanfnadi
        10
    yuanfnadi  
    OP
       2017-08-12 12:30:07 +08:00
    @neoFelhz 不需要了。反正 blog-base 用的是缓存。发布的用的是 alpine-nginx
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3660 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 00:50 · PVG 08:50 · LAX 16:50 · JFK 19:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.