Skip to content

Commit 6273180

Browse files
authored
Merge pull request #88 from QuantStrategyLab/chore/multi-gateway-workflows
chore: migrate diagnose & capture-screen to multi-gateway TARGETS_JSON
2 parents b76c030 + c9a075f commit 6273180

2 files changed

Lines changed: 125 additions & 20 deletions

File tree

.github/workflows/capture-screen.yml

Lines changed: 61 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@ name: Capture Gateway Screen
33
on:
44
workflow_dispatch:
55
inputs:
6+
target:
7+
description: Gateway target (from IB_GATEWAY_TARGETS_JSON)
8+
required: false
9+
default: all
10+
type: string
611
screen_action:
712
description: Optional interaction before capturing the screen
813
required: false
@@ -19,27 +24,74 @@ on:
1924
default: false
2025
type: boolean
2126

22-
env:
23-
GCP_PROJECT_ID: interactivebrokersquant
24-
GCP_WORKLOAD_IDENTITY_PROVIDER: projects/303168642265/locations/global/workloadIdentityPools/github-actions/providers/github-ibkr-gateway-main
25-
GCP_WORKLOAD_IDENTITY_SERVICE_ACCOUNT: ibkr-gateway-deploy@interactivebrokersquant.iam.gserviceaccount.com
26-
2727
concurrency:
2828
group: ${{ github.workflow }}-${{ github.ref_name }}
2929
cancel-in-progress: false
3030

3131
jobs:
32+
resolve:
33+
runs-on: ubuntu-latest
34+
outputs:
35+
matrix: ${{ steps.resolve.outputs.matrix }}
36+
steps:
37+
- name: Resolve gateway targets
38+
id: resolve
39+
env:
40+
TARGETS_JSON: ${{ vars.IB_GATEWAY_TARGETS_JSON }}
41+
SELECTED_TARGET: ${{ github.event.inputs.target || 'all' }}
42+
run: |
43+
import json, os, sys
44+
45+
raw = os.environ.get("TARGETS_JSON", "").strip()
46+
if not raw:
47+
raise SystemExit("IB_GATEWAY_TARGETS_JSON is required")
48+
49+
loaded = json.loads(raw)
50+
targets = []
51+
if isinstance(loaded, dict):
52+
for name, config in loaded.items():
53+
cfg = dict(config)
54+
cfg["name"] = name
55+
targets.append(cfg)
56+
elif isinstance(loaded, list):
57+
targets = loaded
58+
else:
59+
raise SystemExit("IB_GATEWAY_TARGETS_JSON must be an object or list")
60+
61+
selected_name = os.environ.get("SELECTED_TARGET", "all")
62+
if selected_name == "all":
63+
selected = targets
64+
else:
65+
selected = [t for t in targets if t["name"] == selected_name]
66+
if not selected:
67+
known = ", ".join(t["name"] for t in targets)
68+
raise SystemExit(f"Unknown target {selected_name!r}. Known: {known}")
69+
70+
with open(os.environ["GITHUB_OUTPUT"], "a") as f:
71+
f.write("matrix=" + json.dumps({"target": selected}, separators=(",", ":")) + "\n")
72+
print("Targets: " + ", ".join(t["name"] for t in selected))
73+
shell: python3
74+
3275
capture:
76+
needs: resolve
77+
if: needs.resolve.outputs.matrix != '{"target":[]}'
3378
runs-on: ubuntu-latest
3479
timeout-minutes: 8
80+
strategy:
81+
matrix: ${{ fromJson(needs.resolve.outputs.matrix) }}
82+
fail-fast: false
3583
permissions:
3684
contents: read
3785
id-token: write
3886
env:
39-
GCE_USER: ${{ vars.IB_GATEWAY_GCE_USER }}
40-
GCE_INSTANCE_NAME: ${{ vars.IB_GATEWAY_INSTANCE_NAME }}
41-
GCE_ZONE: ${{ vars.IB_GATEWAY_ZONE }}
42-
SSH_PRIVATE_KEY_SECRET_NAME: ${{ vars.IB_GATEWAY_SSH_PRIVATE_KEY_SECRET_NAME }}
87+
TARGET_NAME: ${{ matrix.target.name }}
88+
GCP_PROJECT_ID: ${{ matrix.target.gcp_project_id }}
89+
GCP_WORKLOAD_IDENTITY_PROVIDER: ${{ matrix.target.gcp_workload_identity_provider }}
90+
GCP_WORKLOAD_IDENTITY_SERVICE_ACCOUNT: ${{ matrix.target.gcp_workload_identity_service_account }}
91+
GCE_USER: ${{ matrix.target.gce_user }}
92+
GCE_INSTANCE_NAME: ${{ matrix.target.gce_instance_name }}
93+
GCE_ZONE: ${{ matrix.target.gce_zone }}
94+
SSH_PRIVATE_KEY_SECRET_NAME: ${{ matrix.target.ssh_private_key_secret_name }}
4395
SCREEN_ACTION: ${{ github.event.inputs.screen_action }}
4496
WAIT_FOR_SECOND_FACTOR: ${{ github.event.inputs.wait_for_second_factor }}
4597
steps:

.github/workflows/diagnose.yml

Lines changed: 64 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,30 +5,83 @@ on:
55
branches: [ main ]
66
paths:
77
- '.github/workflows/diagnose.yml'
8-
workflow_dispatch: {}
9-
10-
env:
11-
GCP_PROJECT_ID: interactivebrokersquant
12-
GCP_WORKLOAD_IDENTITY_PROVIDER: projects/303168642265/locations/global/workloadIdentityPools/github-actions/providers/github-ibkr-gateway-main
13-
GCP_WORKLOAD_IDENTITY_SERVICE_ACCOUNT: ibkr-gateway-deploy@interactivebrokersquant.iam.gserviceaccount.com
8+
workflow_dispatch:
9+
inputs:
10+
target:
11+
description: Gateway target (from IB_GATEWAY_TARGETS_JSON)
12+
required: false
13+
default: all
14+
type: string
1415

1516
concurrency:
1617
group: ${{ github.workflow }}-${{ github.ref_name }}
1718
cancel-in-progress: false
1819

1920
jobs:
21+
resolve:
22+
runs-on: ubuntu-latest
23+
outputs:
24+
matrix: ${{ steps.resolve.outputs.matrix }}
25+
steps:
26+
- name: Resolve gateway targets
27+
id: resolve
28+
env:
29+
TARGETS_JSON: ${{ vars.IB_GATEWAY_TARGETS_JSON }}
30+
SELECTED_TARGET: ${{ github.event.inputs.target || 'all' }}
31+
run: |
32+
import json, os, sys
33+
34+
raw = os.environ.get("TARGETS_JSON", "").strip()
35+
if not raw:
36+
raise SystemExit("IB_GATEWAY_TARGETS_JSON is required")
37+
38+
loaded = json.loads(raw)
39+
targets = []
40+
if isinstance(loaded, dict):
41+
for name, config in loaded.items():
42+
cfg = dict(config)
43+
cfg["name"] = name
44+
targets.append(cfg)
45+
elif isinstance(loaded, list):
46+
targets = loaded
47+
else:
48+
raise SystemExit("IB_GATEWAY_TARGETS_JSON must be an object or list")
49+
50+
selected_name = os.environ.get("SELECTED_TARGET", "all")
51+
if selected_name == "all":
52+
selected = targets
53+
else:
54+
selected = [t for t in targets if t["name"] == selected_name]
55+
if not selected:
56+
known = ", ".join(t["name"] for t in targets)
57+
raise SystemExit(f"Unknown target {selected_name!r}. Known: {known}")
58+
59+
with open(os.environ["GITHUB_OUTPUT"], "a") as f:
60+
f.write("matrix=" + json.dumps({"target": selected}, separators=(",", ":")) + "\n")
61+
print("Targets: " + ", ".join(t["name"] for t in selected))
62+
shell: python3
63+
2064
diagnose:
65+
needs: resolve
66+
if: needs.resolve.outputs.matrix != '{"target":[]}'
2167
runs-on: ubuntu-latest
2268
timeout-minutes: 8
69+
strategy:
70+
matrix: ${{ fromJson(needs.resolve.outputs.matrix) }}
71+
fail-fast: false
2372
permissions:
2473
contents: read
2574
id-token: write
2675
env:
27-
GCE_USER: ${{ vars.IB_GATEWAY_GCE_USER }}
28-
GCE_INSTANCE_NAME: ${{ vars.IB_GATEWAY_INSTANCE_NAME }}
29-
GCE_ZONE: ${{ vars.IB_GATEWAY_ZONE }}
30-
DEPLOY_PATH: ${{ vars.IB_GATEWAY_DEPLOY_PATH }}
31-
SSH_PRIVATE_KEY_SECRET_NAME: ${{ vars.IB_GATEWAY_SSH_PRIVATE_KEY_SECRET_NAME }}
76+
TARGET_NAME: ${{ matrix.target.name }}
77+
GCP_PROJECT_ID: ${{ matrix.target.gcp_project_id }}
78+
GCP_WORKLOAD_IDENTITY_PROVIDER: ${{ matrix.target.gcp_workload_identity_provider }}
79+
GCP_WORKLOAD_IDENTITY_SERVICE_ACCOUNT: ${{ matrix.target.gcp_workload_identity_service_account }}
80+
GCE_USER: ${{ matrix.target.gce_user }}
81+
GCE_INSTANCE_NAME: ${{ matrix.target.gce_instance_name }}
82+
GCE_ZONE: ${{ matrix.target.gce_zone }}
83+
DEPLOY_PATH: ${{ matrix.target.deploy_path }}
84+
SSH_PRIVATE_KEY_SECRET_NAME: ${{ matrix.target.ssh_private_key_secret_name }}
3285
steps:
3386
- name: Authenticate to Google Cloud
3487
id: auth

0 commit comments

Comments
 (0)