Rabbit Slide Show

Debbugsとの付き合い方:SOAP編

Description

2017年5月20日に開催された東京エリアDebian勉強会の発表資料です。

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: 6

閑話休題
そろそろ本題に

Page: 7

本日の話題
Debbugsとのつきあいかた:SOAP編

Page: 8

本日の話題
Debbugsとのつきあいかた:SOAP編

Page: 9

話さないこと
Debbugsのふつうの使い方

Page: 10

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を使
え

Other slides