背景
Gitlabで管理しているIssueについて特定の条件を満たすIssueだけを取得したいと思い、
実装してみたため、備忘録的にまとめておきます。
利用したもの
- Ansible
- GitLab
プログラム
汎用的なソースコードを以下に記載します。
- GitLabからIssueを取得する基本的なplaybook
---
- name: Notification of GitLab Issue
hosts: localhost
vars:
gitlab_api_token: "GitLabのAPIトークン"
gitlab_project_id: "GitLabのIssue作成先プロジェクトID"
gitlab_server: "GitLabサーバIPアドレス"
per_page : 1000 #Issue取得の上限
tasks:
- name: Get GitLab Issue
block:
- name: Issueを取得
uri:
url: "https://{{ gitlab_server }}/api/v4/projects/{{ gitlab_project_id }}/issues?" #Issueを絞るときにはこのurlの記述を工夫する
method: GET
headers:
PRIVATE-TOKEN: "{{ gitlab_api_token }}"
status_code: 200
validate_certs: no
register: pickup_issues
- name: Parse GitLab Issues
set_fact:
issue_count: "{{ pickup_issues.json | length }}"
issues: "{{ pickup_issues.json }}"
when: pickup_issues.status == 200
- name: Create output Message
set_fact:
issues_table: |
{% for issue in issues %}
{{ "---------------------------------------------------------------------------------------------" }}
{{ "[作成日時]:" + issue.created_at | regex_replace('T.*', '') }}
{{ "[タイトル]" + issue.title }}
{{ "[リンク]" + issue.web_url }}
{% endfor %}
-
対象を絞るときには上記ソースコードのurlを以下のような記述にすることで対象を絞ることが可能です
-
特定の期間に作成されたIssue
期間の始まり:start_date: "2023-06-01"
期間の終わり:end_date_detail: "2023-06-30"url: "https://{{ gitlab_server }}/api/v4/projects/{{ gitlab_project_id }}/issues?created_after={{ start_date }}&created_before={{ end_date }}&per_page={{ per_page }}"
-
OPENされているIssue
url: "https://{{ gitlab_server }}/api/v4/projects/{{ gitlab_project_id }}/issues?state=opened&per_page={{ per_page }}"
-
lableがついていないIssue
url: "https://{{ gitlab_server }}/api/v4/projects/{{ gitlab_project_id }}/issues?labels=none&per_page={{ per_page }}"
-
本件について躓いた点としては、明らかに20を超える対象Issueが存在する場合に、なぜか出力されるIssueの数が20を上限にそれ以上表示されない現象が発生したため、調査したところgitLabのデフォルトの1ページあたりのIssue表示数のデフォルトが20であり、これに起因していたことがわかりました。
これを是正するために以下ポイントに注意が必要です。
urlにてパラメータper_pageを想定されるIssueの出力よりある程度大きな値で指定しておく
終わりに
前回はgitLabのIssue作成について記事を記載しましたが、今回は記事の抽出について実施してみました。
抽出したIssueについて出力だけでなく処理を記述すれば、統計なども自動的に実施できるので、今後も応用して色々やってみようと思います。