詩と創作・思索のひろば

ドキドキギュンギュンダイアリーです!!!

Fork me on GitHub

GitHub のコミットステータスをターミナルで確認できるやつ

タイトルは若者エントリメーカーで生成しました。

コミットステータスというのは GitHubAPI で特定のコミットに success/failure/pending のステータスを与えることができるやつで、例えば CI でテストした結果がプルリクエストのウェブ画面で確認できる。誰でも見たことあると思う。

f:id:motemen:20140701133830p:plain

業務でも使ってるけど、git push したあとにいちいち結果を確認するのが面倒だったので、ターミナルから確認できるようなのを作った。

プロンプトに表示するとこういう感じで✓が確認できて便利(最後に設定例があります)。

f:id:motemen:20140701134611p:plain

インストール・使い方

% go get github.com/motemen/github-commit-status-mark

普通に起動すると現在のリポジトリの最新のコミット(HEAD)のステータスを GitHub から取得してきて、色付きの文字で表示する。

f:id:motemen:20140701133525p:plain

このスクリーンショットにはないけど、ステータスが存在しないときは "?" と表示する。

設定

まずはいつも通り https://github.com/settings/tokens/new からトークンを作成してください。たぶん "repo:status" 権限だけで動くと思う。パブリックリポジトリだけなら設定しなくてもいいけど、たぶんすぐに API Limit に達すると思う。

環境変数

GITHUB_COMMIT_STATUS_TOKEN にトークンを入れる。この場合 GitHub:Enterprise に対応してないので微妙。

.netrc (new!)

あの .netrc に拙作のツールとしては初めて挑戦。ドメインに対するアカウント設定となるので、他の GitHubツールが .netrc に対応していればトークンを共有することになる。楽だけど、権限の管理という点では不安な一面も。

domain api.github.com
    user motemen
    password YOUR_TOKEN
domain ghe.example.com
    user motemen
    password YOUR_TOKEN

.gitconfig

おなじみ gitconfig。github-commit-status.token もしくは github-commit-status.https://ghe.example.com/.token にトークンを設定する。

[github-commit-status]
token = YOUR_TOKEN

[github-commit-status "https://ghe.example.com/"]
token = YOUR_TOKEN

キャッシュ

外部の API を叩くので、.github-commit-status/ 以下にキャッシュを作って、前の結果を一定期間キャッシュするようにしてる。特に一度 success か failure になった結果は永遠にキャッシュされる。-update-cached オプションでキャッシュを強制的に更新したり、絶対に API リクエストをしないようにしたりできる。

プロンプトに表示する

自然にステータスを確認できるように、エンジニアのフロンティアであるシェルのプロンプトにこれを表示したいけれど、プロンプト描画のたびに API アクセスが発生すると使いづらいので、バックグラウンドで通信を行いつつ、プロンプトに表示する内容はキャッシュされたものを使う、という風にしてみてる。こんな感じ。

https://github.com/motemen/dotfiles/blob/3373c12/.zshrc#L174-L177

以上です

motemen/github-commit-status-mark · GitHub

追記

おすすめスマホゲーム5選(ソシャゲなし)

ども、スマホゲーおじさんです。最近スマートフォンのゲームをプレイする機会が多いので、いくつかプレイした中から面白かったものを紹介します。

  • Android でプレイしてますが、iOS と両方に出てるものも(むしろ iOS の方が先にリリースされているものも)多いです。かなり雑に探索してるので、「このゲームを挙げるのに何でこれがないんだよ」って声は甘受いたしますし、オススメがあったら教えてください。
  • ソシャゲの定義は「ガチャのあるゲーム」です。

Pro Cat Hugger Extreme

いやあこれを紹介したかっただけなんだけど……。かわいい猫をハグしてやるゲーム。猫は次から次に現れるので効率よく抱いてあげよう! あまり強いと血を吐いて死んじゃうので気をつけて。動画を見たらわかると思うけど、賑やかで楽しい。リーダーボードあり(プレイ人数が少ないので、今なら上位を狙える!)。たぶんアンドロイドのみ。

Blackbar(有料)

1984』的なディストピア世界感。友人と手紙のやりとりをしているのだけれど、手紙はところどころ検閲されてしまっているので、そこを補完しながら読み進めていくっていうテキストアドベンチャー。ヒントは文脈と文字数だけ! とはいえ隠された単語自身は基本的には難しくないので、辞書と Google(「英単語 5文字」とかでぐぐる……)を頼りに進むことができる。英語ネイティブなら余裕だろうところもフレーズを知らなければ想像すらつかなくて、面白い。全部の単語が黒塗りのこのスクリーンショットも、ここまでストーリーを進めていれば埋められるはず。

ただの穴埋めだけじゃなくいろいろ工夫が凝らされていて楽しいのだけれど、終わりの尻切れトンボ感が難点。

Blackbar

Blackbar

  • Mrgan LLC
  • ゲーム
  • ¥300

Pixel Dungeon

ドット絵のローグライクスマホローグライクはいろいろあると思うけれど、これは操作もしやすかったしグラフィックも良く(まあ他にやってたの Angband とかだったりするんだけど……)、無料とは思えない出来。広告もないけど寄付はできるので、寄付しましょう。たぶんアンドロイドのみ。

Disco Zoo

簡単なパズルで動物を捕まえて、動物園を大きくしていく。動物は時間が経つと寝てしまい、その間はお金が稼げないので、起こしてやる必要がある。それが面倒だったら……パーティーだ!(?)パーティー状態になると客も動物も踊りだすのが楽しい。課金もできるんだけど課金しなくても全然遊べてしまうのは、よいのか悪いのか……。Funky Bus っていう Flappy Bird 的なミニゲームがついてる。リーダーボードあり。

Disco Zoo

Disco Zoo

  • NimbleBit LLC
  • ゲーム
  • 無料

Monument Valley(有料)

錯視を利用したパズル。Fez とか ilomilo を思い出しますね。面白いんだけど、(はっきりしていないとはいえ)ストーリー重視、雰囲気重視のようで、ボリューム・難易度ともに物足りないのも事実。追加のチャプターも作っているらしいので期待せず待ちたい。

Monument Valley

Monument Valley

  • ustwo™
  • ゲーム
  • ¥400

Infinilander

これはおまけです。着陸ゲー。無重力感とどんな着陸をしたかで得点が上がるのが面白かったんだけど、Android 4.4 にしたら動かなくなった……。App Store 版は有料みたいだけど Google Play では無料。

Infinilander

Infinilander

  • Omer Tari
  • ゲーム
  • ¥100

Wercker で Go のプロジェクトをクロスコンパイルし、GitHub にリリースする

f:id:motemen:20140626234933p:plain

ghq をメンテナンスするにあたっていくつか無料の CI サービスを試してみたのですが、今回は Wercker を使うことにしました。いろいろ試行錯誤した結果表題のことがなんとか実現できた(ghq のリリースは GitHub 上 にあります)ので、ハマりポイントと共にこのエントリで紹介します。

Wercker

Wercker は CI サービスのひとつで、ビルド環境やデプロイの 1 ステップを box および step という形でユーザが公開・共有し、それらを組み合わせることで CI の設定をシンプルにしようとしているところが特徴です。

ghq の wercker.yml を見てもらえばだいたい雰囲気は分かると思いますが、大まかに言って “box”, “build”, “deploy” の 3 項目をプロジェクトごとに設定します。

box はビルドが走る環境です。OS や、テストに必要なパッケージなどがインストールされている、多くのユーザで共通のものが使用できる環境です。Go が使えるとか、MySQL が使えるとかです。

GitHub に push したタイミングで、build に指定した step が順次実行され、これらが完遂するとビルドは成功となります。step は box のように公開・共有されているものが沢山あるので、これを使うこともできますし、自前で用意することもできます。

成功したビルドは、デプロイすることができます。ウェブや CLIツールからデプロイターゲットを選び、実行すると、deploy に指定したステップに従って、build の成果物を使ってデプロイを行います。特定のブランチのビルドが成功した場合に自動的にデプロイさせることも可能です。

box も step も、GitHubリポジトリに置いて、それ自体を wercker でビルド・デプロイすることで他のユーザに公開できるようになってます。ここが面白いところですね。

ghq の場合

Wercker によって、GitHub のリリースに成果物を添付する方法が紹介されています(Deploying your assets to GitHub Releases)が、これをそのまま利用できたわけではなく、紆余曲折あって今のような wercker.yml になってます。

現在の HEAD からリリースするタグを自動的に決める

先のエントリで紹介されている step-github-create-release では tag というパラメータが必須で、ビルド中の環境変数もしくは設定ファイルでリリース対象のタグを指定する必要がありました。最初はこれを fork し、tag が設定されていなければ直近のタグを使用する、としていたのですが、最終的にこの機能は出番がなくて、fork した意味はありませんでした……。というのも、ビルドして出来上がった成果物をデプロイするフェーズで .git ディレクトリが失われてしまうので、タグの情報を復元できなくなってしまったからでした。現在はビルドフェーズでタグ情報を取得して、デプロイに渡すようにしています。

step-github-create-release は body というパラメータでリリースの本文を作ることができますが、これは JSON の文字列としてエンコードされている必要があるので、自動生成するのは難しいです(ステップはシェルスクリプトで書かれているので……。ソースコードを読めば同情はできる)。リリース本文 CHANGELOG.md から手でコピペしてしまっている。

ロスコンパイル

Wercker が提供している box-golang はクロスコンパイルをサポートしていない(多分)ので、これを可能にする box を作成する必要がありました。最初に gox をインストールした box-golang-gox を作ったのですが、GitHub のリリースはファイルに階層を与えられないので、同じ名前のバイナリを複数添付することができず、ghq_darwin_amd64 のような名前でバイナリを添付するしかありませんでした。

そのあとで @mattn_jp さんに goxc の存在を教えてもらい、これを使ってアーカイブファイルに固めることで、バイナリ自身の名前を変えずにリリース可能になりました。現在はこの box-golang-goxc を使っています。goxc はけっこう多機能なので、クロスビルドだけできればいい方は gox を使えばよさそうです。

自動デプロイ(できない)

当然、ここまで出来たら「master にタグを切って push したら自動でリリースされる」といきたいものですが、今のところ綺麗な実現はできていません。wercker の自動デプロイはブランチ名に対してしか設定できないので、とりあえず master のコミットを全部デプロイすることにしています。当該のコミットにちょうど対応するタグが存在しないときにはリリース先のタグがないので、変なリリースが作られることもありません(デプロイもなぜか失敗扱いにならないので、気にしてない)。

あと気をつけないといけないのが、GitHub に push すると即座にビルドが走るので、先にタグを push しておかないとビルド中にタグを発見できず、タグを切ったつもりのコミットもデプロイされないことがある点です。仕方ないので master にタグを切ったあとは先にタグを push しています。

おわり

タグを契機にした自動デプロイは措いておくとして、とりあえずこんな感じで ghq はリリースされています。Wercker はまだβだそうなので、今後の発展に期待しつつ使ってみるのもいいんじゃないでしょうか。

はてなで一緒に働きませんか?