Debbugsとのnつきあいかた¶ ↑
: subtitle
SOAP編
: author
Kentaro Hayashi
: institution
ClearCode Inc.
: content-source
東京エリアDebian勉強会
: date
2017-05-20
: allotted-time
15m
: theme
.
自己紹介(1)¶ ↑
# image # relative-height = 40 # src = https://pbs.twimg.com/profile_images/2290018079/cvcy12slbeva80jboxzf_400x400.png
-
Twitter/GitHub: @kenhys
-
所属: ((*トラックポイント・ソフトドーム派*))
自己紹介(2)¶ ↑
# image # relative-height = 60 # src = images/track-points.png
-
トラックポイント・ソフトドーム派
参考画像の出典¶ ↑
# image # relative-height = 80 # src = images/irasutoya.png
パッケージ関連の活動¶ ↑
-
groonga (全文検索エンジン)
-
groonga-normalizer-mysql
-
libhinawa
-
fcitx-imlist
-
hal-flash (Flashを延命させるアレ)
-
growl-for-linux
閑話休題¶ ↑
((‘tag:center’)) そろそろ本題に
本日の話題¶ ↑
-
Debbugsとのつきあいかた:SOAP編
本日の話題¶ ↑
-
Debbugsとのつきあいかた((:SOAP編))
話さないこと¶ ↑
-
Debbugsのふつうの使い方
Debbugsとは?¶ ↑
# image # relative-height = 100 # src = images/debbugs-debbugs.png
Debbugsとは?¶ ↑
-
1994年 Ian Jackson氏が開発を始めたn Issueトラッキングシステム
-
GNOMEやKDEもかつて採用していたn →Bugzillaへ移行した
ふつうの人のバグ報告(1)¶ ↑
# image # relative-height = 80 # src = images/reportbug.png
-
Reportbug!
ふつうの人のバグ報告(2)¶ ↑
# image # relative-height = 80 # src = images/reportbug-ng.png
-
Reportbug-NG!
Debbugsのよいところ¶ ↑
-
メールで気軽にバグ報告
-
報告にログインとか不要
-
一見さんをカジュアルに殺せる初見殺し機能搭載
Debbugsの見方¶ ↑
# image # relative-height = 80 # src = images/debbugs-status.png
- 重要度|タグ|状態
Debbugsの重要度¶ ↑
-
m: minor
-
w: wishlist
-
n: normal
-
S: serious
-
G: grave
Debbugsのタグ¶ ↑
-
+: patch
-
☹: wontfix
-
M: moreinfo
-
P: pending
Debbugsの状態¶ ↑
-
♔: blocks
-
☣: affects
-
☺: fixed
なぜDebbugsに興味を?¶ ↑
-
社内のグループチャットがZulip
-
Zulipのbotにdebbugsをサポートさせたい
-
バグ報告のURLを貼り付けたらbotに処理させたい
botに処理させるには?¶ ↑
-
bugs.d.oをスクレイピング?
-
もっといいやりかたはない?
SOAP!¶ ↑
サンプルコードもあるよ¶ ↑
require 'soap/rpc/driver' host = "bugs.debian.org" port = 80 server="http://#{host}:#{port}/cgi-bin/soap.cgi" ns = 'Debbugs/SOAP/' drv = SOAP::RPC::Driver.new(server, ns) drv.wiredump_dev = STDOUT if $DEBUG drv.add_method('get_status','bugnumber') drv.add_method('get_bugs','keyparam') p drv.get_status(drv.get_bugs(['package', 'pbuilder', 'severity', 'wishlist']))
-
Ruby 1.8 or ((*修正済みsoap4r*))じゃないと動かない
Rubyの事情¶ ↑
-
soap4rはもともとRuby 1.8にバンドル
-
Ruby 1.9ではバンドルされなくなった
-
soap4rはメンテされなくなった
-
雨後の筍 soap4r
雨後の筍 soap4r¶ ↑
-
soap4r-ng (2.0.3)
-
soap4r-r19 (1.5.9) Ruby1.9対応版
-
soap4r-ruby1.9 (2.0.5) Ruby1.9対応版
-
soap4r-ruby19 (1.5.9) Ruby1.9対応版
soapXr¶ ↑
-
soap2r (1.5.8) soap4rの後にリリース
-
soap5r (2.0.3)
upstream on Debian¶ ↑
-
ruby-soap4r
混沌とした世界¶ ↑
-
あまり踏み込まないほうがよい予感
SOAPを使うには¶ ↑
-
ポイント:WSDL
WSDL¶ ↑
-
Web Services Description Language
-
Webサービス記述言語
-
XMLでインターフェースを定義する
-
WSDLを元にSOAPで通信
-
DebbugsのWSDL¶ ↑
-
((*一切言及はない*))
-
どうなってるの?
WSDLを探せ¶ ↑
# image # relative-height = 70 # src = images/debbugs-wsdl-found.png
-
Emacs使いはdebbugs.el
Debbugs.wsdl¶ ↑
-
Debbugs用のWSDL
-
debian.orgとgnu.orgのdebbugsで使える
WSDLの構造¶ ↑
-
<wsdl:definitions>の子要素として定義
-
<wsdl:types>
-
<wsdl:message>
-
<wsdl:portType>
-
<wsdl:binding>
-
<wsdl:service>
-
<wsdl:types>¶ ↑
<complexType name="ArrayOfBugNumber"> <complexContent> <restriction base="soapenc:Array"> <attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:int[]"/> </restriction> </complexContent> </complexType>
-
データ型の定義をする
-
例:バグ番号の配列を定義
-
<wsdl:message>¶ ↑
<wsdl:message name="get_statusRequest"> <wsdl:part name="bugs" type="types:ArrayOfBugNumber"/> </wsdl:message> <wsdl:message name="get_statusResponse"> <wsdl:part name="s-gensym3" type="apachens:Map"/> </wsdl:message>
-
データの抽象的な定義
-
例:ステータス取得時にやりとりするデータの定義
-
<wsdl:portType>¶ ↑
-
操作の定義 <wsl:operation>を含む
<wsdl:portType name="Debbugs/SOAP"> <wsdl:operation name="get_status" parameterOrder="bugs"> ... </wsdl:operation> <wsdl:operation name="get_bug_log" parameterOrder="bugnumber"> ... </wsdl:operation> </wsdl:portType>
<wsdl:operation>¶ ↑
<wsdl:operation name="get_status" parameterOrder="bugs"> <wsdl:input message="tns:get_statusRequest"> <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:Debbugs/SOAP" use="encoded"/> </wsdl:input> <wsdl:output message="tns:get_statusResponse"> <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:Debbugs/SOAP" use="encoded"/> </wsdl:output> </wsdl:operation>
-
操作の入出力を定義
-
例:ステータス取得時の入出力を定義
-
<wsdl:binding>¶ ↑
-
portTypeで定義した操作のプロトコルを指定
<wsdl:binding name="Debbugs/SOAP/BINDING" type="tns:Debbugs/SOAP"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="get_status"> ... </wsdl:operation> </wsdl:binding>
<wsdl:service>¶ ↑
-
通信先を定義
<wsdl:service name="Debbugs/SOAP/SERVICE"> <wsdl:port binding="tns:Debbugs/SOAP/BINDING" name="gnu.org"> <wsdlsoap:address location="http://debbugs.gnu.org/cgi/soap.cgi"/> </wsdl:port> <wsdl:port binding="tns:Debbugs/SOAP/BINDING" name="debian.org"> <wsdlsoap:address location="http://bugs.debian.org/cgi-bin/soap.cgi"/> </wsdl:port> </wsdl:service>
実践:debbugs¶ ↑
-
実際にSOAPでやりとりしてみるには
何を使う?¶ ↑
-
savon
-
RubyのSOAP clientライブラリー
savonの使い方¶ ↑
-
require “savon”
-
WSDLからクライアントのインスタンス作成
-
callでdebbugsのメソッドを呼ぶ
-
レスポンスを表示する
savonクライアント¶ ↑
client = Savon.client(wsdl: "(WSDLのURL)", endpoint: "http://bugs.debian.org/cgi-bin/soap.cgi", namespace: "Debbugs/SOAP")
-
クライアント作成
メソッドを呼ぶ¶ ↑
# fetch status of pbuilder specific bugs response = client.call(:get_status) do message(bugs: ["807406", "837812"]) end
-
例: get_statusメソッドを呼ぶ
レスポンスを表示する¶ ↑
bugs = response.body[:get_status_response][:s_gensym3][:item] bugs.each do |bug| item = bug[:value] puts "#{bug[:key]}:#{item[:pending]}:#{item[:subject]}" end #=> 807406:pending:pbuilder: drop all the 'xenial' (...) 837812:pending:[pbuilder] New hook improving dpkgi
まとめ¶ ↑
-
debbugsにはSOAPインターフェースがある
-
Debbug.wsdlはdebbugs.el方面から入手せよ
-
Rubyから使うならsoap4r(修正版) or savonを使え