continuous integration for pharo smalltalk - smalltalkと継続的インテグレーション
TRANSCRIPT
Smalltalkと継続的インテグレーション Continuous Integration for Pharo Smalltalk
Sho Yoshida / @newappleshoSORABITO Inc.30 October 2015
Smalltalkのソースコード管理について
• 「分からないことはSmalltalkに聞け」というSmalltalk
• だからコメントやドキュメントをあまり残さないSmalltalker
• ドキュメントを見つけても古い
• 一体どうなっているんだ
ソースコード管理
• Smalltalkの処理系はたくさんあり管理方法もバラバラ
• Pharo Smalltalkについて説明します(下記は適当です。すみません)
20152010頃 2012頃 20142002?
Metacelloによる平定FileTreeの登場
Pharo3.0 Released FileTree標準装備
Pharo4.0 ReleasedMonticello(MCZ)の出現
Squeak Released
パッケージの導入??
2008
MCZの普及とリポジトリの乱立
GitHubの到来
1996?
Pharo Released
MCZ混沌時代の到来
2013?
SmalltalkHub登場?Git出現
2005?
FileTree+GitHubでのパッケージ公開が増えてくるはず
Git管理願望時代?
GitHub Enterprise提供開始
Smalltalkと出会う
Pharoの前身のSqueakでは
• パッケージ(ソースコード群)フォーマットとしてSAR形式があった
• SqueakMapというウェブベースのパッケージ管理でも使われている
• でも作るのは手作業で大変
詳しく知りたい方は「Squeak自由自在 http://swikis.ddo.jp/squeak/13」を参考にするとよいでしょう
http://map.squeak.org
Monticelloの出現
• MCZ形式のパッケージファイル管理ツール
• バージョン管理可能、差分確認が可能
• ローカルディレクトリおよびFTP, HTTP経由で外部にも保管可能
手動作成のSAR形式より楽で便利。 Squeak自由自在を読むと当時の期待感がわかる
MCZの普及とリポジトリの乱立
• MCZは普及しSqueak, Pharoではデフォルトのパッケージ管理となった
• MCZ形式のファイルを一般公開するためのリポジトリサーバーが登場
• SqueakSource,SqueakSource3や野良SqueakSourceが乱立した
どこに何がおいてあるのか不明。 Smalltalk入門者は主要なリポジトリを知らないと 欲しいパッケージが見つけられない可能性がある。
現在もこの問題は解決されていない Smalltalkだめ自慢 http://www.slideshare.net/umejava/smalltalk-38297600
MCZ混沌時代の到来
• MCZ形式は便利ではあったが欠点も多かった
• パッケージ間の依存関係解決が難しい(自分のパッケージに入れる荒技があったりヒドかった)
• 処理系、処理系のバージョンを指定できない(「動けばOK!」ってノリ。いいのか?)
• 最新化は職人技(「これだ!」ってな感じでMCZファイルを手動ロード)
私は学生の頃Smalltalkイメージ作り職人になっていたmario https://www.flickr.com/photos/64738468@N00/31049645/
Metacelloによる平定
• Monticelloの問題であったパッケージ依存や処理系ごとの制御を可能にするシステム
• Metacelloの登場によりパッケージ依存でエラーになることが少なくなった
• そしてイメージ作り職人は職を失ったはず(これが出た当初はSmalltalkとは無縁な仕事をしていたけどw)
よく見かけるConfigurationOfXX がMetacelloを記述するクラスMetacelloの使い方は第23回Smalltalk勉強会の資料を参考
http://www.smalltalk-users.jp/Home/gao-zhi/dai23kaismalltalkbenkyoukai
Always Shooting https://www.flickr.com/photos/alwaysshooting/15315019007/
GitHubの到来
• Metacelloが登場したころにはGitHubが広まりつつあった
• しかしながらSmalltalkerは独自ソースコード管理方法を続けた
• Metacello登場以降もプライベートなプロジェクト管理および多人数開発では問題を抱えていた
• あの猫がこわかったのかもしれない
MCZでの運用の問題
• MCZ形式はソースコードをzip形式でアーカイブしたもの
• MCZファイルそのままをGitで管理しても嬉しくない
• プライベートなプロジェクトの場合SqueakSourceが必要になる
• ブランチ管理ができない
• Pull Requestが使えない
• ソースコードを見るためのSmalltalkがいつもあるとは限らない
Git使いたい Gitに憧れ三千里
Git管理を憧れ続けたSmalltalker
flowcomm https://www.flickr.com/photos/flowcomm/4372513286/
FileTreeの登場
参考資料: http://www.slideshare.net/esug/of-metacello-git-scripting-and-things
FileTreeとはMonticello repository for directory-based Monticello packages enabling the use of git, svn, etc. for managing Smalltalk source code.
https://github.com/dalehenrich/filetree より
ソースコードをgit等で管理するための ディレクトリベースのソースコード管理ツール
発見したときPharo2.0に即座にインストールした
FileTreeのメリット
• ファイルベース管理なのでGit等の他言語のコード管理方法が利用可能
• プライベートSqueakSourceの導入が不要になり管理コスト減
• ブランチが使える
• Pull Requestが使える
• Pharo 3.0から標準装備
FileTreeの使い方(保存編)
• Monticello Browserを開き、保存したいパッケージを選択
• [+Repository]をクリック、[filetree://]を選択して保存するディレクトリを選択
• Monticelloと違いバージョン毎にソースコードが出力されないので注意(saveしたらgit,mercurial等でバージョン管理をする)
簡単ですね
FileTreeの使い方(読み込み編)
• 読み込む際にはBaselineをつかって読み込む
• BaselineはFileTreeで保存したパッケージ間依存を記述
• Metacelloの知識があれば簡単に記述可能
• Metacelloのbaseline:だけを取り出しものを考えるとわかりやすい
BaselineOfXX がBaselineを記述するクラス
Baselineを使った読み込み
| pathToPackageDirectory | "edit to match the path to your chosen package directory" pathToPackageDirectory := '/YOUR-GIT-DIRECTORY-PATH/sendgrid-smalltalk/pharo-repository/'. Metacello new baseline: 'SendGrid'; repository: 'filetree://', pathToPackageDirectory; load.
SendGrid Smalltalkの場合 https://github.com/newapplesho/sendgrid-smalltalk
FileTree + Baseline + Git
• BaselineのコードもFileTreeで保存すればカレントブランチのソースコードが読み込める
• バージョン管理はGitに任せればOK
• ビジネスなどのプライベートプロジェクトの管理にはとても便利
FileTreeはGitHubもサポート
• FileTreeにはGitHubに公開されたソースコードをcloneする機能ある
• 取得するソースコードはcommitの識別番号で指定可能
• ConfigurationOfのversionメソッドにgithubのパスを指定する
• 利用するにはBaselineにGit管理のパッケージの依存関係に記述してコミットする必要がある
• GitHubからcloneするConfigurationOfをSmalltalkHubなどに公開すれば乱立時代も乗り切れる
SendGrid Smalltalkの例
github://newapplesho/sendgrid-smalltalk:ce676f2225374264108042c4c734fe116b3c5080/pharo-repository
GitHubから取得するConfigurationOfを利用
github://newapplesho/sendgrid-smalltalk:ce676f2225374264108042c4c734fe116b3c5080/pharo-repository
ローカルにGitHubのソースコードを取得する
FileTreeでの運用問題
• コードが細かく分割されているためコードレビューしずらい
• 常にproperties.jsonなどの生成されるためファイルのコンフリクトが発生しやすい
FileTreeつらい。助けてSuper Smalltalker
Stree
• 梅澤さん(@umejava)作 FileTreeの拡張機能
• http://smalltalkhub.com/#!/~MasashiUmezawa/STree
• Cypressとは異なりクラス単位でファイルが分割されている
• クラス単位のファイル出力でも出力順序が統一されているためコードレビューがしやすい
Streeのinstall方法
Gofer it url: 'http://smalltalkhub.com/mc/MasashiUmezawa/STree/main'; package: 'STree'; load.
builder
• Pharo imageをJenkinsを用いて自動ビルドする環境
• Lukas Rengglis作
• https://github.com/renggli/builder
• scripts内のコードを実行することでimageを自動ビルド可能
builder (newapplesho版)
• https://github.com/newapplesho/builder
• builder動かせるようにするように変更
• scriptsファイルは厳選したものだけをcommit
• 現状はCentOS 6用、今後はUbuntu等にも対応予定
• セットアップを簡単にできるシェルも準備中
Smalltalkのリポジトリ問題の解決を目指します
builder (newapplesho版)のディレクトリ構成
• oneclick CentOS 6.5用Pharo VMを格納
• images 自動ビルド
• scripts 自動ビルドで実行するコードを格納
builderの使い方
• gitコマンドでbuilderをクローン
• builderのimage内に最新のPharo imageを格納する
• シェル
git clone git://github.com/newapplesho/builder.git
build.sh -i [イメージ名] -s [script名] -o [出力イメージ名]