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()
|