WIPなpull requestをmergeしないchrome extension: Do Not Merge WIP for GitHub v1.0.0

Work In Progressなpull requestをmergeしないchrome extensionのDo Not Merge WIP for GitHubのv1.0.0をリリースした。
Do Not Merge WIP for GitHub

Edited 2014-06-28 21:12, v1.0.0はインストール出来ない致命的な不具合があったため、v1.0.1リリースしてます。 Thanks, dtaniwaki-san.

github merge cautionから名前を変えたので、v1.0.0としてmajor versionを上げた。github merge cautionを使っていた場合、自動でこちらのv1.0.0に上がっていると思う。

名前を変えた理由:
– GitHub safeな名前 #=> for GitHub
– 何をするかわかりやすい名前 #=> Do Not Merge WIP

Feature:

v0.0.8以降のkey feature, task listが残っている場合もmerge出来なくした。merge後にやるtaskもpull requestに書いてるという場合もある気がするけど、それはissueでやるのがいいんじゃね。

task list

edit直後やコメント後にボタンがdisableにならないのも、直った。

interval

Thanks, fukayatsu-san. Check pull-request status at intervals. #6 提案: WIP task list #7

sanemat/do-not-merge-wip-for-github

広告

Ship “rubygems-code_finder”

I shipped ‘rubygems-code_finder’. Usage is below:

irb(main):001:0> require 'rubygems-code_finder'
=> true
irb(main):002:0> Rubygems::CodeFinder.url 'tachikoma'
=> "https://github.com/sanemat/tachikoma" # Fetch from api.rubygems.org response source_code_uri
irb(main):003:0> Rubygems::CodeFinder.url 'invalid'
Rubygems::CodeFinder::RubygemsNotFound: Rubygems::CodeFinder::RubygemsNotFound
        from /Users/sane/.anyenv/envs/rbenv/versions/2.1.0/lib/ruby/gems/2.1.0/bundler/gems/rubygems-code_finder-9fdb9327350d/lib/rubygems-code_finder.rb:15:in `url'
        from (irb):3
        from /Users/sane/.anyenv/envs/rbenv/versions/2.1.0/bin/irb:11:in `'
irb(main):004:0> Rubygems::CodeFinder.url 'mm-devise'
=> "http://github.com/kristianmandrup/mm-devise" # Fetch from api.rubygems.org response homepage_url
irb(main):005:0> Rubygems::CodeFinder.url 'fluentd'
=> "https://github.com/fluent/fluentd" # Search github

This finds rubygems’ code repository from api.rubygems.org(source_code_uri), gem spec(homepage_url) and github’s search api. Most case(80/20) you can find the repository correctly!

Project page:
https://github.com/sanemat/rubygems-code_finder

yeoman, angularjs なアプリをgithub pagesにdeploy

普通にmasterをgh-pagesにpushしても出なかった.dist以下をpushする必要がある.

Yeoman: deployment
X1011/git-directory-deploy

git subtree を使うのは全然頭に入らなかったので,git-directory-deploy使う.readmeにある通りやると
sanemat.github.io/hand_cooler deployできましたね.

メモ書き:
一度gh-pages作ってる場合, 初回はpush -f する必要がある.
grunt serve:dist でdist以下更新してないと反映されない.

ひとまず手元からのpushだけでいいや.

毎日bundle updateするbot Tachikoma

バージョンアップで一番痛みが少ないのは、毎日bundle updateをすること。最新と、現在のバージョンのスナップショット以外で、動くバージョンの組み合わせを見つけるのは不毛。毎日のbundle updateを支援するbotを作ってます。

Edited: 2014-10-01 10:25, Tachikoma.io出来ました!! webアプリです〜

githubのpublicなリポジトリはぼくが手で登録して、回すのでご連絡下さい。また、自前で設置する導入コンサルもやりますので、こちらもご連絡下さい。

http://tachikoma.launchrock.com/

差分( from CLOUDBEES で BUNDLE UPDATE した上でPULL REQUEST させる)

  • 正しく設定のyamlを読むようにした
    – アプリの下で複数プロジェクト置いて、bundle in bundleしてpull request送る
    – リポジトリの中にcloudbees用のshellファイルを置く必要がなくなった

実際こんなかんじでpull request送ってきます

https://github.com/mrtaddy/fenix-knight/pull/25

コード
https://github.com/sanemat/tachikoma

cloudbees用build script
https://gist.github.com/sanemat/5859031

ロードマップ

 v3.0.0 gemにして差分設定ファイルで動く(現時点でgemにしているけど、gem としてはまだ動かない)

organizationのprivateリポジトリ(実際はもう動くはず)
github public以外も動くようにする bitbucket, gh:e, gitlab

各diffを自分で探しに行くのだるい

rakeはタグが変
https://github.com/jimweirich/rake/compare/rake-10.0.4…rake-10.1.0
railsのmasterなどgithubのものはcompare commit
https://github.com/rails/rails/compare/37e6201eeb6994f4b1917c017f13ae1b51a1292d…e1f4f644344199bba7a060fe1ad27cde2e8d81e9
メジャーなものは直接diffのリンクをbotが喋りたい
https://github.com/puma/puma/compare/v2.1.0…v2.1.1
せめてrubygemsのhomepageは喋りたい

ほぼ同じ仕組みのcarton, npmは踏襲できそう
heroku build pack (sqlite)
Gem-ish usage (load tasks)
Notify if fail
Notify no change
Frequency(whenever gem compatible)

githubのpublicなリポジトリはぼくが手で登録して、回すのでご連絡下さい。また、自前で設置する導入コンサルもやりますので、こちらもご連絡下さい。

http://tachikoma.launchrock.com/

Cloudbees で bundle update した上でPull Request させる

pull request botの話、勝手に四部作目
Screen Shot 2013-06-20 at 1.02.52 AM

実際の例
https://github.com/sanemat/pollyanna/pull/14

参考

Jenkins に bundle update した上で Pull Request させる
private/public repos, jenkinsでビルド, 書き込み権限のあるアカウントでpull request

Heroku で bundle update した上で Pull Request させる
private/public reps, herokuでビルド, 書き込み権限のあるアカウントでpull request

Middleman で作った web サイトを Travis + GitHub pages でお手軽に運用する
public repos, travis-ciでビルド, 書き込み権限のあるアカウントで gh-pagesにpush
(ちょっと毛色は違う)

で、このエントリは4部作目
public repos, cloudbeesでビルド, 書き込み権限のないアカウントでpull request

ちなみにたぶん、本命は herokuでbuildpackを使ってbuild, pull request だと思う。ただ、buildpackハードル高かったのでcloudbeesでやってみた。

githubアカウントの作成

botのgithubアカウントを作る
botアカウントで対象リポジトリをfork
botアカウントにgravatar設定
httpsのoauthtokenを取得
イェー

cloudbeesでのビルドの設定

export POSTGRESQL_VERSION=9.2.4
export DATABASE=pollyanna_test
export USERNAME=postgres
export PASSWORD=
export NODE_VERSION=0.10.4
export EXECJS_RUNTIME=Node
export BUNDLE_DATETIME=$(TZ=JST-9 date +%Y%m%d%H%M%S)

######### POSTGRES INSTAL(first time) AND LAUNCH #########
curl -s -o use-postgresql https://repository-cloudbees.forge.cloudbees.com/distributions/ci-addons/postgresql/use-postgresql
source ./use-postgresql

######### DESTROY DATABASES AND USERS #########
psql -d postgres -c “DROP DATABASE IF EXISTS ${DATABASE};”
psql -d postgres -c “DROP USER IF EXISTS ${USERNAME};”

######### REPOPULATE SERVER WITH DATABASE AND USER FOR TEST #########
psql -d postgres -c “CREATE USER ${USERNAME} WITH CREATEDB;”
psql -d postgres -c “ALTER USER ${USERNAME} PASSWORD ‘${PASSWORD}’;”
psql -d postgres -c “CREATE DATABASE ${DATABASE} OWNER ${USERNAME};”

######### THIS CODE NOW EXITS. #########
## If you have other ‘M2 PreBuild’ steps following this
## in your configuration, they will now execute
##
## Eventually, control is given to the main build and
## the PostgreSQL server will still be running, ready
## to use!

source ./use-postgresql
source ./use-node
echo -n ${BUNDLE_DATETIME} > ./bundle_datetime.txt

gem install bundler
# unless git remote pushable exist
git remote add pushable https://${GH_TOKEN}@github.com/bot-motoko/pollyanna.git

#https://gist.github.com/kyanny/4017686
sed -i -e “s/ruby ‘2.0.0’/#ruby ‘2.0.0’/” Gemfile
bundle

git checkout -b feature/bundle-update-${BUNDLE_DATETIME}
bundle update

sed -i -e “s/#ruby ‘2.0.0’/ruby ‘2.0.0’/” Gemfile
git add Gemfile Gemfile.lock
git commit -m ‘bundle update’
git push pushable feature/bundle-update-${BUNDLE_DATETIME}

sed -i -e “s/ruby ‘2.0.0’/#ruby ‘2.0.0’/” Gemfile
cp config/database.yml.example config/database.yml
bundle exec rake db:create db:schema:load
COVERAGE=on bundle exec rake spec
exitstatus=$?
bundle exec rake db:drop

git checkout master

exit $exitstatus

build後にpull requestのtaskを起動

BUNDLE_DATETIME=$(head -n 1 ./bundle_datetime.txt)

#https://gist.github.com/kyanny/4017686
RESULT=`curl ${BUILD_URL}api/xml | perl -le ‘$_=;/(.+?)</;printf $1’`
# http://stackoverflow.com/questions/14863609/bash-a-multiword-variable-breaking-curl
curl -v \
-H “Accept: application/json” \
-H “Content-type: application/json” \
-H “Authorization: token ${GH_TOKEN}” \
-H “User-Agent: Bot-Motoko” \
-X POST \
-d@- \
https://api.github.com/repos/sanemat/pollyanna/pulls&#8221; <<EOF
{
“title”: “Bundle $BUNDLE_DATETIME”,
“body”: “:hamster::hamster::hamster:”,
“head”: “bot-motoko:feature/bundle-update-$BUNDLE_DATETIME”,
“base”: “master”
}
EOF

cloudbees使う注意

無料枠1ヶ月300分制限
trial and errorしてる間にビルド時間は100分使ってしまった
柔軟にいろいろ入れられるが、shellで入れやすくなってるだけなので、travisみたいに全部入りな方が楽かな
特にbundleとgit pull-requestするだけの環境なので
rubyは1.9.3
他の言語と同様に選べそうに見えるけど2.0.0リリース前のしかない古い…
https://repository-cloudbees.forge.cloudbees.com/distributions/ci-addons/ruby/
なのでGemfileごにょごにょやる必要がある
Jenkinsのpluginなどなどもう覚えてない
情報の検索の仕方がよくわからない
「ruby cloudbees dev build」みたいにcloudbees dev build をつけるとドンピシャググれる
と分かった頃にはもうほぼ要らなくなってる
stackoverflowでも回答くれる
http://stackoverflow.com/questions/17136198/cloudbees-dev-cloud-postgresql-rubygems-pg-native-extension-how-to-use
shell よくわからない
jenkins guiでつらい特にpluginまわりの設定
時々反応遅かったり、dns lookupでfailになる、日本からアメリカ東海岸だからかな サポートには、俺はつながるからお前のプロバイダーの問題だろってメールもらった
hubのpull-requestコマンドって書き込み権限ないとうまく使えなくない?
coverallsが書き込み権限要求するのはやっぱり手抜きなのでは
JSTの朝方ビルドして欲しいので、時差の都合上cron設定 5 17 * * * これでJST6am過ぎに定期実行

おわり

不要なgemを外すモチベーション

刺身さんのセッションが良かった。ブログのエントリを見て会社でいいねーってなって定期ビルドするjobを作るところまではkei-sがやりかけてたんだけどpull requestを作るところまで行かなかったから結局続いてない。最後の一手間だけでぜんぜん違うもんだなあ。

http://blog.kyanny.me/entry/2012/11/06/003902

セッション中に感想半分質問半分なのをつぶやいてたら良い心がけいただいた

githubのbot作れると色々捗る気がする

github drinkupで刺身banyanと話してて目からうろこだったのは、過去使っていたgemがそのままにしてある場合に、外すモチベーションってあまり出てこないけれど(せいぜいその瞬間だとbundleがちょっとずつ遅くなる以外にあまりメリットない)、このパターンだと邪魔だから外すっていうモチベーションがいい方に出てきて、結果シンプルに保てる。

code smell

コードスメルの話

うかつにpull request送るのはいいしむしろうかつに送るべきなんだけど、簡単にpull request送れるものって、このライブラリやばいんじゃね、のシグナルにもなっている。
そのへんわかってないレベルの人が作ってることがある。

tscolari/mobylette の感想。自分が思ったのも、まずGemfile.lockをバージョン管理すべきかの話、把握してなかった。二年前の話なのに。

翻訳版もある
http://langturn.com/translations/33?locale=ja

Clarifying the Roles of the .gemspec and Gemfile « Katz Got Your Tongue?
http://yehudakatz.com/2010/12/16/clarifying-the-roles-of-the-gemspec-and-gemfile/

やばいかなーと思ったのはbundle したら差分が出たのはまあイージーミスだし放置してたら論外だけど、誰もbundleしてなきゃ気づかないかなーと。 multi_json (1.2.0)が決め打ちで入ってエッてなった。railsも3.2.3決め打ちだし。
最近見てるものだとバージョンの違和感に気づく。

把握してなきゃリリースしちゃダメ、って話じゃなくて、使われてたら誰か問題ふんだりpull request送ったりするだろーって話。的はずれなのも多いだろうけど、放置してるのはだめっすね。

NoamB/sorcery のときなぜか急に日本人が同時多発的にpull request送ってて楽しかった。あのときも、”なんで下層のアプリ実行するときはbundle exec付けなきゃいけないの? 俺やったこと無いよ?”ってNoamBが言ってて、当然travisで動かなくって、bundle in bundleよくわからなかったこともあり、俺は半分”こいつダメかも”って思ってたんだけど、banyan, kyannyが粘って説得して解決して取り込まれてて凄いなーと思ったもんでした。
pull request気まぐれに投げて自分も勉強しましょうという普通の話でした。

Travis-ciにping打ってもう一度ビルドさせたい

travis-ciがpull requestの最後のコミットに反応しなくて、もしくは違うコミットに反応してpassのはずなのにfailで終わってしまうときtravis起こすためだけの空コミット(READMEに改行足してみるなど)入れてしまうんだけどもっと正攻法があるはず ビルドのトリガーにhook以外にpingうつのが合った気がするんだけど、それが一度failになったやつももう一度やってくれる簡単なインターフェース有りそうだよなー。

masterに変なコミット入れません以前に、travis用の確認用コミットが入りますとか悲しい

最後のコミット、コメントちょっと編集してsha1変えて push -f ? それもキモくないか 空コミットよりマシか

Edited 2012-11-17 11:24
空コミットよりマシなのでgit commit -v –amend でコメント変えてsha1変えてpush -f で運用することにした!

Edited 2012-11-17 11:27
git のpush だるくて(リモートのブランチ名なぞ覚えてない) historyから補完して打っちゃうこと多くて意図しないpush -f入るの怖いんだよね そうでなくてもよく注意力散漫であってなるのに。