-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPipeline.py
More file actions
93 lines (77 loc) · 3.55 KB
/
Pipeline.py
File metadata and controls
93 lines (77 loc) · 3.55 KB
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import os
import json
from collections import Counter
from datetime import datetime, timedelta
# File "/home/berteloot/.local/lib/python3.12/site-packages/gitlab/exceptions.py", line 346, in wrapped_f
# raise error(e.error_message, e.response_code, e.response_body) from e
# gitlab.exceptions.GitlabListError: 403: 403 Forbidden
# Création de deux types de JSON
# [✓] Le premier va être un JSON qui liste l'état de la pipeline à sa dernière update
# [✓~✗] Le second va être un JSON qui liste le total cumulatif des état de ces pipelines
def json_pipeline_status_create_everyday(years: list[int], projects) -> json:
"""Cette fonction permet de créer le JSON du nombre de l'état de la pipeline à sa dernière update (ce sont les données journalières non cumulées).
Args:
years (list[int]): Années pour lesquelle on veut créer le JSON
projects (_type_): Donnée récupérée depuis l'API Gitlab
Returns:
json: crée un JSON qui va après etre mis dans un fichier
"""
# Filtrer uniquement les projets publics
public_projects = (proj for proj in projects if proj.visibility == "public")
# Regrouper et compter les états des pipelines par date
all_statuses = (
(getattr(pipeline, "updated_at", "")[:10], getattr(pipeline, "status", ""))
for proj in public_projects
for pipeline in proj.pipelines.list(all=True, iterator=True)
)
status_counts = {}
for date, status in all_statuses:
if date:
if date not in status_counts:
status_counts[date] = Counter()
status_counts[date][status] += 1
today = datetime.now().date()
# Crée le dossier si nécessaire
os.makedirs("json/Pipeline", exist_ok=True)
for year in years:
# Générer la séquence de dates pour l'année
start = datetime(year, 1, 1).date()
end = today if year == today.year else datetime(year, 12, 31).date()
num_days = (end - start).days + 1
daily_data = []
for i in range(num_days):
d = start + timedelta(days=i)
ds = d.isoformat()
# Récupère les états des pipelines pour la date (vide si absent)
daily_status = status_counts.get(ds, {})
daily_data.append({"x": ds, "statuses": dict(daily_status)})
# Préparer et écrire le JSON
payload = {str(year): {"year": year, "daily_data": daily_data}}
json_content = json.dumps(payload, indent=4)
file_path = f"json/Pipeline/{year}.json"
with open(file_path, "w") as file:
file.write(json_content)
import gitlab
from variable import GITLAB_URL, ACCESS_TOKEN, YEAR_START
import time
# Connexion à l'API GitLab
print("Connecting to GitLab API...")
start_time = time.time()
gl = gitlab.Gitlab(GITLAB_URL, private_token=ACCESS_TOKEN)
print(f"Connected to GitLab API in {time.time() - start_time:.2f} seconds.")
# Récupération de tous les projets
print("Fetching all projects...")
start_time = time.time()
projects = gl.projects.list(all=True, iterator=True)
print(f"Fetched all projects in {time.time() - start_time:.2f} seconds.")
# Récupération de l'année actuelle
today = datetime.now().year
print(f"Current year is {today}.")
# Liste des années à traiter
years = list(range(YEAR_START, today + 1))
print(f"Years to process: {years}")
# Appel de la fonction pour créer le JSON
print("Starting JSON creation...")
start_time = time.time()
json_pipeline_status_create_everyday(years, projects)
print(f"JSON creation completed in {time.time() - start_time:.2f} seconds.")