相信很多程序员喜欢用 GitBook 来写电子书、教程或者博客,看了不少文章,貌似都缺少说明如何将 GitBook 部署到版本库,并自动在服务器上 build,然后将生成的静态网站部署到云服务器上。

所以,今天就记录下我是如何一步步将 GitBook 发布到自己的云服务器上的。

首先需要借助的工具有:

  1. GitBook
  2. GitLab
  3. GitLab Runner
  4. Nginx
  5. 云服务器 (如:阿里云服务器)
  6. Docker
  7. 域名

本地开发

很多教程都写过如何在本地初始化 GitBook 开始写文档。这里简单描述。

初始化 gitbook init 后,生成两个文件:README.mdSUMMARY.mdREADME.md 应该不陌生,就是说明文档,而 SUMMARY.md 其实就是书的章节目录。

有了这两个文件还不够,我们必须要初始化一些我们自己的信息,这时候就需要创建文件:book.json,看看我的配置文件:

  1. {
  2. "language": "zh",
  3. "plugins": ["tbfed-pagefooter", "sitemap-general", "rss", "copy-code-button", "disqus", "donate", "custom-js-css", "highlight"],
  4. "pluginsConfig": {
  5. "custom-js-css": {
  6. "js": [
  7. "./bootstrap4/js/bootstrap.bundle.min.js",
  8. "./bootstrap4/js/bootstrap.min.js"
  9. ],
  10. "css": [
  11. "./bootstrap4/css/bootstrap-grid.min.css",
  12. "./bootstrap4/css/bootstrap-reboot.min.css",
  13. "./bootstrap4/css/bootstrap.min.css"
  14. ]
  15. },
  16. "donate": {
  17. "wechat": "/images/wechat.jpeg",
  18. "alipay": "/images/alipay.jpeg",
  19. "title": "觉得不错点个赞",
  20. "button": "点赞"
  21. },
  22. "disqus": {
  23. "shortName": "coding"
  24. },
  25. "rss": {
  26. "title": "coding01 自我量化",
  27. "description": "coding01 自我量化",
  28. "author": "叶梅树",
  29. "feed_url": "https://ziwolianghua.coding01.cn/rss",
  30. "site_url": "https://ziwolianghua.coding01.cn/",
  31. "managingEditor": "yemeishu@126.com",
  32. "webMaster": "yemeishu@126.com",
  33. "categories": [
  34. "ziwolianghua"
  35. ]
  36. },
  37. "sitemap-general": {
  38. "prefix": "https://ziwolianghua.coding01.cn"
  39. },
  40. "tbfed-pagefooter": {
  41. "copyright":"Copyright &copy coding01 2018",
  42. "modify_label": "该文件修订时间:",
  43. "modify_format": "2019-11-3 21:20:20"
  44. }
  45. }
  46. }

这里主要用到的插件有:

  1. "tbfed-pagefooter", "sitemap-general", "rss", "copy-code-button", "disqus", "donate", "custom-js-css", "highlight"

这些插件完全可以根据自己的情况而定,当然,我们也选择了一些自定义 jscss,整个结构如下:

我们可以安装插件看看执行效果了:

  1. gitbook install && gitbook serve

接下来可以写两个文件:简介和开篇。

看我们的 SUMMARY.md 文件:

  1. # Summary
  2. ## [介绍](README.md)
  3. ## 1. 理论
  4. ### 1.1 开篇
  5. * [1.1.1 前言](1.1.1.md)

也可以看看 README.md 内容:

  1. # 自动化自我量化
  2. ## 关于系统
  3. 由于我使用的是 iPhone + rMBP + Apple Watch ,所以本文的大部分内容是基于 Apple 生态下写的,如果你是 Android 生态设备,可以尝试类似的工具和方法论。
  4. ## 关于作者
  5. > coding01 自由程序员
  6. ## LICENSE
  7. ![知识共享许可协议 Figure: 知识共享许可协议](https://i.creativecommons.org/l/by-nc-nd/4.0/88x31.png)
  8. [知识共享许可协议 Figure: 知识共享许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/)

效果如下:

这里我放了一篇我之前写好的 「前言」,基本满足自定义的样式效果:

到此,基本的 GitBook 本地制作完成,下一步就看如何部署到服务器上了。

由于我自己有云服务器,所以推荐使用 GitLab 做代码版本控制,然后把 GitBook 电子书静态文件也部署到自己服务器上,配置自定义域名访问。

这里重点不是说如何部署 GitLab,而是说另一个问题,因为 GitBook build 之后的实际上是纯静态网站,可以直接使用 Nginx 或其他来配置域名直接访问。

所以这里的难点是,如何将代码 commit 到 GitLab 后,直接 gitbook build 产生静态网站内容,放置指定的路径下,提供 Nginx 等解析。

这里推荐使用「Gitlab Runner」。

Gitlab Runner

如果我们自己已经使用Gitlab docker 环境,或者看我之前的 blog,应该知道我是基于 Laradock,所以直接注册一个 Gitlab Runner。

在注册之前,需要拿到该 Gitlab 项目的 Gitlab Runner token:

然后注册一个 Gitlab Runner:

  1. dc exec gitlab-runner gitlab-runner register

注:一样的,你也可以直接进入 Gitlab Runner 容器,在配置文件中添加。

创建后,即可以在项目设置中看到:

这里,我们使用 docker 模式,创建 node 镜像,供下文的 GitBook 编译,生成静态网站。

好了,接下来就是编写 .gitlab-ci.yml 文件了:

  1. image: node:latest
  2. build:
  3. stage: build
  4. artifacts:
  5. paths:
  6. - _book
  7. script:
  8. - npm install gitbook-cli -g
  9. - gitbook install
  10. - gitbook build
  11. tags:
  12. - build
  13. test:
  14. stage: test
  15. script:
  16. - echo "no tests."
  17. tags:
  18. - test
  19. deploy:
  20. stage: deploy
  21. script:
  22. - rm -rf /var/www/ziwolianghua/*
  23. - cd _book
  24. - cp -rf . /var/www/ziwolianghua
  25. - echo "发布成功!"
  26. tags:
  27. - deploy
  28. only:
  29. - master

这里配置了三个 tag:build、test 和 deploy,和 GitLab Runner 设置的 tags 配合使用。当满足 build、test 时,就会触发我们刚才定义的 ziwolianghua_build_test Runner,也就会执行我们定义好的 buildtest jobs,编译和测试我们网站。

我们将本地代码 push 到 Gitlab 看看效果:

build 和 test 成功后,我们接下来就需要把生成的静态代码部署到指定路径上,这时候不再是 docker 模式了,改为 shell,因为我们在相同的服务器部署网站,而且通过 docker 共享 volumn,将文件存放地方和 nginx 共享,这样就可以直接在 nginx 容器下配置访问。

接下来,配置第二个 「Gitlab-Runner」:

好了,我们再看看 jobs 运行结果

发布成功。

这时候我们只需配置 ngnix 去访问这个路径即可,这里就不再赘述了。

直接访问链接 https://ziwolianghua.coding01.cn 看看效果:

总结

从本地使用 GitBook init 开始写 blog 和电子书,然后代码托管到 GitLab 上,再利用 GitLab Runner 自动化编译和部署网站,一气呵成。这样做的好处是,只要写好的 markdown 电子书扔到项目中,在目录文件上添加路径即可,我们可以随时随地更新和提交原始代码,完全不用考虑在本地部署 GitBook 环境了,而生成静态文件的任务交给服务器自动完成。

「完」

用GitLab Runner自动部署GitBook并不难的更多相关文章

  1. Gitlab CI 自动部署 asp.net core web api 到Docker容器

    为什么要写这个? 在一个系统长大的过程中会经历不断重构升级来满足商业的需求,而一个严谨的商业系统需要高效.稳定.可扩展,有时候还不得不考虑成本的问题.我希望能找到比较完整的开源解决方案来解决持续集成. ...

  2. 关于gitlab+jenkins自动部署代码的实现

    本人PHP开发者,项目组大多是PHP,少量java项目. 因公司目前服务器和项目的管理比较混乱,与领导商量后,决定尝试 gitlab+jenkins自动化部署(之前用的svn FTP手动部署代码),解 ...

  3. 局域网内利用gitlab,jenkins自动生成gitbook并发布(nginx)

    安装了GitBook,内网使用,没法用上gitbook的网页. 用gitbook serve只能展示一本书,而且也不利于长期维护. 于是使用gitlab,jenkins,和nginx配合gitbook ...

  4. Jenkins介绍和安装及配合GitLab代码自动部署

    Jenkins是什么? 基于JAVA的开源的自动化系统平台 加速自动化CI,CD任务及流水线,所有类型的任务:构建,测试,部署等 丰富的插件生态系统支持功能扩展,1400+插件和SCM,测试,通知,报 ...

  5. gitlab 实现自动部署(简单Python实现)

    功能说明: 当本地master分支执行push动作的时候,服务器端会自动执行master分支的pull操作(还可以执行一些自动化脚本) 原理: git hooks就是那些在git执行特定事件(如com ...

  6. gitlab+PHP 自动部署设计方案

    2018-9-26 14:00:39 星期三 场景: 由于某种情况, 不能使用Jenkins, so......只有自己实现了 看图: webUI 设计方案, - 文件夹A, 用来存放git分支- 文 ...

  7. gitlab + php自动部署

    功能简介 本地往服务器推送代码之后,触发web钩子,服务器拉取刚刚推送的代码 步骤 1.在gitlab后台配置钩子 项目->编辑项目->Web钩子->新增钩子 2.在服务器端为www ...

  8. Gitlab+Jenkins实现自动部署

    Gitlab+Jenkins实现自动部署   系统环境: Gitlab主机 IP:192.168.1.2 Jenkins主机 IP:192.168.1.3 一.为何要做自动部署 #部署Tomcat的在 ...

  9. Jenkins+Gitlab配置Webhook实现提交自动部署

    一.概述 在上一篇文章,链接如下: https://www.cnblogs.com/xiao987334176/p/11434849.html 已经实现了 Jenkins+harbor+gitlab+ ...

随机推荐

  1. GIT 安装和配置

    Git(读音为/gɪt/.)是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理. 一.安装 具体参照 安装 Git ,安装完git之后可以安装客户端工具 tortoise ...

  2. wordpress访问速度慢

    可能是google字体的原因 1.找到wordpress目录下wp-includes/script-loader.php这个文件 2.查找open_sans_font_url这个字段,把后面的font ...

  3. 教老婆学Linux运维(二)Linux常用命令指南【下】

    目录 tips:紧接上一篇,Linux常用命令指南[上] 2.4 文件解压缩 2.4.1 官宣的linux压缩工具:tar tar的基本命令格式为 tar [参数选项] [文件或目录] 我们前面学的命 ...

  4. ES6入门之Promise对象

    1. Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案--回调函数和事件更合理.更强大. 1.1 什么是Promise 简单来说就是一个容器,里面保存着某个未来才会结 ...

  5. LeetCode正则表达式匹配

    题目描述 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符 '*' 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 ...

  6. 【原创】go语言学习(二)数据类型、变量量、常量量

    目录 1.标识符.关键字2. 变量量和常量量3. 数据类型4. Go程序基本结构 标识符.关键字 1.标识符是⽤用来表示Go中的变量量名或者函数名,以字⺟母或_开头.后⾯面跟着字⺟母 ._或数字2. ...

  7. .Net Core Serverless初体验

    什么是Serverless Serverless 是一个当今软件世界中比较新的话题.它并没有一个普遍公认的权威定义,每个人每个企业对它的解释可能都有不同,而 Serverless 正是在这种情况下不断 ...

  8. day 23

    目录 面向对象总复习 面向对象总复习 面向过程编程思想: ​ 核心是过程,过程指的是做事情的步骤,即先干什么再干什么. ​ 基于该编程思想编程,就好比一条流水线,一种机械式的思维方式. 面向对象编程思 ...

  9. 网络游戏开发-客户端4 关于Egret的本地坐标和舞台坐标

    因为最近公司事情比较多,所以没怎么更新博客. 不过咱们这个游戏还是在继续往下写. 今天晚上打算写斗地主的出牌动画,遇到一个问题,就是关于本地坐标和舞台坐标的计算问题 在Egret官网的解释是:x 和 ...

  10. 网络游戏开发-客户端2(自定义websocket协议格式)

    Egret官方提供了一个Websocket的库,可以让我们方便的和服务器长连接交互. 标题写的时候自定义websocket的协议格式.解释一下,不是说我们去动websocket本身的东西,我们是在we ...