Skip to content

Instantly share code, notes, and snippets.

@kenchan
Last active March 15, 2024 15:09
Show Gist options
  • Save kenchan/e7afa9ff25fda6b3a57044c2d0deebfc to your computer and use it in GitHub Desktop.
Save kenchan/e7afa9ff25fda6b3a57044c2d0deebfc to your computer and use it in GitHub Desktop.

⭐ bundler/inline ⭐

👨 自己紹介

💎 Bundlerについて

☺️ Bundlerのスタンダードな使い方

bundle initで雛形を作る

bundle init
Writing new Gemfile to /home/kenchan/src/github.com/kenchan/shibuyarb/Gemfile

Gemfileを編集する

# frozen_string_literal: true

source "https://rubygems.org"

gem "octopus"

bundleコマンドを実行

❯ bundle
Fetching gem metadata from https://rubygems.org/...........
Resolving dependencies...
...
...
Bundle complete! 1 Gemfile dependency, 40 gems now installed.

  • Railsや他のフレームワークではプロジェクトの雛形作成時に自動で必要んライブラリが入ったGemfileが出力されることが多い
    • rails new
    • bundle gem

😺 bundler/inlineについて

  • プロジェクトにするほどではないがちょっとしたスクリプトでライブラリを使いたいケースがある
    • GitHubのAPIをちょっと使いたい
    • SlackのAPIをちょっと使いたい
    • AWSのAPIをちょっと使いたい
  • 都度 bundle initしてもいいけど…
  • そこでbundler/inlineですよ

利用例1: slackチャンネルの引越し

あるslackチャンネルにいる全員を別のチャンネルにも招待したい。チャンネルの引越しや、一時的な連絡チャンネルを作るときに利用できる。

環境変数SLACK_API_TOKENさえあれば、ruby slack-moving.rb だけでライブラリのインストールから実行まで一発でできる。

# slack-moving.rb

require 'bundler/inline'

gemfile do
  source 'https://rubygems.org'
  gem 'slack-ruby-client'
end

SRC_CHANNEL_NAME = '#my-team-channel'
DEST_CHANNEL_NAME = '#new-my-team-channel'

Slack.configure do |c|
  c.token = ENV['SLACK_API_TOKEN']
end

client = Slack::Web::Client.new
all_members = []
client.conversations_members(channel: SRC_CHANNEL_NAME) do |res|
  all_members += res["members"]
end

puts "count: #{all_members.count}"
puts "members: #{all_members.join(",")}"

# まとめて追加すると一人でもエラーになると全体が失敗するので、一人ずつ追加する
all_members.each do |u|
  begin
    client.conversations_invite(channel: DEST_CHANNEL_NAME, users: u)
  rescue
    p [$!, u]
  end
end

利用例2: GitHubのwatchを整理する

会社用のGitHub Enterpriseのwatchが多すぎて読みきれないので、一旦整理したくなった。

octokitには環境変数からトークンや接続先を設定できるので、ruby unwatch.rb だけでwatchの整理ができる。

# unwatch.rb

require 'bundler/inline'

gemfile do
  source 'https://rubygems.org'
  gem 'octokit'
end

Octokit.configure do |c|
  c.auto_paginate = true
end

me = Octokit.user

c = Octokit::Client.new

c.subscriptions.each do |s|
  if s.owner.login != me.login && s.owner.type == 'User'
    # 自分以外個人のリポジトリはunwatchする
    puts "delete_subscriptions: #{s.full_name}"
    Octokit.delete_subscription(s.full_name)
  elsif %w(unused_org unnecessary_org).include? s.owner.login
    # 使ってないorgはunwatchする
    puts "delete_subscriptions: #{s.full_name}"
    Octokit.delete_subscription(s.full_name)
  elsif s.archived?
    # リポジトリがarchiveされてたらunwatchする
    puts "delete_subscriptions: #{s.full_name}"
    Octokit.delete_subscription(s.full_name)
  elsif s.updated_at.year < Time.now.year - 1
    # 1年間動きのないリポジトリはunwatchする
    puts "delete_subscriptions: #{s.full_name}"
    Octokit.delete_subscription(s.full_name)
  end
end

👍 bundler/inlineの利点

  • 1ファイルにRubyスクリプトとそれが利用するライブラリを記述できる
  • 1ファイルで実行環境を再現させられる

📝 bundler/inlineをつかったスクリプトを書くときに使っているTips

binding.irb でREPLを立ち上げる

ライブラリの初期設定だけをファイルに書いておけば、その状態でREPLを立ち上げることができる。

require 'bundler/inline'

gemfile do
  source 'https://rubygems.org'
  gem 'slack-ruby-client'
end

Slack.configure do |c|
  c.token = ENV['SLACK_API_TOKEN']
end

client = Slack::Web::Client.new

binding.irb # <<<<< ライブラリのインストールと初期設定がおわった状態でREPLが立ち上がる

direnvと1password cliで秘匿情報を設定する

op run?

  • op://#{vault}/#{item}/#{value}という形式で1Passwordにある情報を参照できる
  • 環境変数の値として設定しておくと、自動的に展開される
    • デフォルトだと、標準出力の際にマスキングされる
export OCTOKIT_ACCESS_TOKEN=op://7wrn62l67seaaiq7rv7s4chjuu/ogmqs3hm5uqz363pft4fge6dza/credential
export OCTOKIT_API_ENDPOINT=https://git.example.com/api/v3

利用例

$ eval (op signin)

$ op run -- ruby unwatch.rb

😃 まとめ

  • RubyにバンドルされているライブラリバージョンマネージャとしてBundlerがある
  • bundler/inline という仕組みで1ファイルの中に依存関係と動くスクリプトを共存させられる
  • 1ショットのスクリプトや日々の業務の効率化にとても便利

⭐ 宣伝

GMO Developers Day 2022 是非ご登録&ご来場ください!!1

GMO Developers Day 2022に登壇&ブース出展します - Pepabo Tech Portal

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment