Posted at

GitLab APIを使ってIssuesの一覧を取得できるようにした

GitLabで管理している課題一覧を取得したかったんですが、無償版では画面からのExportに対応していなかったので、APIを経由して取得できるようにスクリプト化してみました。


やりたいこと


  1. 画面からCSVエクスポートするように、GitLabのIssuesを一覧化できる仕組みを作る。


準備

以下をインストールする必要あり。

$ pip install -t libs requests

$ pip install -t libs beautifulsoup4

コードはこんな感じで組みました。

https://github.com/kojiisd/lambda-gitlab-issues-manager/tree/1.0


中身

ポイントとなる中身はこんな感じです。


クエリストリングとURLの指定

クエリストリングとURLを指定して中身を取得するために、こんな実装をしています。

  query = {

"scope": "all",
"state": status,
"milestone_title": os.environ['MILE_STONE'] ,
"page": page
}
:
:
response = requests.get(os.environ['TARGET_URL'], headers=headers, params=query)
soup = BeautifulSoup(response.text, "html.parser")


ページごとのループ処理

GitLabはページごとの取得の限界Issue数があるので、次ページを見に行く様に実装しています。現状はとりあえず次ページを確認して、同じIDであったらページ遷移をやめる、という非効率な実装をしています。

  # Confirm ID for loop

if issue_num_list[0].text.replace("\n", "\t") == prev_num:
prev_curr_diff = False
prev_num = 0
page = 1
break
else:
prev_num = issue_num_list[0].text.replace("\n", "\t")
page += 1


タイトルリストはタブ区切り

取得したHTMLは開業ベースで取得されてしまうので、タブ区切りに編集します。

  for issue_num in issue_num_list:

issue_title = issue_title_list[index]
print(issue_num.text.replace("\n", "\t") +
status + "\t" +
issue_title.text.replace("\n", "\t") )
index += 1

これで「ID、ステータス、タイトル」がタブ区切りで出力される様になりました。


実行方法

とりあえずLambdaにデプロイしてもらってもいいですが、ローカルで実行する場合はslsコマンドで以下の様に実行できます。

$ sls invoke local -f issues_manager