- @kenchan / Twitter
- GMOペパボ株式会社 技術責任者 兼 EC事業部 シニアエンジニアリングリード
- 好きなメソッドは Enumerable#inject
- Bundler: The best way to manage a Ruby application's gems
- Rubyのライブラリのバージョンや依存関係を管理するためのもの
- PHPでいうComposer
- Ruby本体にバンドルされるようになった
❯ bundle init
Writing new Gemfile to /home/kenchan/src/github.com/kenchan/shibuyarb/Gemfile
# frozen_string_literal: true
source "https://rubygems.org"
gem "octopus"
❯ 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
- プロジェクトにするほどではないがちょっとしたスクリプトでライブラリを使いたいケースがある
- GitHubのAPIをちょっと使いたい
- SlackのAPIをちょっと使いたい
- AWSのAPIをちょっと使いたい
- 都度
bundle init
してもいいけど… - そこで
bundler/inline
ですよ
ある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
会社用の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
- 1ファイルにRubyスクリプトとそれが利用するライブラリを記述できる
- 1ファイルで実行環境を再現させられる
ライブラリの初期設定だけをファイルに書いておけば、その状態で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/direnv: unclutter your .profile
- あるディレクトリに移動した際に自動的に環境変数を設定する
- ディレクトリと環境変数の組み合わせで、読み込むかどうかをホワイトリストで管理できる
- Command-Line Tool ツール | 1Password
- 1passwordにある情報にアクセスするCLI
- v2から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