fix(P30): temp dir isolation + forge-agnostic APIs + static-key override (P1-8, P1-9, S1)

---ci---
project: acdl
phase: 30
milestone: v1.8
status: execute
---/ci---

P1-8: run_platform.sh now emits adapter output to $WORK/tf (per-run temp
dir), not the committed terraform/spike/ directory. The committed
terraform/spike/*.tf files are removed — they were scratch artifacts.
Deploy workflow artifact upload path updated to /tmp/acdl_platform_run_v18/tf/.
P1-9: contract_ingestor.py now reads GITHUB_API_BASE env for forge-agnostic
API URLs. _forge_type() detects GitHub vs Gitea. Search URL is branched
(GitHub uses /search/issues, Gitea uses /repos/{owner}/{repo}/issues).
S1: Deploy workflow configure-aws-credentials step restructured as a single
conditional step. OIDC when no static key (role-to-assume), static-key
when ACDL_AWS_ACCESS_KEY_ID present (access-key-id/secret-access-key inputs).
Both deploy workflows remain byte-identical.

Tests: +8 (292 -> 300). All pass. run_platform.sh --check-only green.
This commit is contained in:
Jon Chery
2026-07-22 22:08:23 +00:00
parent 843cd17b97
commit 1e4133e11a
9 changed files with 121 additions and 162 deletions
+43 -6
View File
@@ -24,6 +24,9 @@ import boto3
TABLE_NAME = os.environ.get("CONTRACTS_TABLE", "acdl-contracts")
GITHUB_TOKEN_SECRET_ID = os.environ.get("GITHUB_TOKEN_SECRET_ID", "acdl/github-token")
PLATFORM_REPO = os.environ.get("PLATFORM_REPO", "acdl/acdl")
# P1-9: Forge-agnostic API base URL. Defaults to GitHub; set GITHUB_API_BASE
# to a Gitea API root (e.g. https://git.cloudinit.dev/api/v1) for Gitea.
GITHUB_API_BASE = os.environ.get("GITHUB_API_BASE", "https://api.github.com")
_dynamodb = None
_secrets_client = None
@@ -47,6 +50,43 @@ def _iso8601_now():
return datetime.datetime.now(datetime.timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
def _forge_type():
"""P1-9: Detect whether the API base is GitHub or Gitea.
Gitea API roots contain '/api/v1'; GitHub's is 'api.github.com'.
"""
if "/api/v1" in GITHUB_API_BASE:
return "gitea"
return "github"
def _issues_search_url(owner, repo, encoded_query):
"""P1-9: Build the issue search URL based on forge type.
GitHub uses /search/issues?q=...; Gitea uses /repos/{owner}/{repo}/issues?...
with query params (no /search/issues endpoint).
"""
if _forge_type() == "gitea":
return (
f"{GITHUB_API_BASE}/repos/{owner}/{repo}/issues"
f"?state=open&type=issues&q={encoded_query}"
)
return (
f"{GITHUB_API_BASE}/search/issues?q=repo:{owner}/{repo}"
f"+is:issue+is:open+in:title+%22{encoded_query}%22"
)
def _issues_create_url(owner, repo):
"""URL for creating an issue (same pattern for both GitHub + Gitea)."""
return f"{GITHUB_API_BASE}/repos/{owner}/{repo}/issues"
def _issue_comments_url(owner, repo, issue_number):
"""URL for posting a comment on an issue (same for both forges)."""
return f"{GITHUB_API_BASE}/repos/{owner}/{repo}/issues/{issue_number}/comments"
def _submit_contract(payload):
consumer_repo = payload["consumerRepo"]
contract_id = payload["contractId"]
@@ -105,10 +145,7 @@ def _report_error(payload):
# Check for an existing open issue with the same title (idempotency)
# URL-encode the contract_id to prevent search-query injection (P1-1).
encoded_contract_id = urllib.parse.quote(contract_id, safe="")
search_url = (
f"https://api.github.com/search/issues?q=repo:{owner}/{repo}"
f"+is:issue+is:open+in:title+%22{encoded_contract_id}%22"
)
search_url = _issues_search_url(owner, repo, encoded_contract_id)
req = urllib.request.Request(search_url)
req.add_header("Authorization", f"token {github_token}")
req.add_header("Accept", "application/vnd.github+json")
@@ -146,7 +183,7 @@ _This issue was auto-created by the ACDL platform Lambda (D-055). The consumer's
if existing:
# Comment on the existing issue
issue_number = existing[0]["number"]
url = f"https://api.github.com/repos/{owner}/{repo}/issues/{issue_number}/comments"
url = _issue_comments_url(owner, repo, issue_number)
data = json.dumps({"body": body}).encode()
req = urllib.request.Request(url, data=data, method="POST")
req.add_header("Authorization", f"token {github_token}")
@@ -160,7 +197,7 @@ _This issue was auto-created by the ACDL platform Lambda (D-055). The consumer's
}
else:
# Create a new issue
url = f"https://api.github.com/repos/{owner}/{repo}/issues"
url = _issues_create_url(owner, repo)
data = json.dumps({
"title": title,
"body": body,