特定のRDFの変更に合わせて、それを基にクエリを実行させて別のRDFを作るCircleCI
「特定のRDFの変更に合わせて、それを基にクエリを実行させて別のRDFを作るCircleCI」
タイトルの通り
実際のPRはこちら
まぁ、訳あって(後述)マージせずに閉じましたが。
背景
im@sparqlでは自動生成系のRDFがある。
この2つは、Clothes.rdfやUnit.rdfの逆方向の述語のトリプルが定義されている。
つまり、
みたいな感じ。
なので、Clothes.rdfやUnit.rdfが編集されたらそちらも編集する必要がある。
とはいえ編集するのは面倒なので、Node.jsを用意して適度に回している。
(一応公開してるが完全に自分専用って感じのゴミコード.....)
問題点
XMLの構文解析はど素人だし興味もないので、Node.jsでやっているのはキャラごとにまとめたSPARQLクエリをGETで叩いて、XMLっぽく排出している。
そう、SPARQLを叩いている。
ということは、一旦変更をSPARQL鯖に反映しなくてはならない。
つまり作業としては,
- Unit.rdf || Clothes.rdfを編集してPullReq出す
- GitHubでマージする
- SPARQL鯖の更新
- 自動生成スクリプトを走らせる
- PullReqを出す
- GitHubでマージする
- SPARQL鯖の更新
というわけ。慣れればそんなに苦でもない
とはいえ傍から見ればアホ丸出しなので、苦手意識のあるCircleCI克服も兼ねて自動化しました。
結果
CircleCIでやっていることの流れ
- DockerImagestain/jenaでCircleCI上でSPARQLを動かせる環境を作り、自動生成で使っているのと同じクエリを撃つ
- 結果をJSONファイルに保存する
- DockerImageをcircleci/nodeに切り替える
- 結果を保存したJSONファイルを読み込み、自動生成で使っているのと同じ処理でXMLを作る
- node.jsのconsole.logはUTF-16っぽいので、エンコードを変換する
- GitHubのbotアカウントでPullReqに対して追加コミットをする
botでの追加コミットはこちらを参考にした
実際の動作
試行錯誤の末の結果なので、ゴミみたいなコミットは無視して欲しい
おわりに
まぁ結局、botでやる方式だとPullReqする人全員がbotのアクセスを許可しないといけなかったり、CIの発火のタイミング調整がブランチかタグしかなくてコミット時に統一しないといけなかったりと他の編集者の負担を増やしそうだったのでマージせず、別の方法をすることにした。
某所での助言より、自動生成物かつ、逆方向の述語という性質上GitHubで変更を記録するほどでも無いので、Jenkinsでどうにかしようとしている。
それはまたの機会に。