GitHub | octokit.rb で 公開鍵を登録・参照・削除 #github #octokit

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

## <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 "octokit"
~~~

### <i class="fa fa-gear" style="font-size:1em;"></i> .env の作成
GitHub のアクセストークンは GitHub で確認。
鍵のパスは登録対象の鍵のパスを記述する。
PUBLIC_KEY_ID は GitHub に登録する際の鍵の ID を指定します

~~~
GITHUB_ACCESS_TOKEN=your_access_token
PUBLIC_KEY_PATH=/path/to/your/key
PUBLIC_KEY_ID=your_key_id
~~~

### <i class="fa fa-code" style="font-size:1em;"></i> 鍵の登録スクリプト
API は以下。
<i class="fa fa-external-link-square" style="font-size:1em;"></i> [add_key](http://octokit.github.io/octokit.rb/Octokit/Client/Users.html#add_key-instance_method)

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

~~~ruby
require 'octokit'
require 'dotenv'

Dotenv.load
client = Octokit::Client.new(:access_token => ENV['GITHUB_ACCESS_TOKEN'])
timestamp = Time.now.strftime('%Y%m%d_%H%M%S')
# key name format = base_keyname + _ + timestamp (yyyymmdd_hhmiss)
client.add_key("#{ENV['PUBLIC_KEY_ID']}_#{timestamp}", File.read(ENV['PUBLIC_KEY_PATH']))
~~~

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

~~~bash
ruby add_public_key.rb
~~~

### <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://octokit.github.io/octokit.rb/Octokit/Client/Users.html#keys-instance_method)

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

~~~ruby
require 'octokit'
require 'dotenv'

Dotenv.load
client = Octokit::Client.new(:access_token => ENV['GITHUB_ACCESS_TOKEN'])
print client.keys.map { |e|e[:title] }
~~~

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

~~~bash
ruby list_public_keys.rb
~~~

* 実行結果

~~~bash
["deploy_20141211_151046"]
~~~

### <i class="fa fa-code" style="font-size:1em;"></i> 鍵の削除スクリプト
API は以下。
<i class="fa fa-external-link-square" style="font-size:1em;"></i> [remove_key](http://octokit.github.io/octokit.rb)

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

~~~ruby
require 'octokit'
require 'dotenv'

Dotenv.load
client = Octokit::Client.new(:access_token => ENV['GITHUB_ACCESS_TOKEN'])

puts "before remove"
print client.keys.map { |e|e[:title] }, "\n"
puts "start remove"
client.keys.sort_by { |e|e[:title] }
            .reverse
            .drop(1)
            .each { |e|client.remove_key(e[:id]) }
puts "finish remove"
puts "after remove"
print client.keys.map { |e|e[:title] }, "\n"
~~~

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

~~~bash
ruby remove_public_key.rb
~~~

* 出力

~~~
before remove
["deploy_20141211_154231", "deploy_20141211_154939", "deploy_20141211_154956"]
start remove
finish remove
after remove
["deploy_20141211_154956"]
~~~

## <i class="fa fa-arrow-circle-right" style="font-size:1em;"></i> 参照
* <i class="fa fa-github-square" style="font-size:1em;"></i> [GitHub](http://github.com/)
* <i class="fa fa-github-square" style="font-size:1em;"></i> [octokit.rb](https://github.com/octokit/octokit.rb)
* <i class="fa fa-github-square" style="font-size:1em;"></i> [dotenv gem](https://github.com/bkeepers/dotenv)