Text
Page: 1
Debbugsとの
つきあいかた
SOAP編
Kentaro Hayashi
ClearCode Inc.
東京エリアDebian勉強会
2017-05-20
Page: 2
自己紹介(1)
Twitter/GitHub: @kenhys
所属: トラックポイント・ソフトドーム派
Page: 3
自己紹介(2)
トラックポイント・ソフトドーム派
Page: 4
参考画像の出典
http://www.irasutoya.com/
Page: 5
パッケージ関連の活動
groonga (全文検索エンジン)
groonga-normalizer-mysql
libhinawa
fcitx-imlist
hal-flash (Flashを延命させるアレ)
growl-for-linux
Page: 7
本日の話題
Debbugsとのつきあいかた:SOAP編
Page: 8
本日の話題
Debbugsとのつきあいかた:SOAP編
Page: 9
話さないこと
Debbugsのふつうの使い方
Page: 11
Debbugsとは?
1994年 Ian Jackson氏が開発を始めた
Issueトラッキングシステム
GNOMEやKDEもかつて採用していた
→Bugzillaへ移行した
Page: 12
ふつうの人のバグ報告(1)
Reportbug!
Page: 13
ふつうの人のバグ報告(2)
Reportbug-NG!
Page: 14
Debbugsのよいところ
メールで気軽にバグ報告
報告にログインとか不要
一見さんをカジュアルに殺せる初見殺し機能搭載
Page: 15
Debbugsの見方
[重要度|タグ|状態]
Page: 16
Debbugsの重要度
m: minor
w: wishlist
n: normal
S: serious
G: grave
Page: 17
Debbugsのタグ
+: patch
☹: wontfix
M: moreinfo
P: pending
Page: 18
Debbugsの状態
♔: blocks
☣: affects
☺: fixed
Page: 19
なぜDebbugsに興味を?
社内のグループチャットがZulip
https://zulip.org/
Zulipのbotにdebbugsをサポートさせたい
https://github.com/okkez/pragmatic-bot
バグ報告のURLを貼り付けたらbotに処理させたい
Page: 20
botに処理させるには?
bugs.d.oをスクレイピング?
もっといいやりかたはない?
Page: 21
SOAP!
https://wiki.debian.org/
DebbugsSoapInterface
Page: 22
サンプルコードもあるよ
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じゃないと動かな
い
Page: 23
Rubyの事情
soap4rはもともとRuby 1.8にバンドル
Ruby 1.9ではバンドルされなくなった
soap4rはメンテされなくなった
雨後の筍 soap4r
Page: 24
雨後の筍 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対応版
Page: 25
soapXr
soap2r (1.5.8) soap4rの後にリリース
soap5r (2.0.3)
Page: 26
upstream on Debian
ruby-soap4r
https://github.com/noeticpenguin/soap4r-
noeticpenguin
Page: 27
混沌とした世界
あまり踏み込まないほうがよい予感
Page: 28
SOAPを使うには
ポイント:WSDL
Page: 29
WSDL
Web Services Description Language
Webサービス記述言語
XMLでインターフェースを定義する
WSDLを元にSOAPで通信
Page: 30
DebbugsのWSDL
https://wiki.debian.org/
DebbugsSoapInterface
一切言及はない
どうなってるの?
Page: 31
WSDLを探せ
Emacs使いはdebbugs.el
https://elpa.gnu.org/packages/debbugs.html
Page: 32
Debbugs.wsdl
Debbugs用のWSDL
debian.orgとgnu.orgのdebbugsで使える
Page: 33
WSDLの構造
<wsdl:definitions>の子要素として定義
<wsdl:types>
<wsdl:message>
<wsdl:portType>
<wsdl:binding>
<wsdl:service>
Page: 34
<wsdl:types>
<complexType name="ArrayOfBugNumber">
<complexContent>
<restriction base="soapenc:Array">
<attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:int[]"/>
</restriction>
</complexContent>
</complexType>
データ型の定義をする
例:バグ番号の配列を定義
Page: 35
<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>
データの抽象的な定義
例:ステータス取得時にやりとりするデータの定義
Page: 36
<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>
Page: 37
<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>
操作の入出力を定義
例:ステータス取得時の入出力を定義
Page: 38
<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>
Page: 39
<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>
Page: 40
実践:debbugs
実際にSOAPでやりとりしてみるには
Page: 41
何を使う?
savon
http://savonrb.com/
RubyのSOAP clientライブラリー
Page: 42
savonの使い方
require "savon"
WSDLからクライアントのインスタンス作成
callでdebbugsのメソッドを呼ぶ
レスポンスを表示する
Page: 43
savonクライアント
client = Savon.client(wsdl: "(WSDLのURL)",
endpoint: "http://bugs.debian.org/cgi-bin/soap.cgi",
namespace: "Debbugs/SOAP")
クライアント作成
Page: 44
メソッドを呼ぶ
# fetch status of pbuilder specific bugs
response = client.call(:get_status) do
message(bugs: ["807406", "837812"])
end
例: get_statusメソッドを呼ぶ
Page: 45
レスポンスを表示する
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
Page: 46
まとめ
debbugsにはSOAPインターフェースがある
Debbug.wsdlはdebbugs.el方面から入手せよ
Rubyから使うならsoap4r(修正版) or savonを使
え