Hexo 博客终极玩法:云端写作自动部署.docx
Hexo + Github + 语雀 + yuque-hexo +travis-ci+severless 打 造全自动持续集成个人博客,云端写作,自动部署,完美体验一、Hexo+Github 的痛点.为啥要用 hexo+github?作为一个程序猿,博客肯定是必须要有的拉,github也是必须要混的拉所以: hexo + github =高大上三日常好.蛋疼的写作体验使用hexo,会面临如下问题:博客源码怎么管理?图片存在哪?如何编写markdown文件?相信很多人都在使用本地编辑器来写博客,那体验,真心蛋疼,比方说vscode, 可视化插件一般般,图片还不能复制黏贴,想插入个图片还要先保存成文件放在 本地,然后再引用,啥?你说七牛云存储?哪有复制黏贴爽呀当然,博客源码可以使用travis-ci来做持续集成,想写博客或者换个电脑,clone 一下源仓库,写完push一下,就可以不用管了。but,比起独立站点的博客,如);ciArLsetoptcurlj CURLOPTL HEADERj $ header);况opgC"“CURLOP匚POSTF/ELDSj $post_data);/执行命令$data = curLexeccurO;$Mf。= ciArLgetiifo($curl);/关闭URL请求c"_c/ose($crO;return $Mf。;p>这里有几个需要获取的参数: travis登录token,在travis-ci.org中设置界面获取:C Nero.huaRepositories Settings .p* I 3 lTo leirn more about using our API. pkMt he>d to devtloptf.tr»vt$<i : Token 0 co tokim«s» v*w to*FGdtUrGSComic SdgDashboardPride 仓库ID或扩展名,使用findder或者postman发起一个请求:Parsed Raw Scratchpad | OptionsGET s: /api. travis-d. org/owner/Ghostdar/repos /1.1User-Agent: FiddlerContent-Type: application力sonTr a vis -API -Version: 3Authorization: token v二, Host: api.travis-d.orgContent-Length: 32回包中可以获取到ID和slugo3)配置触发方式 yuquetrr«9c*ire一般会得到这么个api:.3 .语雀配置配置一个仓库的webhook: Nero / 198醺e红siaMBXC We<)HookFWfH已关注V9gA 1旧=正"3/:汽3面址工收土劭牌送1!静歌百巳口 Wet> Hooks可以选择所有更新触发或者主动触发,主动触发的意思即发布需要勾选一个选项才会触发webhook。具体可参见语雀文档:;将serverless生成的api填入,可以在链接后面带参数:token 登录 tokeirepos 仓库 idMessage提交信息bra八ck分支例如:xxx?%?os = xxx&tok。= xxx&hcssage = xxx&bm 八以二 xxx如果不在链接带参数那么写在serverless函数内。4 .开始发布或更新一篇文章发布或者更新一篇文章后,我们前往travis-ci,可以看到已经触发了一次构建请求:Chanfriof DocumeflOtg HelpG Ghostdar/blog-origin C C3.l;iJ 000 aMt m*ut» 9fo201WVQuewo(lvt*H««o WS*ffiiWA t xzflHS fixTfiUKIt,4” yatfMattr9h2M出 ateyt x hour agoLTl *r|V<9u* wpd«ie H««O.金口 lAflUI# Xyamatter«Hh2MM about 2 hour* Agpyuuv upd3tj*W”g意时 2«cti工行, IV将KjQmmlte* *b0ut IhoMFt »gnIt M- g yQmMle<.1k294回 about ItiQMn tfoKXIf 23Q4Q1WM面 ,«Mn agM .WSyvque t»«w产22 yQmMlmr; hounARiKnuv"hrau# 21构建完成后,咱们的博客上已经妥妥的展示出来拉Nero.HuaHexo博客终报玩法:云端写作.自动部署00 Gdhub : >uque hrao *tr>m d-svpft»i、金门给肉脸个人. RiftBV ,尤熨CMt*一.Xxo*Github 0)*点1.为用 ”xo*9ittwb ?o hrno gtbub 丸上非常好附上博客地址: ,羞耻的求个star还有谁三、其他的思路1 . github api可以使用github的api ,每当更新文章,自动生成一个commit ,触发travis-ci 构建,但是感觉工作量很大,就放弃了.有待挖掘的travis-ci目前我使用的方法是trigger a build ,其实可以做到更多的自定义配置为啥不 研究?主要是我懒当然,如果有更好的方案也欢迎交流最后:再次感谢语雀开发webhook,以及尹挚 大神的yuque-hexo插件附上地址: yuque-hexo: s:/github /x-cold/yuque-hexo yuque-blog: s:/github /x-cold/yuque-bloghexohtmljavascriptnode.jswordpress,还是觉得写作体验有点不爽。微笑中透露着无奈.脑洞大开:偶然间,朋友安利了语雀这个文档写作平台,觉得这就是完美的写作体验,各种 UI和编辑器都很舒服秀个图:markdown编辑器也是巨爽:77 1 rt as -test2浅析-Apache工作原理一.LAMP架构AA0JPKM7«-TLAMP»m tAU?(量匕力乳田力一”q MMA4 RVB 母a.星住砧于是乎,就在想能不能在语雀里写作,写完之后自动同步到Github的博客呢? 年轻就要有激情,说干就干,花了一天时间,结合了 severlessyuque-hexo>travis-ci 之后,终于跑通了整个写作、发布、自动部署的流程世界如此美好二、具体方案整体流程: 语雀发布一篇文章 webhook 调用 serverless 函数 serverless 发起请求 trigger 一个 build 任务 travis-ci同步语雀文章并构建hexo github生成静态页面展示hexo+github+triavs-cihexo如何部署,如何集成travis-ci,等等,我就不再讲了,网上类似的文章灰常 多比方: 使用Hexo+Github+TravisCI搭建自动发布的静态博客系统 GitHub pages + Hexo搭建自己的个人博客老司机的微笑那么如何同步语雀的文章呢?答案就是:yuque-hexo这是一个开源库: s:/github /x-cold/yuque-hexo用法也很简单:1)修改packagejson,增加配置:"guqiAcC。八fig": “bnscU”": kttps:/ guq“c.cok/a?i/2"j/ogi八:u467q5”)"repo":叱log)''idMaieForat11: "title”)“postPath: so“rce/_posts/gqc)>2)增加命令:"scripts": sg八c: “guquc-kex。sg八c)“c/e"八:gaqac: g”q“e-kcx。cleata,J''deploy11: 八run sync && kexo cleats && kex。g -d_,附上我的package.json文件。1. serverless目前阿里云和腾讯云都有serverless服务,免费的额度完全够用了,下面介绍一 下如何配置:1)创立函数Pp7 MowoddPhS MwMowerlds hetmvorMPhSMrMmc尹,畲 y)39Ml MeMMdbtodaval .bMAxc:ModlO M MAmrNope斗 M#HK , J»*«8199 hHoworMU*B«lJMnAAjMc科*M 60ttSS h*«9«Q»<0o1>Ur*VK2) serverless 函数例如:<?phpf(A八cti。八6md怙噌c/cg $c。八text) /解析语雀post的数据$iApdate_title =七n t->bodg)$gqe_d424 二 jso 八_decodc(qcvent-bodg);$updatej:itle .= $yuque_data ->data ->title;/ default params$ repos = 'XX 网;/ 你的仓库 id 或 slug耗。ke八='xxxxxW; / 你的登录t。ken于Message = datc(Y/3/4)上guq(AC update:1 ,Updatejtitle;粕KMck = faster1;/ post pairais$qiAergS 仅 Mg = *evcnt-qiAwgSWMg;$q_toke八=$q(ACYgStHng -tokcA ? $qc(eq)SWMg ->tokc 八:$ token;$q,epos =$qb(ergStYMg-Hep。,? qquergStrMg-忆pos : “epos;$q_&css4gc = $qeKgS七片八g-Mcssgc ?于qqergStri八g->MCSS4ge : ¥Message;$q_。匕八ck =芋quergSt力八g->bra八ck ? $qCKgS±Hi八g->bra八ck : faster1;echo(卒 q_tokc 八);ccko,二二二');eck。($q,ep。,);eclo C=/);cck。($q_Messge);echo ('二二二');echo (于dmnrk);echo ('=一);/request travis ci如esjnf。= tHggeHTravisCI($q,epos, $q_tol<e$q_HAessge1于qj2r八ck);$rcs_code = O;于 res_HACSSge =,未知';i f($ rcs_Mfo _co4e1)*es_codc = *es_Mfo"ttp_codc1;switch(*es_i 八 fo"ap_codc 乂case 2-00:case 202:于 Kes_Messagc ="access'break;default:*Kes_Messqgc =甲aiW;break;)$rcs = array(status 三 >"e,_cod。)Message'= >"cs-vcssage);return 于res;)/*©description travis api)trigger a build* ©pairai *vepos string 仓库 ID、slugftokei string 登录验证 tokei/匕4侬$3css“gc string触发信息八ck st/Mg 分支* return $Mf。array 回包信息为/fix八cti。八 triggerTravisCl ($rcpos)$toke ,Message='gaqac update1, $biraicl-1 master1 /初始化fcurl = ciAirlJitQ;/设置抓取的uHciArLsetopt($c(Airl, CURLOPTJJRL), s:/api±Yavis-ci.org/Yepo/'.$rcpos.'/kcqb(ests');/设置获取的信息以文件流的形式返回,而不是直接输出。Cb(H_setopt(丰c(aHj CURLOPT_RETURNTRANSFER, 1);/设置post方式提交cuH口topt*M CURLOPTNUSTOMREQUESTJPOST);/设置post数据$post_data = jsoi_eicode(array(qaest=> array(3cssgc”= >$HACSSgc/%KYmck=>$bnmck);Reader = array (如八笈八t-Type: apphatio八/jso4,-API -Version: 3)'AiAthorizatiotokein l$toke,Coiteit-Leigtk.1 . strlei($post_datd)