GitHub+Travis CI+GitHub Pagesを使ってCSVファイルから作るサーバーレスAPI

先日、Wapuu APIというものをリリースしました。

https://github.com/jawordpressorg/wapuu-api

わぷー(Wapuu)とはWordPressコミュニティのマスコットのことで、日本で生まれたものなんですが、今では世界中で愛されていまして、公式サイトに登録されているわぷーだけで80種類以上あるんです。

で、現状のまま増え続けると近いうちに仕組み的に破綻してしまいそうなので、わぷーのリストをAPI化してアーカイブページやあわよくばその他のアプリでも使ってもらおうという理由でAPIを作りました。

ちなみに昨年のWordCamp USでのAMIMOTO ブースでのデモ用に作ったこれもこのAPIを使う仕様に変更しました!

ogp

今回の記事ではその技術的な解説をします。

大まかな仕組み

このAPIはGitHubのGitHub Pagesを使ってJSONフォーマットでわぷーのリストを配信しているというただそれだけのものです。

元のデータにはCSVフォーマットを使用しており、これによってプルリクエスト等で新しいわぷーが追加された時に一目で差分がわかりますし、プルリクエストを送る側の環境も選びません。

(極端な話、GitHub上のエディターを使ってブラウザから修正できます。)

https://github.com/jawordpressorg/wapuu-api/blob/master/wapuu.csv

CSVへの修正がmasterブランチにpushされるとTravis CIが発火するようになっていて、簡単なテストの後でTravis CIから自動的にgh-pagesブランチにpushされます。

https://github.com/jawordpressorg/wapuu-api/tree/gh-pages

ありがたいことにAccess-Control-Allow-Origin:*というレスポンスヘッダーが自動的に出ているので、ドメインが異なるサーバーからでもこのAPIを利用することが可能です。

ちなみに早速、先日開催されたばかりのWordCamp Londonチームからのプルリクエストがありまして、R2-WapuuがAPI移行後第1号のわぷーです。

実際の処理

CSVからJSONの生成

CSVからJSONを生成するには、comma-separated-valuesというnpmモジュールを使ってまあまあ力技でJSONに変換しています。

Gulpなどのタスクランナーは使わずに普通にcsv2json.jsというスクリプトを作って以下のようにTravis CIで実行しています。

node csv2json.js > v1/wapuu.json

https://github.com/jawordpressorg/wapuu-api/blob/master/deploy/csv2json.js

テスト

テストも簡単です。

cat deploy/v1/wapuu.json | jq .

Travis CIでJSON生成後に上のコマンドを実行させて、コマンドがコケたら失敗ということで、その後のデプロイが止まるようになっています。

デプロイ

デプロイは、テストに成功後に以下のようなコマンドを実行しています。

#!/usr/bin/env bash

set -e

if [[ "false" != "$TRAVIS_PULL_REQUEST" ]]; then
	echo "Not deploying pull requests."
	exit
fi

if [[ "master" != "$TRAVIS_BRANCH" ]]; then
	echo "Not on the 'master' branch."
	exit
fi

cd deploy/
cp ../README.md ./

git init
git config user.name "Travis CI"
git config user.email "hello@example.com"
git add v1
git add README.md
git commit --quiet -m "Deploy from travis"
git push --force --quiet "https://${GH_TOKEN}@${GH_REF}" master:gh-pages > /dev/null 2>&1

重要なポイントは以下のとおり。

  • プルリクエストではデプロイを発火させないこと。
  • gh-pagesブランチでは発火させないこと。(無限にぐるぐる回る?)
  • エラーの時にGitHubのアクセストークンが漏れてしまわないようにエラーは全部/dev/nullに捨てること!

あとこのやり方だと、毎回新しいものとしてgh-pagesにpushしてしまうので、gh-pages側ではコミットの履歴が毎回ぶっ飛びます。

僕はmaster側だけ履歴が残ってればいいやっていう手抜きな実装を選びましたが、このあたりはお好みで。

 

ちなみにこの件、WP TavernというWordPressコミュニティでは有名な海外のブログで紹介してもらいました!

WP Tavernのライターの一人のサラさんはとてもキュートで技術的なことにも詳しい女性で以前から大ファンなんですが、イベントのたびにAMIMOTOブースには必ず遊びに来てくれます。

記事にしてもらったことよりも、サラさんとチャットで話した時間が幸せすぎて。。。笑

JSON_API_Now_Available_for_WordPress_Wapuu_Archive_–_WordPress_Tavern

http://wptavern.com/json-api-now-available-for-wordpress-wapuu-archive