Beeeat’s log

Beeeat’s log

プログラミングで出くわした知識やツール、日常生活、働き方その他色々なことをメモしていくブログ

Gitlab gem で GitLab API を使ってみる

趣味で GitLab も使ってみているのですが,GitLab API を使って issue や プルリクエストを Slack に通知したいなぁとふと思いました.

そこで octokit.rb のようなライブラリが GitLab にないかなぁと探してみたらやはりあるもんなんですね.今回は Gitlab gem の使い方についてまとめてみようと思います.

github.com

使い方

簡単に触ってみたのでこんなプロジェクト構成です.今回はプロジェクトにある issue を取得しようと思います.

gitlab-api-sample
├── .env
├── .gitignore
├── Gemfile
├── Gemfile.lock
└── app.rb

Gemfile

# frozen_string_literal: true

source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem 'gitlab'
gem 'dotenv'

.env

GITLAB_TOKEN='GitLab のパーソナルアクセストークン'
GITLAB_PRIJECT_ID='GitLab のプロジェクトID'

.gitignore

.env

app.rb

require 'dotenv'
require 'gitlab'
Dotenv.load

Gitlab.configure do |config|
  config.endpoint       = 'https://gitlab.com/api/v4'
  config.private_token  = ENV["GITLAB_TOKEN"]
end

puts issues = Gitlab.issues(ENV["GITLAB_PRIJECT_ID"], { labels:'Today,緊急', state:'opened' }).inspect

Gitlab gem で何ができるのかが下記のドキュメントをご確認ください.

www.rubydoc.info

ただ,上記のコードにあるように特定の Label がついた issue を取得する方法を理解するのに少し詰まりました.今回は使った issues のドキュメントはこちらになるのですが,Label の条件をどうやって追加するのかがパット見でわかりません.しかし,よく見てみるとドキュメントに以下の記述とコードがあります.

Parameters:

project (Integer, String) (defaults to: nil) — The ID or name of a project.

options (Hash) (defaults to: {}) — A customizable set of options.

# File 'lib/gitlab/client/issues.rb', line 20

def issues(project = nil, options = {})
  if project.to_s.empty? && project.to_i.zero?
    get('/issues', query: options)
  else
    get("/projects/#{url_encode project}/issues", query: options)
  end
end

どうやらoptionsquery を設定できることがわかります.

query ってどう書くの?

さて,そこで query はどう書くの!?という話になるのですが色々調べたり試してみた所,どうやら公式の Issues API にヒントがありました.

docs.gitlab.com

〜省略〜
GET /issues?labels=foo,bar
〜省略〜

どうやら,labelsというのをqueryとして利用すれば良さそうであることがわかります.

app.rbを改めて載せると下記のように Label の条件はハッシュで書くことで取得できます.stateなど他の条件もハッシュで書いていきます.

app.rb

require 'dotenv'
require 'gitlab'
Dotenv.load

Gitlab.configure do |config|
  config.endpoint       = 'https://gitlab.com/api/v4'
  config.private_token  = ENV["GITLAB_TOKEN"]
end

# Labelの条件は hash の形式で書く
puts issues = Gitlab.issues(ENV["GITLAB_PRIJECT_ID"], { labels:'Today,緊急', state:'opened' }).inspect

実際に実行すると下記のようになります.

gitlab-api-sample - [master●] » bundle install                                                    2020/06/29 19:54:11 
Using bundler 2.1.4
Using dotenv 2.7.5
Using mime-types-data 3.2020.0512
Using mime-types 3.3.1
Using multi_xml 0.6.0
Using httparty 0.18.1
Using unicode-display_width 1.7.0
Using terminal-table 1.8.0
Using gitlab 4.15.0
Bundle complete! 2 Gemfile dependencies, 9 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
gitlab-api-sample - [master●] » ruby app.rb
〜ここに label が Today, State が opened の issue 表示される〜

まとめと所感

今回は Gitlab gem で Ruby で GitLab API を使ってみたことについてまとめてみました.今回を通して Gitlab gem で簡単に GitLab API を使えることがわかったのに加えて,queryの書き方を調べたことで,この手のライブラリの読み方についてさらにわかったきたように思いました.

API のドキュメントって読むのに少し慣れが必要だと前々から何となく思っていて,今回を通してほんの少し成長した気がします笑

今作っているツールも出来上がり次第,ブログに書いていこうと思います!!!