Bitbucket | bitbucket_rest_api gem で 公開鍵を登録・参照・削除 #bitbucket

# Bitbucket | bitbucket_rest_api gem で 公開鍵を登録・参照・削除 #bitbucket
## <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
<i class="fa fa-bitbucket" style="font-size:1em;"></i> bitbucket_rest_api gem で 公開鍵を追加・参照・削除します。
## <i class="fa fa-cube" style="font-size:1em;"></i> 前提
* 対象ユーザーは <i class="fa fa-bitbucket" style="font-size:1em;"></i> [Bitbucket](https://bitbucket.org/) に登録済み
* <i class="fa fa-github-square" style="font-size:1em;"></i> [bitbucket_rest_api gem](https://github.com/vongrippen/bitbucket) をインストール済み
* <i class="fa fa-external-link-square" style="font-size:1em;"></i> [dotenv gem](http://rubygems.org/gems/dotenv) をインストール済み

## <i class="fa fa-files-o" style="font-size:1em;"></i> 手順
### <i class="fa fa-gear" style="font-size:1em;"></i> Gemfile の作成
環境変数の設定に <i class="fa fa-github-square" style="font-size:1em;"></i> [dotenv gem](https://github.com/bkeepers/dotenv) を利用します

~~~ruby
source "https://rubygems.org"

gem "dotenv"
gem "bitbucket"
~~~

### <i class="fa fa-gear" style="font-size:1em;"></i> .env の作成
鍵のIDは BitBucket に登録する際のラベル名を指定する。
鍵のパスは登録対象の鍵のパスを記述する。
Basic 認証用のユーザー名とパスワードを記述する。

~~~
PUBLIC_KEY_PATH=public_key_path
PUBLIC_KEY_ID=deploy
LOGIN=your_login_name
PASSWORD=your_password
~~~

### <i class="fa fa-code" style="font-size:1em;"></i> 鍵の登録スクリプト
API は以下。
<i class="fa fa-external-link-square" style="font-size:1em;"></i> [new_key](http://www.rubydoc.info/github/vongrippen/bitbucket/master/BitBucket/Users/Account:new_key)

鍵の ID にはタイムスタンプを付与します。

~~~ruby
require 'bitbucket_rest_api'
require 'dotenv'

begin
  Dotenv.load
  bitbucket = BitBucket.new basic_auth: "#{ENV['LOGIN']}:#{ENV['PASSWORD']}"

  timestamp = Time.now.strftime('%Y%m%d_%H%M%S')
  bitbucket.users.account.new_key(ENV['LOGIN'], {
    key: File.read(ENV['PUBLIC_KEY_PATH']),
    label: "#{ENV['PUBLIC_KEY_ID']}_#{timestamp}" 
  })
  puts "Complete add '#{ENV['PUBLIC_KEY_ID']}_#{timestamp}' key"
  exit(true)
rescue => e
  puts e.message
  exit(false)
end
~~~

## <i class="fa fa-key" style="font-size:1em;"></i><i class="fa fa-cloud-upload" style="font-size:1em;"></i> 鍵登録の実行

~~~bash
$ ruby new_key.rb
Complete add 'deploy_20141212_151637' key
~~~

### <i class="fa fa-code" style="font-size:1em;"></i> 鍵の参照スクリプト
API は以下。
<i class="fa fa-external-link-square" style="font-size:1em;"></i> [keys](http://www.rubydoc.info/github/vongrippen/bitbucket/master/BitBucket/Users/Account:keys)

.env ファイル・ Gemfile は登録処理と同じ。
自ユーザーの鍵をすべて取得します。

~~~ruby
require 'bitbucket_rest_api'
require 'dotenv'

begin
  Dotenv.load
  bitbucket = BitBucket.new basic_auth: "#{ENV['LOGIN']}:#{ENV['PASSWORD']}"

  print bitbucket.users.account.keys(ENV['LOGIN']).map { |e|"id:#{e.pk},label:#{e.label}" }.join("\n") + "\n"
  exit(true)
rescue => e
  puts e.message
  exit(false)
end
~~~

## <i class="fa fa-key" style="font-size:1em;"></i><i class="fa fa-search" style="font-size:1em;"></i> 鍵参照の実行

~~~bash
$ ruby keys.rb
id:2249918,label:deploy_20141212_151637
id:2249873,label:deploy_20141212_150343
id:2249871,label:deploy_20141212_150247
id:2249868,label:deploy_20141212_150207
id:2249860,label:deploy_20141212_150018
id:2249858,label:deploy_20141212_145946
~~~

### <i class="fa fa-code" style="font-size:1em;"></i> 鍵の削除スクリプト
API は以下。
<i class="fa fa-external-link-square" style="font-size:1em;"></i> [delete_key](http://www.rubydoc.info/github/vongrippen/bitbucket/master/BitBucket/Users/Account:delete_key)

.env ファイル・ Gemfile は登録処理と同じ。
登録処理で複数登録した鍵のうち、最新のタイムスタンプを除いて削除します

~~~ruby
require 'bitbucket_rest_api'
require 'dotenv'

def show_keys(bitbucket)
  print bitbucket.users.account.keys(ENV['LOGIN']).map { |e|"id:#{e.pk},label:#{e.label}" }.join("\n") + "\n"
end

begin
  Dotenv.load
  bitbucket = BitBucket.new basic_auth: "#{ENV['LOGIN']}:#{ENV['PASSWORD']}"

  puts "before remove"
  show_keys(bitbucket)
  puts "start remove"
  bitbucket.users.account.keys(ENV['LOGIN']).sort_by { |e|e[:label] }
            .reverse
            .drop(1)
            .each { |e|bitbucket.users.account.delete_key(ENV['LOGIN'], e[:pk]) }
  puts "end   remove"
  show_keys(bitbucket)
  puts "after remove"
  exit(true)
rescue => e
  puts e.message
  exit(false)
end
~~~

## <i class="fa fa-key" style="font-size:1em;"></i><i class="fa fa-trash" style="font-size:1em;"></i> 鍵削除の実行

~~~bash
ruby delete_public_key.rb
~~~

* 出力

~~~
$ ruby delete_key.rb
before remove
id:2249918,label:deploy_20141212_151637
id:2249873,label:deploy_20141212_150343
id:2249871,label:deploy_20141212_150247
id:2249868,label:deploy_20141212_150207
id:2249860,label:deploy_20141212_150018
id:2249858,label:deploy_20141212_145946
start remove
end   remove
after remove
id:2249918,label:deploy_20141212_151637
~~~

## 補足
* REST API の検証時に、 Bitbucket が提供している REST API Console を利用すると便利です
    * <i class="fa fa-bitbucket-square" style="font-size:1em;"></i> [REST API Console](http://restbrowser.bitbucket.org/)

## <i class="fa fa-arrow-circle-right" style="font-size:1em;"></i> 参照
* <i class="fa fa-github-square" style="font-size:1em;"></i> [bitbucket Ruby API wrapper](https://github.com/vongrippen/bitbucket)
* <i class="fa fa-bitbucket-square" style="font-size:1em;"></i> [Bitbucket | REST API Document](https://confluence.atlassian.co.jp/pages/viewpage.action?pageId=33687485)