@@ -3,6 +3,11 @@ name: Capture Gateway Screen
33on :
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
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-
2727concurrency :
2828 group : ${{ github.workflow }}-${{ github.ref_name }}
2929 cancel-in-progress : false
3030
3131jobs :
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 :
0 commit comments