fix(CI5): bytt til google.auth REST-kall for regional Cloud Build
This commit is contained in:
parent
3af4cbb7cc
commit
be2e3b4583
|
|
@ -1,5 +1,5 @@
|
|||
# agents/mcp_server/server.py
|
||||
# OPAX-MCP — Vauco sin egen MCP-server / CI-kanal mot GCP
|
||||
# OPAX-MCP — Vauco sin eigen MCP-server / CI-kanal mot GCP
|
||||
|
||||
import os
|
||||
import logging
|
||||
|
|
@ -25,14 +25,27 @@ def verify_token(x_mcp_key: str = Header(default="")):
|
|||
return True
|
||||
|
||||
|
||||
def _cloudbuild_client():
|
||||
"""Returnerer CloudBuildClient koblet til regional endpoint."""
|
||||
from google.cloud.devtools import cloudbuild_v1
|
||||
from google.api_core.client_options import ClientOptions
|
||||
endpoint = f"{REGION}-cloudbuild.googleapis.com"
|
||||
return cloudbuild_v1.CloudBuildClient(
|
||||
client_options=ClientOptions(api_endpoint=endpoint)
|
||||
def _get_access_token() -> str:
|
||||
import google.auth
|
||||
import google.auth.transport.requests
|
||||
creds, _ = google.auth.default(scopes=["https://www.googleapis.com/auth/cloud-platform"])
|
||||
creds.refresh(google.auth.transport.requests.Request())
|
||||
return creds.token
|
||||
|
||||
|
||||
def _list_builds_rest(project_id: str, region: str, trigger_id: str, page_size: int = 1):
|
||||
"""Kaller Cloud Build v1 REST direkte mot regional endpoint."""
|
||||
import urllib.request
|
||||
import json
|
||||
token = _get_access_token()
|
||||
url = (
|
||||
f"https://cloudbuild.googleapis.com/v1/"
|
||||
f"projects/{project_id}/locations/{region}/builds"
|
||||
f"?filter=trigger_id%3D%22{trigger_id}%22&pageSize={page_size}"
|
||||
)
|
||||
req = urllib.request.Request(url, headers={"Authorization": f"Bearer {token}"})
|
||||
with urllib.request.urlopen(req, timeout=10) as resp:
|
||||
return json.loads(resp.read())
|
||||
|
||||
|
||||
class PushStaticRequest(BaseModel):
|
||||
|
|
@ -94,39 +107,36 @@ async def push_static(req: PushStaticRequest, _: bool = Depends(verify_token)):
|
|||
@app.get("/tools/get_build_status")
|
||||
async def get_build_status(_: bool = Depends(verify_token)):
|
||||
"""
|
||||
Henter siste build fra osvauco-agent-main-trigger.
|
||||
Bruker regional endpoint: {region}-cloudbuild.googleapis.com
|
||||
og parent: projects/{project}/locations/{region}
|
||||
Henter siste build fra osvauco-agent-main-trigger via REST mot
|
||||
cloudbuild.googleapis.com/v1/projects/{p}/locations/{r}/builds
|
||||
"""
|
||||
try:
|
||||
from google.cloud.devtools import cloudbuild_v1
|
||||
client = _cloudbuild_client()
|
||||
parent = f"projects/{PROJECT_ID}/locations/{REGION}"
|
||||
request = cloudbuild_v1.ListBuildsRequest(
|
||||
parent=parent,
|
||||
filter=f'trigger_id="{BUILD_TRIGGER_ID}"',
|
||||
page_size=1,
|
||||
)
|
||||
builds = list(client.list_builds(request=request))
|
||||
data = _list_builds_rest(PROJECT_ID, REGION, BUILD_TRIGGER_ID, page_size=1)
|
||||
builds = data.get("builds", [])
|
||||
if not builds:
|
||||
return {"status": "unknown", "message": f"Ingen builds for trigger {BUILD_TRIGGER_ID} i {REGION}"}
|
||||
b = builds[0]
|
||||
status_map = {1:"queued",2:"working",3:"success",4:"failure",
|
||||
5:"internal_error",6:"timeout",7:"cancelled"}
|
||||
status_str = status_map.get(int(b.status), "unknown")
|
||||
import time
|
||||
status_str = b.get("status", "unknown").lower()
|
||||
subs = b.get("substitutions", {})
|
||||
start = b.get("startTime")
|
||||
finish = b.get("finishTime")
|
||||
duration_s = None
|
||||
if b.finish_time and b.start_time:
|
||||
duration_s = int(b.finish_time.seconds - b.start_time.seconds)
|
||||
elif b.start_time:
|
||||
duration_s = int(time.time() - b.start_time.seconds)
|
||||
if start and finish:
|
||||
from datetime import datetime, timezone
|
||||
fmt = "%Y-%m-%dT%H:%M:%S.%fZ"
|
||||
try:
|
||||
t0 = datetime.strptime(start, fmt).replace(tzinfo=timezone.utc)
|
||||
t1 = datetime.strptime(finish, fmt).replace(tzinfo=timezone.utc)
|
||||
duration_s = int((t1 - t0).total_seconds())
|
||||
except Exception:
|
||||
pass
|
||||
return {
|
||||
"status": status_str,
|
||||
"build_id": b.id,
|
||||
"branch": (b.substitutions or {}).get("BRANCH_NAME", "main"),
|
||||
"commit": (b.substitutions or {}).get("SHORT_SHA", ""),
|
||||
"build_id": b.get("id", ""),
|
||||
"branch": subs.get("BRANCH_NAME", "main"),
|
||||
"commit": subs.get("SHORT_SHA", ""),
|
||||
"duration_s": duration_s,
|
||||
"log_url": b.log_url or "",
|
||||
"log_url": b.get("logUrl", ""),
|
||||
"region": REGION,
|
||||
"trigger_id": BUILD_TRIGGER_ID,
|
||||
}
|
||||
|
|
@ -139,7 +149,10 @@ async def get_build_status(_: bool = Depends(verify_token)):
|
|||
async def deploy_service(req: DeployServiceRequest, _: bool = Depends(verify_token)):
|
||||
try:
|
||||
from google.cloud.devtools import cloudbuild_v1
|
||||
client = _cloudbuild_client()
|
||||
from google.api_core.client_options import ClientOptions
|
||||
client = cloudbuild_v1.CloudBuildClient(
|
||||
client_options=ClientOptions(api_endpoint=f"{REGION}-cloudbuild.googleapis.com")
|
||||
)
|
||||
trigger_id = req.trigger_id or BUILD_TRIGGER_ID
|
||||
subs = {"BRANCH_NAME": req.branch, **req.substitutions}
|
||||
response = client.run_build_trigger(
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user