摘要:之前雖然了解各種概念,但是自己搗鼓后,才算是真正的理解。只能把文檔渲染成,但是不包括,所以需要配合。這里是啟動(dòng)腳本,看最后一行,定義了默認(rèn)啟動(dòng)腳本。這個(gè)腳本負(fù)責(zé)監(jiān)聽,啟動(dòng)部署。如何使用這個(gè)項(xiàng)目已經(jīng)放到了和上。
API Blueprint
上次介紹的 API Blueprint 解決方案 雖然不錯(cuò),但是有一些問(wèn)題:
部署麻煩,需要裝不少東西
文檔更新后不支持自動(dòng)部署
沒(méi)有權(quán)限控制
以至于我們團(tuán)隊(duì)最后沒(méi)有用這個(gè)方案,所以我想了下解決方案。
通過(guò) Docker 鏡像,解決部署問(wèn)題
通過(guò) Docker 鏡像中的腳本,配合 Github Webhook 來(lái)實(shí)現(xiàn)自動(dòng)化部署
還未實(shí)現(xiàn)
正好順便學(xué)習(xí)一下 Docker,Docker 的書看過(guò)幾本了,之前同事也做過(guò)分享,但還是那句話:實(shí)踐出真知。
之前雖然了解各種概念,但是自己搗鼓后,才算是真正的理解。
?
實(shí)現(xiàn)方案 DockerfileDockerfile 非常簡(jiǎn)單,直接貼出來(lái)就行了:
FROM centos RUN yum install -y epel-release && yum update -y && yum install -y node npm make nginx git RUN npm install -g aglio drakov COPY scripts/startup.sh /usr/local/bin/ COPY scripts/deploy.sh /usr/local/bin/ COPY scripts/webhook.js /usr/local/bin/ RUN chmod -R 755 /usr/local/bin/* CMD /usr/local/bin/deploy.sh && /usr/local/bin/startup.sh
這里主要依賴了nodejs和nginx。
aglio只能把文檔渲染成html,但是不包括 server,所以需要配合nginx。
而drakov自己會(huì)啟動(dòng)一個(gè) server。
然后這里最關(guān)鍵的就是3個(gè)腳本了,繼續(xù)詳解一下這三個(gè)腳本。
?
startup.sh這里是啟動(dòng)腳本,看Dockerfile最后一行,定義了默認(rèn)啟動(dòng)腳本。
nginx nohup drakov -f "/opt/api-blueprint/*.apib" --public > /dev/null & node /usr/local/bin/webhook.js
三行命令對(duì)應(yīng)3個(gè)服務(wù)。
?
deploy.sh這個(gè)腳本負(fù)責(zé)拉取新的文檔,并調(diào)用aglio渲染成html,然后復(fù)制到nginx根目錄。
if [ -d /opt/api-blueprint ] then cd /opt/api-blueprint git checkout -f git clean -f git pull else git clone $repository /opt/api-blueprint cd /opt/api-blueprint fi find . -name "*.apib" | sed "s/.apib//" | xargs -i -t aglio -i {}.apib --theme-template triple -o {}.html rm -rf /usr/share/nginx/html/* cp -R * /usr/share/nginx/html/
?
webhook.js這個(gè)腳本負(fù)責(zé)監(jiān)聽 webhook,啟動(dòng)部署。
var http = require("http"); var exec = require("child_process").exec; var cmdStr = "bash -c /usr/local/bin/deploy.sh"; setInterval(function() { console.log("Start auto reload.") exec(cmdStr, function(err, stdout, stderr) { if (err) { console.error(err); } else { console.log("Update success!"); console.log(stdout); } }); }, 5 * 60 * 1000); http.createServer(function(req, res) { console.log("Start webhook reload.") exec(cmdStr, function(err, stdout, stderr) { if (err) { console.error(err); } else { console.log("Update success!"); console.log(stdout); } }); res.writeHead(200, { "Content-Type": "text/plain" }); res.end(""); }).listen(8080);
收到請(qǐng)求就重新調(diào)用一下deploy.sh。
Github 上可以這么設(shè)置:
如果你在內(nèi)網(wǎng),不方便暴露到公網(wǎng),可以忽略這個(gè)功能,腳本內(nèi)部也是自動(dòng)刷新,5分鐘一次。
?
如何使用?這個(gè)項(xiàng)目已經(jīng)放到了 Github 和 Docker Hub 上。
源代碼:https://github.com/dozer47528/api-bluepr...
Docker 鏡像:https://hub.docker.com/r/dozer47528/api-...
使用起來(lái)非常簡(jiǎn)單:
docker run --name test -e "repository=https://github.com/dozer47528/api-blueprint-test.git" -p 80:80 -p 8080:8080 -p 3000:3000 -d dozer47528/api-blueprint-docker
把其中的repository替換成你們自己的地址即可。
內(nèi)部端口需要映射一下:
80: 文檔
8080: webhook
3000: Mock 服務(wù)器
?
如何支持私有倉(cāng)庫(kù)?首先在宿主機(jī)上配置完ssh,然后在啟動(dòng)的時(shí)候隱射一下文件-v ~/.ssh:/root/.ssh。
完整的命令類似于這樣:
docker run --name test -v ~/.ssh:/root/.ssh -e "repository=https://github.com/dozer47528/api-blueprint-test.git" -p 80:80 -p 8080:8080 -p 3000:3000 -d dozer47528/api-blueprint-docker
?
如何修改aglio的啟動(dòng)參數(shù)?啟動(dòng)的時(shí)候加上這個(gè)參數(shù):-e "aglio=--theme-template triple"
完整的命令類似于這樣:
docker run --name test -e "aglio=--theme-template triple" -e "repository=https://github.com/dozer47528/api-blueprint-test.git" -p 80:80 -p 8080:8080 -p 3000:3000 -d dozer47528/api-blueprint-docker
aglio的文章文檔在這邊:[https://github.com/danielgtaylor/aglio#e...
?
文檔怎么寫?自己的文檔怎么寫?首先,我這邊只會(huì)轉(zhuǎn)換apib結(jié)尾的文檔,這是 API Blueprint 的標(biāo)準(zhǔn)后綴名。
然后你也可以在里面直接扔html文件。
所有文檔文件夾隨便放,我會(huì)遞歸所有文件。
最后建議放一個(gè)index.html,自己做一個(gè)導(dǎo)航,這樣自己用起來(lái)方便一點(diǎn)。
我這邊有一個(gè)例子:
https://github.com/dozer47528/api-bluepr...
?
下一步是什么?還有一些不完善的地方需要改進(jìn):
支持私有倉(cāng)庫(kù),例如 Bitbucket(已完成)
支持自定義aglio樣式,我現(xiàn)在在腳本里寫死了一個(gè)我自己比較喜歡的樣式,最好可以在docker run的時(shí)候把樣式傳進(jìn)去(已完成)
有些服務(wù)部署在內(nèi)網(wǎng),不方便設(shè)置 webhook,要支持自動(dòng)刷新數(shù)據(jù)(已完成)
?
源地址:http://www.dozer.cc/2016/03/api-blueprin...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/26539.html
摘要:是一套描述標(biāo)準(zhǔn),和一樣,屬于一種標(biāo)記語(yǔ)言,可以把標(biāo)記文稿轉(zhuǎn)換成漂亮的接口文檔。還可以創(chuàng)建,進(jìn)行本地調(diào)試。一語(yǔ)法只要用寫過(guò)東西基本很快就能掌握語(yǔ)法。參考文檔使用編寫文檔用生成優(yōu)雅的文檔指導(dǎo)手冊(cè)用生成優(yōu)雅的文檔 前后端配合開發(fā)的時(shí)候,常常會(huì)有這樣一種需求:你接口定義好了嗎?能不能先幫我起一個(gè) Mock Server 先跑起來(lái)?那么,如何才能避免前后端開發(fā)在時(shí)間差上的無(wú)謂等待呢?api-bl...
摘要:本文章是藍(lán)圖系列的第一篇教程。是事件驅(qū)動(dòng)的,同時(shí)也是非阻塞的。是一組負(fù)責(zé)分發(fā)和處理事件的線程。注意,我們絕對(duì)不能去阻塞線程,否則事件的處理過(guò)程會(huì)被阻塞,我們的應(yīng)用就失去了響應(yīng)能力。每個(gè)負(fù)責(zé)處理請(qǐng)求并且寫入回應(yīng)結(jié)果。 本文章是 Vert.x 藍(lán)圖系列 的第一篇教程。全系列: Vert.x Blueprint 系列教程(一) | 待辦事項(xiàng)服務(wù)開發(fā)教程 Vert.x Blueprint 系...
前言 今天發(fā)現(xiàn)了一個(gè)很niubility的東西__API Blueprint__,先給出官網(wǎng)https://apiblueprint.org/。下面是官網(wǎng)給出的介紹: API Blueprint. A powerful high-level API description language for web APIs. 這個(gè)可以干什么呢?按照API Blueprint的語(yǔ)法(類似markdown),...
閱讀 794·2021-08-23 09:46
閱讀 942·2019-08-30 15:44
閱讀 2599·2019-08-30 13:53
閱讀 3048·2019-08-29 12:48
閱讀 3866·2019-08-26 13:46
閱讀 1793·2019-08-26 13:36
閱讀 3518·2019-08-26 11:46
閱讀 1418·2019-08-26 10:48