読者です 読者をやめる 読者になる 読者になる

bundler_diffgems という gem を作りました #speee_lounge

ruby

2/18(土) と 2/25(土) に Speee さんのもくもく会に参加して、 gem が出来たので紹介。

speee.connpass.com

bundler_diffgems

bundler_diffgemsbundle update を支援するための CLI ツールで、GitHub の比較URL を簡単に表示できます。*1

インストール方法

$ gem install bundler_diffgems

でインストールできます。

使い方

いつものように bundle update をします。

$ bundle update

そのあと、 bundle diffgems を実行します。

$ bundle diffgems
rake: 11.3.0 => 12.0.0 - https://github.com/ruby/rake/compare/v11.3.0...v12.0.0
rspec: 3.5.0 =>
...

こんな感じで GitHub の比較URL付きでアップデートされた gem の一覧が表示されます。

速度

GitHub API の実行は parallel の gem を使っているので、そこそこ実用的な速度で比較URLが出るんじゃないかなーと思います。

フォーマット

Pull Request で見やすくするために md_table というフォーマットだけ増やしてます。

f:id:sinsoku:20170226183341p:plain

bundle update してプルリクを投げるスクリプト

私はこんな感じのスクリプトbin/update_gems に保存して、使っています。

#!/bin/bash
set -e

# TODO: You need to edit these variables
REPO=owner/repo
BASE_BRANCH=master

if [ -z "${GITHUB_TOKEN}" ]
then
  echo 'usage: GITHUB_TOKEN=<your 40 char token> update_gems'
  exit 1
fi

# Update gems
bundle update

# Push a commit
NOW=$(date +'%Y%m%d%H%M%S')
HEAD_BRANCH="gems/${NOW}"
BODY=$(bundle diffgems --escape-json -f md_table)
git checkout -b ${HEAD_BRANCH}
git add -u
git commit -m "Update gems ${NOW}"
git push origin ${HEAD_BRANCH}

# Create a pull request
API_URL="https://api.github.com/repos/${REPO}/pulls"
echo '{ "title": "Update gems '"${NOW}"'", "head": "'"${HEAD_BRANCH}"'", "base": "'"${BASE_BRANCH}"'", "body": '${BODY}' }' |
  curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST --data-binary @- ${API_URL}

定期的に bundle update をする

CI で上記のスクリプトを実行すると定期的な bundle update が実現できます。
下記は AWS CodeBuild の buildspec.yml の例です。*2

version: 0.1

phases:
  pre_build:
    commands:
      - gem install bundler
      - gem install bundler_diffgems
      - git config user.name bundler_bot
      - git config user.email mail@example.com
  build:
    commands:
      - ./bin/update_gems

AWS で定期実行する例

f:id:sinsoku:20170315194805p:plain

おわり

gem のアップデートを定期実行していない人でも便利に使えると思うので、ぜひお試しください。

*1:compare_linkerに似てる

*2:これを AWS CloudWatch Event + AWS Lambda で定期実行してます