まっしろけっけ

めもてきなやーつ

DeployGate のアカウントを PullRequest ベースで管理したい

はじめに

DeployGate is
deploygate.com

会社で使ってたりするとアカウント管理とかが大変ですよね。退職したらその人のアカウント消したり、気づかないうちにカオスになってしまうことも....

そんなカオスな事を出来るだけ回避したいので Github などで PullRequest ベースでアカウントの追加/削除ができるとちょっと嬉しい気がします。Enterprise プランであれば SAML が使えるのでそれでも良いと思います。

yaml でユーザを管理する

使う gem はこちら

gem install deploygate-client

これは元同僚の Android エンジニアがまだ一緒に働いてた時に「API とかあるならコードで管理するようにしたら?」と言ったら作ってたやつ。結局コード管理するまで至らずに退職しちゃったんですけどね...

まずは既存のアカウント一覧を yaml に吐き出す。

require 'deploygate/client'
require 'json'
require 'yaml'

org_name = "管理したい org"

client = Deploygate::Client.new(token: ENV['DEPLOYGATE_TOKEN']) # 環境変数の DEPLOYGATE_TOKEN にトークンを設定する
response = client.organization_members(org_name: org_name)
members = JSON.parse(response.body)["members"].map { |val| val["name"] }

YAML.dump({members: members}, File.open('members.yaml', 'w'))

これで members.yaml に既存のアカウントが書き出される

次は yaml に書いてあるアカウントを DeployGate 側に反映される。

require 'deploygate/client'
require 'json'
require 'yaml'

org_name = "管理したい org"
dryrun = ENV['DRY_RUN'] # 環境変数で DRY_RUN を設定するとアカウントの増減はしないで変更予定の出力だけ得られる

client = Deploygate::Client.new(token: ENV['DEPLOYGATE_TOKEN']) # 環境変数の DEPLOYGATE_TOKEN にトークンを設定する

response = client.organization_members(org_name: org_name)
api_members = JSON.parse(response.body)["members"].map { |val| val["name"] }

yaml_members = YAML.load_file('members.yaml')["members"]

add_members = yaml_members - api_members # yaml に書いてあるのに DeployGate に存在しないアカウントは追加したいアカウント
delete_members = api_members - yaml_members # yaml に書いてなくて DeployGate に存在するアカウントは消したいアカウント

add_members.each do |member|
  puts "add #{member}"
  client.add_organization_member(org_name: org_name, user_name: member) unless dryrun
end

delete_members.each do |member|
  puts "delete #{member}"
  client.delete_organization_member(org_name: org_name, user_name: member) unless dryrun
end

こんな感じでこのコードと members.yamlGithub で管理して Actions などで master に merge されたタイミングで実行するようにすれば PullRequest ベースで管理できるようになります。

エラー処理とかは特に行なっていない(ネットワークエラーとかで更新失敗しても再実行すれば yaml と同じ状況にできるので)

最後に

deploygate-client よくできてる。