【自動化】PythonでGitLabを操作して問い合わせ管理を楽にする

## 事件は現場で起きてんだ！

私は企業でソフトウェアの開発をしていますが、開発現場には「不具合は評価場で起きてるんじゃない！現場で起きてんだ！」とばかりに、営業からの問い合わせがえげつないほど来ます。

この問い合わせに対する調査・回答が、ただでさえ疲弊している開発メンバーをさらに疲弊させるわけです。

現場から問い合わせが来るのは仕方ないとして、問題なのはこの**問い合わせから回答までのプロセスがアナログ**で、

1. 現場の事務局から**問い合わせメール**が来る
2. 開発窓口がメールを受け取って、**問い合わせ管理表に記載**する
3. 適切な開発メンバーに**メールで回答を依頼**する

という流れなのですが、**基本的にすべてメールでやり取りするので面倒な上、各問い合わせに対して現在の状態がわかりにくい**という最悪な状態に陥っています。

![toiawase_before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/28357ced-7541-b812-cef2-f3b0fa5bbe57.png)


## プロセスを自動化しよう
この最悪なプロセスを次のように改善してみました。

1. 現場の事務局から**問い合わせメール**が来る
2. マイクロソフトの**Power Automate**を使って、Excel Onlineの問い合わせ管理表に**自動で追加**する
3. Pythonを使って、問い合わせ管理表を検索し、新しい問い合わせが追加されていたら、**自動でGitLabにissue登録**する
4. 開発メンバーにGitLabから自動で調査依頼メールが届く

![toiawase_after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/b4ce4f86-578d-1da6-9eba-7bc76d6bd420.png)

これで管理がかなり楽になりました。

今回の記事では

**3. Pythonを使って、問い合わせ管理表を検索し、新しい問い合わせが追加されていたら、自動でGitLabにissue登録する**

に関連して、**GitlabのissueをPythonで管理する**方法についてご紹介します。


## PythonでGitLabを操作する

**python-gitlab**というパッケージを使うことで、PythonでGitLabを操作することができます。

### インストール
まずは`pip install`コマンドでpython-gitlabをインストールしましょう。

```
pip install python-gitlab
```

### GitLabへの接続
PythonからGitLabに接続するためですが、GitLabはユーザー管理されていて誰でもアクセスできないようになっています。
そこで、自分自身の**アクセストークン**というものを発行して、それを使ってPythonでGitLabにアクセスできるようにしていきます。

#### GitLabのアクセストークンの発行
まず、GitLabの設定画面から自分自身の「アクセストークン」を発行しましょう。

##### 1. GitLabにログインして右上のアバター画像から「設定」を選びます。
![gitlab_token.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/e5aea6c7-740c-0ef8-4a2a-c1aa793979a8.png)

##### 2. 左側のメニューから「アクセストークン」を選びます。

![gitlab_token2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/b07ce400-414d-f626-a424-76ffbe685260.png)

##### 3.GitLabにアクセスするためのトークンを発行します。

- 名前：わかりやすいように適当に名前をつけます。
- 有効期限日：何も入力しなくてもいいです。その場合はトークンの有効期限は無期限になります。
- スコープ：apiを選んでください。

「Create personal access token」というボタンを押して、トークンを発行します。

![gitlab_token3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/a9c6d97c-9f74-df56-db1c-6cf6a889abce.png)

#### 4. 発行したしたアクセストークンの文字列が表示されます。
メモ帳などにこのトークンの文字列を**保存**しておきましょう。このページを離れると二度と確認できません。
※メモするのを忘れてしまった場合は、一度トークンを失効させて、再発行しましょう。

![gitlab_token4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/3432cff8-a875-4125-5c18-154478070879.png)

#### python-gitlabのconfigファイル作成

python-gitlabではconfigファイルに必要な情報を設定しておき、その情報を使ってGitLabにアクセスします。
上記で発行したアクセストークンもこのconfigファイルに設定します。

テキストエディタで下記のような内容を書いて「.python-gitlab.cfg」として、ユーザーフォルダ(C:\Users\XXXX(ユーザー名)に保存してください。

```:.python-gitlab.cfg
[global]
default = gitlab
ssl_verify = true
timeout = 5

[gitlab]
url = GitLabのURL
private_token = パーソナルアクセストークン
```

※ "GitLabのURL"と書いたところは、GitLabのURLを記載します。
※ "パーソナルアクセストークン"は、先ほどの手順で発行したあなたのトークンを記載してください。

おつかれさまでした。これで準備は完了です。
いよいよPythonでGitLabにアクセスしていきましょう。

### GitLabの操作

python-gitlabではユーザーやマイルストーンの管理もできるのですが、本記事ではissue("課題"、"チケット"とも呼ばれます)の操作について説明していきます。

必要に応じて[公式のドキュメント](https://python-gitlab.readthedocs.io/en/stable/gl_objects/issues.html)も参照ください。

#### プロジェクトへアクセス
先ほどのconfigファイルを使って、GitLabにアクセスします。

```python:Python

import gitlab

gl = gitlab.Gitlab.from_config()
```
そして、`gl.projects.get()`で、GitLabのプロジェクトIDを指定して、当該プロジェクトにアクセスします。
プロジェクトIDはGitLabにログインして確認しましょう。

```python:Python

project_id = 1234567 # プロジェクトID
project = gl.projects.get(project_id)
```

これで当該プロジェクトのオブジェクトができました。

さて、これで準備は整ったわけですが、いきなりissueを登録するのはちょっと怖いですよね。
なのでまずは、issueを参照できるか試してみましょう。

### issueを参照する

GitLabにはこのようなissue(課題)を登録しておきました。これらのissueをPythonで取得してみましょう。

![gitlab_issue.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/30d7fd2e-930d-748a-8de1-ca7739f27a73.png)


`project.issues.list()`を使って、当該プロジェクトに登録されているissueをリストで取得します。
あとは、for文を使って1つずつissueオブジェクトを取り出します。

```python:Python

issues = project.issues.list()

for issue in issues:
    print("-------------------")
    print("【タイトル】", issue.title)
    print("【Description】", issue.description)
    print("【状態】", issue.state)
    print("【Assignee】", issue.assignee["name"])
    print("【Due date】", issue.due_date)
    print("【Labels】", issue.labels)

```

issueの持つAttributeは[こちら](https://docs.gitlab.com/ce/api/issues.html)を参照してください。

主な属性を記載しておきます。

|issueのAttribute|意味|
|---|---|
|id|ID|
|title|タイトル|
|description|Description|
|state|状態（オープン/クローズ)|
|assignee|Assignee|
|due_date|期限|
|labels|ラベル|

```:実行結果
-------------------
【タイトル】 関先生のお店訪問！
【Description】 大変！  
今度、関先生がマジョリカとお店のことについて話がしたいんだって！
なんとかしなくちゃ！
【状態】 closed
【Assignee】 Doremi
【Due date】 2020-09-13
【Labels】 []
-------------------
【タイトル】 仕入れ値の高騰
【Description】 今月は先月に比べて仕入れ値が倍以上になってます。  

デラがぼったくっている気がするけど…最近魔法会の物価が高騰しているという話もあります。
仕入先の変更も視野に入れて来月以降の対策を検討させてください。
【状態】 opened
【Assignee】 Doremi
【Due date】 2020-09-18
【Labels】 ['経営']
-------------------
【タイトル】 不審な人物の件
【Description】 最近オヤジーデらしい怪しい人物がMAHO堂の周りをうろついているという噂を聞きました。  
何か対策を打ちませんか？
【状態】 opened
【Assignee】 Doremi
【Due date】 2020-09-25
【Labels】 []
```

うまく取得することができましたね。

### issueを登録する

では、本題のissue登録です。
issueの登録には`project.issues.create()`を使います。

```python:Python

# チケットの登録
new_issue = project.issues.create({"title":"秋の東北旅行(出張販売)",
                                    "description":"今年も恒例、秋の旅行という名の出張販売に行きます。",
                                    "due_date":"2020-10-20"})

print(new_issue.id)
```

```:実行結果
71385002
```
![gitlab_issue_create.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/a547e46f-50d0-75c7-59c4-cf5ca1a59787.png)

ちゃんと登録できましたね！

## 機械で出来ることは機械にやらせよう

受信メールをウォッチしたり、管理表に書き込んだり状態を管理したりといったことは、人間よりも機械の方が得意なことです。  
プログラムさえ間違っていなければ、機械の方が早く正確で、24時間働いても文句も言いません。

こんな便利な機械と一緒に働くことができる時代に生きる私たちはとても幸せだと思います。
ぜひ機械(プログラム)を活用して、退屈な仕事から自分や仲間を解放しましょう！