Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DojoPaaS のコードを node から Ruby に移植したい #110

Closed
yasulab opened this issue Jun 5, 2018 · 36 comments
Closed

DojoPaaS のコードを node から Ruby に移植したい #110

yasulab opened this issue Jun 5, 2018 · 36 comments

Comments

@yasulab
Copy link
Member

yasulab commented Jun 5, 2018

プロトタイプを開発していただいた @miya0001 さんに許諾をいただいけたので、Ruby の開発会社である @yasslab チームで開発および運営を引き継ごうと考えています 🚜💨

@yasulab: DojoPaaS のメンテナンスについてご相談なのですが、弊社 (YassLab) のメンバーも増えてきて、チームで CoderDojo のコードを対応できるようになったとので、弊社側で DojoPaaS の運用およびメンテナンスを引き継いでみようかなと考えているのですが、いかがでしょうか? 🤔💭

具体的には、miya さんが書いてくれたプロトタイプを Ruby に移植して、移植した Ruby コードを弊社側で運用およびメンテナンスしようかなと考えています 🔧 💨

YassLab 株式会社 メンバー
https://yasslab.jp/ja


@miya0001: なるほど!いいと思います!

まずは技術調査から...? 🔍💨

さしあたって、そもそも Ruby に移植する際にどのぐらい工数がかかるのかを確認した方が良さそうです🤔💭 現在ちょうど @naopontan さんに CoderDojo 周りの開発をお願いしているので、まずは移植できるかどうかの F/S をしていただけると嬉しいです...!! 🙏

@miya0001: あっ、でもRubyのSDKあるのかな。。まあnodeでも大した内容のSDKじゃなかったですけど。

関連リンク

@yasulab yasulab transferred this issue from coderdojo-japan/dojopaas Dec 19, 2018
@yasulab yasulab transferred this issue from coderdojo-japan/coderdojo.jp Dec 19, 2018
@yasulab
Copy link
Member Author

yasulab commented Dec 19, 2018

あ、間違って coderdojo.jp に transfer してしまった... >< すみません 💦 元に戻しました (>人<;) 💦

@yasulab yasulab added this to 📑Will do (上にあるほど優先度が高い) in coderdojo.jp 開発ボード Feb 11, 2019
@yasulab
Copy link
Member Author

yasulab commented May 20, 2019

🤔.oO(DojoCast リポジトリを coderdojo.jp (Rails) にマージしたときと同様に、DojoPaaS も coderdojo.jp (Rails) にマージできるとメンテしやすいので理想的ではありそう)

まぁでも工数によるのかなぁ。もし工数が大きく変わるなら、node スクリプトから Ruby スクリプトに移植するだけの方が良さそう >< 💦

ひとまず、

  1. メンテできていない node スクリプトをメンテ可能な Ruby スクリプトに移植して、
  2. その後、ゆっくりと coderdojo.jp (Rails) にマージしていく

という手順の方が良さそう 😊

@AnaTofuZ
Copy link
Member

なるほどありがとうございます!!!

👆のリンクのREADMEあたりを見た感じ、TraviCIで動かしていた、さくらサーバーの初期設定を行う部分を、Rails側から行えば勝利という感じですね!

まずは上げていただいたnodeスクリプトが何をしているか(何を満たすようにRubyで書き直せばいいのか)を確認していきます...!!

@AnaTofuZ
Copy link
Member

(さくらのAPI,以前みたときはドキュメント化されていないパラメーターが多くてなかなか厳しかった印象がありますが、すでに動いているサービスを横移動させるなら大丈夫そうですね...) 💭 🤔

@yasulab
Copy link
Member Author

yasulab commented May 21, 2019

ですね! そんな感じです ;)

ちなみにこれまでの運用経験から分かった知見は次の2つで、それぞれが上記の 1. と 2. のアイデアの背景になっている感じです 😸

  1. 現在のスクリプトはプロトタイプという立ち位置で、メンテまで考慮されてなかった
    • 当初は『そもそもどのくらい使われのかが分からない』状態だったので、当初の設計は悪くない
    • とはいうもののいくつか不具合も出ているので、現行チームでメンテしやすい Ruby に移行したい
  2. DojoPaaS ユーザーには GitHub に詳しくない人もいる
    • Git / GitHub を1から知ってもらってもいいけど、ブラウザで完結するならその方が楽
    • ただし現在は coderdojo.jp 側にユーザー登録機能がまだないので、ここはまだ着手できなさそう🤔💭

@AnaTofuZ
Copy link
Member

AnaTofuZ commented May 21, 2019

全体的なPR時のサーバー生成周りの動きの調査

  • TravisCIでサーバー生成をしているので、ymlを見に行く
  • 大まかに npm run test:csv をして /bin/deploy.sh を実行すれば良さそう
  • 見たところ、ローカルでのテストも同様の方法で行われている

@AnaTofuZ
Copy link
Member

AnaTofuZ commented May 22, 2019

サーバー生成スクリプトは、なんかServerクラスの create メソッドを定義しているように見える。
(定義自体はjsの無名関数を使っていそう)

var Server = function(client) {
this.client = client;
}
Server.prototype.create = function(settings) {
var client = this.client;
var self = this;

実際に呼び出されているのは、grepした感じ

dojopaas/dojopaas.js

Lines 119 to 134 in 6094f7d

var server = new Server(client);
server.create({
zone: config.zone,
plan: config.plan,
packetfilterid: config.packetfilterid,
name: line.name,
description: line.description,
tags: tags,
pubkey: line.pubkey,
disk: config.disk,
resolve: resolve,
notes: config.notes
})
} else {
resolve();
}

だと思われる

@AnaTofuZ
Copy link
Member

createメソッドにハッシュで初期値を流すとよしなに生成される世界観....

@AnaTofuZ
Copy link
Member

基本的に client を引き回して中のメソッドをバンバン呼んでいくスタイルらしい。
client は 

dojopaas/dojopaas.js

Lines 41 to 47 in 6094f7d

sacloud.API_ROOT = config.api;
var client = sacloud.createClient({
accessToken : process.env.SACLOUD_ACCESS_TOKEN,
accessTokenSecret : process.env.SACLOUD_ACCESS_TOKEN_SECRET,
disableLocalizeKeys: false,
debug : false // trueにするとアクセストークンが漏れる!
});

を見ると、 sakuraのAPIクライアントライブラリっぽい

Rubyの横移動を考えると、同様のgemを探すか、気合でHTTPを叩くかになりそう

@AnaTofuZ
Copy link
Member

AnaTofuZ commented May 22, 2019

https://github.com/coderdojo-japan/dojopaas/blob/6094f7d06c5e0db56f0e17d65c6c1b4e32ee42af/lib/Server.js

  • HTTPクライアントライブラリを受け取り、インスタンスを作成

これはサーバーを「create」or 「destroy」の動作をするメソッドを提供するインスタンスになる

createの方は

  • サーバーの設定をハッシュで受け取る
  • サーバーのインスタンスを生成
  • net work interfaceを生成、接続
  • パケットフィルターを適用
  • ディスク作成、インスタンスに接続
  • ssh鍵を流してサーバー起動

が行われる。

destroy側は

  • インスタンス止める
  • 削除

が行われる。 それぞれのアクションはAPIを叩くのに対応している。
APIはHTTPクライアントライブラリのメソッドで抽象化されてるかな…と思ったが、POST とか、エンドポイントが見える形だったので、そんなに難しくなさそう

@AnaTofuZ
Copy link
Member

ということで、サーバーの初期設定のスクリプトを読んでいきます

apt install ansible -y

( 🤔 なぜansibleをいれているんだろう...? 使うのかな...? )

@AnaTofuZ
Copy link
Member

AnaTofuZ commented May 22, 2019

TravisCIの反映スクリプトはかなり素朴な、CIからgitを動かす実装でした。

現状PRベースで行っているので、同様のことは実装する必要はあるかな...と思いました。
ただ完全にRails側でユーザーの管理と申請フォームを作成した場合は必要なさそうですね。

ということでRubyへの移動を考えていこうかなと思います。
手順としては

  1. RubyでさくらのAPIクライアントライブラリがあるか見る
  2. ある場合、今回使うAPIのエンドポイントに対応したメソッドやインターフェイスがあるかを調べる
  3. なかったらHTTPを叩く方向へシフトする

このあたりをまず行います

@AnaTofuZ
Copy link
Member

AnaTofuZ commented May 22, 2019

sakuraのAPIクライアントライブラリっぽいgemをrubygemssakura で検索して見てみました

使うとしたら fog-sakuracloudかなと思いますが、これはHTTPを叩いた方がいい気がしてきました

@AnaTofuZ
Copy link
Member

Rubyでもりもり書く前に、CoderDojoのreails appに組み込むので
Dojoの追加スクリプトの実装のように、メインロジックはライブラリの形にしようかな... 🤔

@AnaTofuZ
Copy link
Member

まぁ一旦動くスクリプトをパッと書いて確かめてみようかな

@miya0001
Copy link
Member

ご無沙汰してます!

たまたま目についたのでいくつかお返事をw

なぜansibleをいれているんだろう...? 使うのかな...?

これは、WordPress をインストールしたいとかマイクラをインストールしたいとかの要望に対して、実際にはなかなか難しいだろうなというのがあって、インスタンス起動時に自動的にセットアップする方法ないかなと思っていたのでインストールしたのですが、その後どうしようとしてたのかは忘れましたw

たしかSlackのコマンドでインストールできるようにできへんかな。。。ぐらいの感じだったと思います。
なので実際には使ってないと思われます。

あと、さくらさんの API については、これを作った後で一度互換性のない変更が入っていたので(はっきり覚えてないですが、API からのレスポンスが変わったとかだったような。。。)、少なくくとも2年以上前にメンテが止まってるライブラリとかですと不具合があるかもです。
たしか直接 HTTP を叩く方法にしようかどうか当時僕も迷った気がします。

@AnaTofuZ
Copy link
Member

おっコメントありがとうございます!!

これは、WordPress をインストールしたいとかマイクラをインストールしたいとかの要望に対して、実際にはなかなか難しいだろうなというのがあって、インスタンス起動時に自動的にセットアップする方法ないかなと思っていたのでインストールしたのですが、その後どうしようとしてたのかは忘れましたw

たしかSlackのコマンドでインストールできるようにできへんかな。。。ぐらいの感じだったと思います。
なので実際には使ってないと思われます。

なるほど! ありがとうございます。 🙏
slackのコマンドが生成される可能性もあるので、念のためにansibleを通せるように
python2をinstallする程度にしておきます。

なるほど、APIレスポンスが変化している感じなんですね!
やはり直接HTTPを叩いたほうが安心できるかもしれない… 🤔

@AnaTofuZ
Copy link
Member

AnaTofuZ commented May 23, 2019

APIはこれを読みますさくらのクラウドAPI ver1.1 📖 👀

@hanachin
Copy link

gem使うとしたらDL数的にfogしかなさそう
https://rubygems.org/search?utf8=%E2%9C%93&query=sakura+cloud

もし直接叩くの諦めてfog使うなら.travis.ymlのrubyのバージョン更新したりとかしてPRだすとよさそう...
https://github.com/fog/fog-sakuracloud/blob/master/.travis.yml

@AnaTofuZ
Copy link
Member

fogも見たらlast update 3years ago....
PRチャンスな気がしますが、どうしようかな... 直接叩いたほうが安牌な気が若干しますね

@AnaTofuZ
Copy link
Member

AnaTofuZ commented May 23, 2019

hog側、見た感じさくらの対応しているAPIのバージョンが現在と同じだったので

https://github.com/fog/fog-sakuracloud/blob/796419e8ce9e7109cae9ac624a33e52193fef484/lib/fog/sakuracloud.rb#L25

なんとか使えそうな気がします (使うかどうかは悩んでいます...)

@miya0001
Copy link
Member

過去のコミットを見て思い出したのですが、仕様変更があったのは以下のコミットの内容ですね。
5904765

で、Fog の fog-sakuracloud ではそもそもこのAPIをサポートしていないようなので、上の不具合自体は関係ないのですが、この部分は自力で HTTP リクエストを叩く必要があるかもですね。

ほかにもパケットフィルタリングの API も叩く必要があってこれも fog-sakuracloud ではサポートしてないように見受けられますね。
https://github.com/coderdojo-japan/dojopaas/blob/master/lib/Server.js#L72-L86

@AnaTofuZ
Copy link
Member

@miya0001 ありがとうございます!!
fog-sakuracloud を利用している処理と、利用していない処理が混同すると、いろいろと面倒な処理が多いような気がするので、やはりHTTPを直接叩く形式にしようかなと思います。

@AnaTofuZ
Copy link
Member

実装していくにあたり、テストでモックを使えば良いのですが、今回利用しているさくらサーバーに、テスト(CIなどで回すテストでなく、確認程度)で実際にAPIを叩くことになりそうなのですが、その場合はどうすれば良いのでしょうか 🤔 (CoderDojo側で確保しているサーバー台数などの制約など...)

@yasulab
Copy link
Member Author

yasulab commented May 27, 2019

実装していくにあたり、テストでモックを使えば良いのですが、今回利用しているさくらサーバーに、テスト(CIなどで回すテストでなく、確認程度)で実際にAPIを叩くことになりそうなのですが、その場合はどうすれば良いのでしょうか 🤔

@AnaTofuZ お、じゃあいつもの感じで 1Password for Team でアカウント情報を共有しますね ;)

@yasulab
Copy link
Member Author

yasulab commented May 27, 2019

お、じゃあいつもの感じで 1Password for Team でアカウント情報を共有しますね ;)

@AnaTofuZ 追加しました! 後ほど確認してもらえれば 😉🔐✨

@AnaTofuZ
Copy link
Member

@yasulab 早い! 💨💨 💨 💨 ありがとうございます ❗️ ❗️ 🙏 確認できました

@AnaTofuZ
Copy link
Member

さくらのコンソールからログインして石狩第2ゾーンに様々なものがあることを確認しました!
cf. https://github.com/coderdojo-japan/dojopaas#%E7%AE%A1%E7%90%86%E8%80%85%E5%90%91%E3%81%91%E3%81%AE%E6%83%85%E5%A0%B1

@AnaTofuZ
Copy link
Member

💭 (定期的にコードに出てきたresolveはjsのこれらしい...)
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/resolve

@yasulab
Copy link
Member Author

yasulab commented Sep 17, 2019

2019年9月16日時点の進捗 cc/ @AnaTofuZ

  1. 移行はおおよそ終わっていて、残すは特定の API 呼び出しの移行のみ 🔧
    • 元々のNodejsの実装と共通して、特定の API 呼び出しでタイムアウトしている
  2. 実際にPR->mergeでまだサーバーが完全に立つところまでは確認済み ✅
    • ローカルでRubyスクリプトを実行するとサーバーが立ち、APIの部分で止まることは確認済
  3. 特定の API 呼び出しで止まる原因を現在調査中 🐛
    • API に関する部分を、現在さくらインターネットに問い合わせ中
    • 問い合わせの返答が来たら、その内容を元に次の作業に取り掛かる予定

@AnaTofuZ
Copy link
Member

無事 1f47c62 のコミットでTravisCI経由でサーバーが立ったことが確認された 🎉
というわけで移植に関してはクリアです
(以前の問題はやはりさくらのAPI側の問題のようなので、Rubyスクリプト自体には問題はなかった)

@yasulab
Copy link
Member Author

yasulab commented Sep 19, 2019

@AnaTofuZ Ruby への Porting 作業お疲れ様でした...!!! 😆🎉✨ DojoPaaS の再起動部分の問題 (#108) も解決されていてステキ...!! 😻🆒✨ README の加筆修正など、特に他の残タスクがなければ、アナグラさんの都合の良いタイミングで Close してもらえれば 😉✨

@Yuppymam ちょっと難しいかもしれないですが、もし本 Issue および 各種 PR の雰囲気が掴めたら、お知らせ記事執筆にチャレンジしてみても良いかもしれません 👀💭💖

@AnaTofuZ
Copy link
Member

さくらから返信が来ました。内容は「様子見で、またなにかあればお問い合わせお願いします」という旨でした。その為、今回は移植完了という感じで大丈夫だと思いました。

残タスクとして、READMEの修正と軽く動きのtweakがあるので、こちらを行ってcloseしようと思います!

@Yuppymam
Copy link
Contributor

@yasulab なんとなく雰囲気分かりました😊凄い✨👏

後ほどこちらも記事にしてみようと思います📝✨

@yasulab
Copy link
Member Author

yasulab commented Sep 20, 2019

後ほどこちらも記事にしてみようと思います📝✨

よろしくお願いします...!! (>人< )💖✨

@yasulab
Copy link
Member Author

yasulab commented Dec 1, 2019

こちら #136 で対応できたので Close しますね ;)

@yasulab yasulab closed this as completed Dec 1, 2019
coderdojo.jp 開発ボード automation moved this from 📑Will do (上にあるほど優先度が高い) to ✅Done Dec 1, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
Development

No branches or pull requests

6 participants