资讯专栏INFORMATION COLUMN

使用 flow.ci 快速发布你的项目文档

马永翠 / 1508人阅读

摘要:如何发布文档最好的方式是把文档发布为网站,这样无需安装任何工具即可查看文档,更新时只需更新网站即可。在这里,用将文件快速生成为网站。拿文档来看,持续部署就是内容的持续测试与必要修改的归并及部署。在此,部署意为发布。

软件研发的协作过程中,文档是必不可少的一环,有需求文档、接口文档、使用文档等等。当开始写文档时,首先会遇到两个问题:

team members 之间如何协作?

文档 OK 后如何分发,去哪里看?如何更新?

很早的时候采用 word+ppt 做文档,然后放到共享服务器(ftp,samba)上,这种方式会有文档锁定和覆盖的问题,几个人的小团队还可以,大不了更新的时喊一嗓子:“我要更新文档了,大家都不要占用某某文件(使用windows共享文档的童鞋应该很熟悉)”。更新完了还要再喊一嗓子。除此之外,由于 word 文件格式(word文件其实是个压缩包,由很多 xml 和其他文件构成)太过于复杂,即便是借助 git 或者 svn 做版本控制,一旦产生冲突,很难通过肉眼合并和解决冲突。

那么如何解决上述问题呢?这篇文章我用 gitbook + flow.ci 进行文档的发布、集成和部署,希望给有需求的同学一些参考。

如何进行文档协作 & 版本控制 (git+markdown)

开发团队使用 git 或 svn 作为协作和版本控制工具已经是很成熟的方案了,当然也可以用于文档,只是word文档本身天然不太适合版本控制,markdown 是一种轻量级的标记语言, 学习简单,上手容易(具体语法参考 http://wowubuntu.com/markdown/) , 配合 git 几乎能做到完美的文档版本控制 。

如何发布文档 (gitbook+nginx)

最好的方式是把文档发布为 web 网站,这样无需安装任何工具即可查看文档,更新时只需更新网站即可。在这里,用 gitbook 将 markdown 文件快速生成为网站。

什么是 gitbook 呢?官网上是这么介绍的:

GitBook is a modern publishing toolchain. Making both writing and collaboration easy.

简单来说就是将 markdown 文档转换成 html、pdf、epub 等多种格式,很多开源软件和书籍都是用 gitbook 发布的,
如:Elasticsearch 权威指南、 Docker — 从入门到实践 等。

如果将 markdown 文档生成静态 html 部署到服务器(nginx)上,不仅可以通过浏览器查看,而且一旦更新server,所有人看到的都是最新的文档。

如何将文档进行持续集成 & 部署 (flow.ci)

CI(Continuous Integration)意为 “持续整合”,指代码的持续测试及与其他代码修改的整合与归并。

CD(Continuous Deployment)意为 “持续部署”,指代码与其补丁的持续部署于整个代码库。

拿文档来看,持续部署就是内容的持续测试、与必要修改的归并及部署。在此,部署意为发布。举例来说,“部署文档”是指输出文件被复制于web服务器为人阅览。

关于持续集成、持续部署不是一两句话能说清的,用于实现 持续集成、持续部署的工具链也五花八门,比如:最常见的 jenkins 、TravisCI 等,使用起来配置过于复杂。这篇文章里我将使用自家的持续集成服务 —— flow.ci 来进行文档的集成和部署,仅供参考。

建一个git repo存储文档

首先,建一个git repo存储文档,此处以 flow.ci官方文档 docs.flow.ci 为例, git repo 为

git@github.com:FIRHQ/flow.ci.git

目前 flow.ci 支持 github、bitbucket、国内的coding 和 私有部署的Gitlab。只要文档放在以上代码仓库的 git repo 都可以使用 flow.ci 进行集成. 如何在 flow.ci 创建项目可以 参考文档.

在 flow.ci 上创建 flow

接着,在 flow.ci 上建一个flow,语言模板选用 nodejs(使用 gitbook 需要用到node环境)。

同时删除掉 Cache、Install、Test等 step,这几个 step 是为 nodejs 项目提供的,我们此处只需要 nodejs 运行时环境及 npm 工具。

添加自定义脚本step

删除完之后添加自定义脚本step, 如何添加自定义脚本step可参考文档。 此处要添加两个自定义脚本,一个用于安装gitbook,一个用于编译文档并发布。

安装 gitbook 的自定义脚本 step 内容

flow_cmd "npm install gitbook-cli -g" --echo --retry --assert

此处的 flow_cmd 是 flow.ci 提供的一个函数,如果执行命令失败会进行重试

生成静态文件 && 部署 的自定义脚本step 内容

if [ "$FLOW_GIT_BRANCH" == "gitbook" ]; then # 只部署 gitbook分支
  source get_commits_from_last.sh
  bash -x ./deploy.sh 
fi;

$FLOW_GIT_BRANCH 是一个环境变量,用来存储当前的git分支

get_commits_from_last.sh 会获取上次发布的日期以及git commit id

deploy.sh会调用gitbook命令编译markdown文档,并在首页head里面添加本次commit id号以及时间戳,并发布到服务器,脚本会为文末放出

由于deploy.sh会将gitbook生成的静态文件使用scp的方式copy到服务器, 所以 服务器必须添加 rsa key 信任 , rsa-key可以在项目的设置页找到,将其添加倒对应user的~/.ssh/authorized_keys中即可

添加邮件通知的step,文档部署成功后触发

Email Sender插件需要三个参数,分别是邮件接受者、邮件主题、邮件内容模板,如下:

总结

至此,使用 flow.ci 快速发布文档的步骤已经全部完成。flow.ci 不只是持续集成,持续部署的工具,也帮助我们用自动化的视角审视手头繁琐的工作,将更多的时间用在新鲜事物上。

有任何疑问发邮件到 my@fir.im,分享你的观点:)

附上所有 step 中涉及的脚本:

get_commits_from_last.sh

#!/usr/bin/env bash
# usage: sh get_commits_from_last.sh
# 会export 2个环境变量:
#    DEPLOY_DIFF 与上次部署的时间差
#    DEPLOY_LOG  与上次部署的变化

set -e

STAGE="docs"
URL="${STAGE}.flow.ci"
HTML=`eval curl -sS ${URL}` # 获取首页html

# 从首页html中提取上次 部署的ID 和 部署时间
LAST_ID=`echo $HTML | awk "match($0, /-[0-9a-f]{7}/) { print substr( $0, RSTART+1, RLENGTH-1 )}"`
LAST_TIME=`echo $HTML | awk "match($0, /[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}/) { print substr( $0, RSTART, RLENGTH )}"`"Z"


FMT="%Y-%m-%dT%H:%M:%SZ"
currDate=`date -u +"$FMT"`

if [[ `uname` == "Darwin" ]]; then
  ts=$(date -j -f "$FMT" "${currDate}" "+%s")
  ts2=$(date -j -f "$FMT" "${LAST_TIME}" "+%s")
else
  ts=$(date --date="${currDate}" +"%s")
  ts2=$(date --date="${LAST_TIME}" +"%s")
fi

(( diff=(ts-ts2)/60 ))

export DEPLOY_DIFF=$diff
echo "Last $1 version : $LAST_ID @ ${LAST_TIME} (${DEPLOY_DIFF} minutes ago)"
echo "-----------------------------------------"
export DEPLOY_LOG=`git log --oneline $LAST_ID..HEAD`
echo "${DEPLOY_LOG}"

deploy.sh

#!/bin/bash

set -e

# VARS
DEPLOY_TIME=`date +%Y%m%d%H%M%S`
REMOTE_DIR="/var/www/flow-doc"
RELEASE_DIR="${REMOTE_DIR}/release"
DEPLOY_DIR="${RELEASE_DIR}/${DEPLOY_TIME}"
LATEST_DIR="${REMOTE_DIR}/latest"

TARGET=prod
USER=deploy # 需添加 rsa key 信任
HOST="此处修改为server的ip"
PORT=22 # ssh端口

# 使用gitbook 生成静态文件
gitbook build docs dist

# 获取当前时间
FMT="%Y-%m-%dT%H:%M:%SZ"
currDate=`date -u +"$FMT"`
if [[ `uname` == "Darwin" ]]; then
  ts=$(date -j -f "$FMT" "${currDate}" "+%s") 
else
  ts=$(date --date="${currDate}" +"%s")
fi

# 获取当前分支
branch=$(git rev-parse --abbrev-ref HEAD)
if [ -n "$FLOW_GIT_BRANCH" ] ; then
  branch=$FLOW_GIT_BRANCH
fi

# 获取commit log
commit=$(git rev-parse --short HEAD)

# 将本次部署的时间和COMMIT ID 嵌入倒首页html中
sed -i "/author/a " ./dist/index.html
sed -i "/author/a " ./dist/index.html

sed -i "s/COMMIT-TAG/${branch}-${commit}/g" ./dist/index.html
sed -i "s/UPDATE-TIME/${currDate}/g" ./dist/index.html

# 开始部署
echo "########## Deploy to ${TARGET} ##########"
ssh ${USER}@${HOST} -p ${PORT} "mkdir -p ${DEPLOY_DIR}"
ssh ${USER}@${HOST} -p ${PORT} "rm -rfv ${LATEST_DIR}"

scp -P ${PORT}  -rv ./dist/* ${USER}@${HOST}:${DEPLOY_DIR}
ssh ${USER}@${HOST} -p ${PORT} bash -x <           
               
                                           
                       
                 

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/39464.html

相关文章

  • 基于 flow.ci 实现 PHP 项目自动化持续集成

    摘要:在,我们把项目的开发工作流称为,每个由触发器和插件构成。系统根据不同的语言和环境提供对应的模版,触发器和插件。图为跑完整个持续集成流程,健康的项目状态。 高效程序员的习惯之一——让开发流程自动化。Automating shapes smarter future. 这是一个关于如何快速实现 PHP 项目自动化持续集成的快速指导。无论你是否使用过持续集成,或在苦心寻找一款合适的持续集成工具...

    james 评论0 收藏0
  • 几分钟看完 flow.ci 全部功能

    摘要:正式内测月初,上线,正式进入开发者的视野。公测注册取消邀请码限制,用户可直接注册使用。支持持续部署相比持续集成,持续部署的工作流程更受关注。 从 0 到 1,从邀请式内测到收费上线,flow.ci 经历了十个多月的沉淀与打磨。这期间,flow.ci 工程师们奋力赶工,进行了一系列的大功能更新,Bug 修复,功能优化。 这篇文章记录了 flow.ci 内测期间的大功能更新和相关的实践教程...

    yuanzhanghu 评论0 收藏0
  • 新一代 CI 持续集成工具 flow.ci 正式开源

    摘要:很高兴地宣布在协议下正式开源了。是国内首套开源持续集成解决方案,帮助企业团队实现开发流程自动化,快速持续交付高质量软件。官方网站开源地址以此,你可以将功能完整的持续集成服务部署到内网使用。 很高兴地宣布 flow.ci 在 Apache-2.0 协议下正式开源了。flow.ci 是国内首套开源持续集成(CI) 解决方案,帮助企业团队实现开发流程(build-test-deploy)自动...

    endless_road 评论0 收藏0
  • 新一代 CI 持续集成工具 flow.ci 正式开源

    摘要:很高兴地宣布在协议下正式开源了。是国内首套开源持续集成解决方案,帮助企业团队实现开发流程自动化,快速持续交付高质量软件。官方网站开源地址以此,你可以将功能完整的持续集成服务部署到内网使用。 很高兴地宣布 flow.ci 在 Apache-2.0 协议下正式开源了。flow.ci 是国内首套开源持续集成(CI) 解决方案,帮助企业团队实现开发流程(build-test-deploy)自动...

    jayzou 评论0 收藏0
  • fir.im Weekly - 如何打造真正的工程师文化

    摘要:英文原文链接中文翻译链接中文翻译来自微信公众号董老师在硅谷前豆瓣首席架构师如何保持团队的技术氛围在技术团队建立起技术导向的价值观良好的工程师文化,才能保持一个技术团队的创新与活力。 好的工程师,无法忍受低效且无趣的工作。优秀的技术团队应该自上而下的地推进技术平台化建设、DevOps、自动化构建、测试和部署流程,积极采用合适的第三方工具或创造工具,进行周期性的前沿技术分享等等。 先来看看...

    Raaabbit 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<