import base64
import json
import time
import modal
TRUST = json.loads(base64.b64decode("__TRUST__"))
def runner_command(jit, fail=None):
if not fail:
return ["/home/runner/run.sh", "--jitconfig", jit]
return ["bash", "-c", f"printf '#!/bin/bash\\necho {fail} | base64 -d\\nexit 1\\n' > /tmp/superci-fail.sh && chmod 755 /tmp/superci-fail.sh"
f" && ACTIONS_RUNNER_HOOK_JOB_STARTED=/tmp/superci-fail.sh exec /home/runner/run.sh --jitconfig {jit}"]
NAME = "__NAME__"
app = modal.App(NAME)
web_image = modal.Image.debian_slim(python_version="3.12").pip_install("fastapi[standard]==0.118.0", "cryptography==46.0.1")
runner_image = (
modal.Image.from_registry("ghcr.io/actions/actions-runner:latest")
.dockerfile_commands(["USER root", "RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends xz-utils zstd zip unzip jq git wget build-essential pkg-config && rm -rf /var/lib/apt/lists/*"])
.env({"RUNNER_ALLOW_RUNASROOT": "1"})
)
def b64url(s: str) -> bytes:
return base64.urlsafe_b64decode(s + "=" * (-len(s) % 4))
def verify(authorization: str, audience: str) -> None:
from cryptography.exceptions import InvalidSignature
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives.asymmetric.utils import encode_dss_signature
if not authorization.startswith("Bearer "):
raise PermissionError("no token")
header, payload, signature = authorization[7:].split(".")
raw = b64url(signature)
der = encode_dss_signature(int.from_bytes(raw[:32], "big"), int.from_bytes(raw[32:], "big"))
for jwk in TRUST["keys"]["keys"]:
key = ec.EllipticCurvePublicNumbers(int.from_bytes(b64url(jwk["x"]), "big"), int.from_bytes(b64url(jwk["y"]), "big"), ec.SECP256R1()).public_key()
try:
key.verify(der, f"{header}.{payload}".encode(), ec.ECDSA(hashes.SHA256()))
except InvalidSignature:
continue
claims = json.loads(b64url(payload))
if claims.get("exp", 0) < time.time():
raise PermissionError("expired")
if claims.get("iss") != TRUST["issuer"] or claims.get("sub") != TRUST["subject"] or claims.get("aud") != audience:
raise PermissionError("token for another agent or control plane")
return
raise PermissionError("bad token")
@app.function(image=web_image)
@modal.concurrent(max_inputs=50)
@modal.asgi_app(label=NAME)
def web():
from fastapi import FastAPI, HTTPException, Request
api = FastAPI()
async def check(request: Request) -> dict:
audience = f"https://{request.url.hostname}"
try:
verify(request.headers.get("authorization", ""), audience)
except PermissionError as e:
raise HTTPException(status_code=401, detail=f"not allowed: {e}")
return await request.json()
@api.get("/health")
async def health():
return {"agent": "modal"}
@api.post("/launch")
async def launch(request: Request):
body = await check(request)
if "jit" not in body: raise HTTPException(status_code=400, detail="Modal runs no Docker for GitLab jobs")
try:
sandbox = await modal.Sandbox.create.aio(
*runner_command(body["jit"], body.get("fail")),
app=app, image=runner_image, workdir="/home/runner",
cpu=(float(body.get("cpu") or 2) / 2,) * 2, memory=(int(body.get("ram_gb") or 8) * 1024,) * 2, timeout=int(body.get("max_minutes", 70)) * 60,
gpu=body.get("gpu"), )
except modal.exception.InvalidError as e:
raise HTTPException(status_code=400, detail=f"Modal: {e}")
return {"id": sandbox.object_id, "kind": "sandbox"}
@api.post("/stop")
async def stop(request: Request):
body = await check(request)
sandbox = await modal.Sandbox.from_id.aio(body["id"])
await sandbox.terminate.aio()
return {"stopped": True}
return api