about summary refs log tree commit diff
path: root/src/cli/gha_billing.py
blob: a501890ee781aa8b0830fc6b0d2b882b7a6c300c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
"""
Print information about how many free minutes of GitHub actions are left for this cycle.

The API for this is documented [here](https://docs.github.com/en/rest/billing/billing?apiVersion=2022-11-28#get-github-actions-billing-for-an-organization).

For this you need a [token](https://github.com/settings/personal-access-tokens) with the following permissions:
- [plan](https://docs.github.com/en/rest/authentication/permissions-required-for-fine-grained-personal-access-tokens?apiVersion=2022-11-28#user-permissions-for-plan)
"""

import sys

import click
import requests

API_URL = "https://api.github.com"


@click.command()
@click.option("-t", "--token", required=True, help="GitHub API token")
@click.option("-u", "--user", default="fcuny", help="GitHub username")
def cli(token, user):
    # https://docs.github.com/en/rest/billing/billing?apiVersion=2022-11-28#get-github-actions-billing-for-an-organization
    url = f"{API_URL}/users/{user}/settings/billing/actions"
    headers = {"Authorization": f"token {token}", "Accept": "application/vnd.github.v3+json"}
    try:
        response = requests.get(url, headers=headers, timeout=30)
        response.raise_for_status()
    except requests.exceptions.RequestException as err:
        click.echo(f"Error making HTTP request: {err}", err=True)
        sys.exit(1)

    try:
        billing_info = response.json()
    except ValueError as err:
        click.echo(f"Error parsing the JSON response: {err}", err=True)
        sys.exit(1)

    time_remaining = billing_info["included_minutes"] - billing_info["total_minutes_used"]
    click.echo(
        f"This cycle, {int(billing_info['total_minutes_used'])} minutes have been used, and {int(time_remaining)} minutes are remaining"
    )


if __name__ == "__main__":
    cli()