Skip to content

Commit f0c7936

Browse files
authored
Add gateway screen capture workflow (#34)
1 parent 3f10e38 commit f0c7936

1 file changed

Lines changed: 123 additions & 0 deletions

File tree

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
name: Capture Gateway Screen
2+
3+
on:
4+
workflow_dispatch:
5+
6+
env:
7+
GCP_PROJECT_ID: interactivebrokersquant
8+
GCP_WORKLOAD_IDENTITY_PROVIDER: projects/303168642265/locations/global/workloadIdentityPools/github-actions/providers/github-ibkr-gateway-main
9+
GCP_WORKLOAD_IDENTITY_SERVICE_ACCOUNT: ibkr-gateway-deploy@interactivebrokersquant.iam.gserviceaccount.com
10+
11+
jobs:
12+
capture:
13+
runs-on: ubuntu-latest
14+
timeout-minutes: 8
15+
permissions:
16+
contents: read
17+
id-token: write
18+
env:
19+
GCE_USER: ${{ vars.IB_GATEWAY_GCE_USER }}
20+
GCE_INSTANCE_NAME: ${{ vars.IB_GATEWAY_INSTANCE_NAME }}
21+
GCE_ZONE: ${{ vars.IB_GATEWAY_ZONE }}
22+
SSH_PRIVATE_KEY_SECRET_NAME: ${{ vars.IB_GATEWAY_SSH_PRIVATE_KEY_SECRET_NAME }}
23+
steps:
24+
- name: Authenticate to Google Cloud
25+
uses: google-github-actions/auth@v3
26+
with:
27+
workload_identity_provider: ${{ env.GCP_WORKLOAD_IDENTITY_PROVIDER }}
28+
service_account: ${{ env.GCP_WORKLOAD_IDENTITY_SERVICE_ACCOUNT }}
29+
30+
- name: Set up gcloud
31+
uses: google-github-actions/setup-gcloud@v3
32+
with:
33+
project_id: ${{ env.GCP_PROJECT_ID }}
34+
version: '>= 416.0.0'
35+
36+
- name: Prepare SSH key
37+
run: |
38+
set -euo pipefail
39+
40+
if [ -z "${SSH_PRIVATE_KEY_SECRET_NAME:-}" ]; then
41+
echo "SSH_PRIVATE_KEY_SECRET_NAME is required." >&2
42+
exit 1
43+
fi
44+
45+
install -d -m 700 "$RUNNER_TEMP/ssh"
46+
SSH_KEY_FILE="$RUNNER_TEMP/ssh/google_compute_engine"
47+
ssh_private_key="$(gcloud secrets versions access latest \
48+
--project "${GCP_PROJECT_ID}" \
49+
--secret "${SSH_PRIVATE_KEY_SECRET_NAME}")"
50+
printf '%s\n' "$ssh_private_key" | tr -d '\r' > "$SSH_KEY_FILE"
51+
chmod 600 "$SSH_KEY_FILE"
52+
ssh-keygen -y -f "$SSH_KEY_FILE" > "$SSH_KEY_FILE.pub"
53+
chmod 644 "$SSH_KEY_FILE.pub"
54+
echo "SSH_KEY_FILE=$SSH_KEY_FILE" >> "$GITHUB_ENV"
55+
56+
- name: Capture X11 screen
57+
run: |
58+
set -euo pipefail
59+
60+
for var_name in GCE_USER GCE_INSTANCE_NAME GCE_ZONE; do
61+
if [ -z "${!var_name:-}" ]; then
62+
echo "${var_name} is required." >&2
63+
exit 1
64+
fi
65+
done
66+
67+
REMOTE_TARGET="${GCE_USER}@${GCE_INSTANCE_NAME}"
68+
SSH_FLAGS=(
69+
--project "${GCP_PROJECT_ID}"
70+
--zone "${GCE_ZONE}"
71+
--quiet
72+
--tunnel-through-iap
73+
--ssh-key-file "${SSH_KEY_FILE}"
74+
--ssh-flag="-o ServerAliveInterval=30"
75+
--ssh-flag="-o ServerAliveCountMax=4"
76+
--ssh-flag="-o TCPKeepAlive=yes"
77+
)
78+
SCP_FLAGS=(
79+
--project "${GCP_PROJECT_ID}"
80+
--zone "${GCE_ZONE}"
81+
--quiet
82+
--tunnel-through-iap
83+
--ssh-key-file "${SSH_KEY_FILE}"
84+
--scp-flag="-o ServerAliveInterval=30"
85+
--scp-flag="-o ServerAliveCountMax=4"
86+
--scp-flag="-o TCPKeepAlive=yes"
87+
)
88+
89+
remote_png="/tmp/ibkr-gateway-screen.png"
90+
local_png="$RUNNER_TEMP/ibkr-gateway-screen.png"
91+
REMOTE_COMMAND=$(cat <<'EOF'
92+
set -euo pipefail
93+
94+
sudo docker exec -u root ib-gateway bash -lc '
95+
set -euo pipefail
96+
export DEBIAN_FRONTEND=noninteractive
97+
if ! command -v xwd >/dev/null 2>&1 || ! command -v xwdtopnm >/dev/null 2>&1 || ! command -v pnmtopng >/dev/null 2>&1; then
98+
apt-get update
99+
apt-get install -y --no-install-recommends x11-apps netpbm
100+
apt-get clean
101+
rm -rf /var/lib/apt/lists/*
102+
fi
103+
export DISPLAY=:1
104+
xwd -root -silent -out /tmp/ibkr-gateway-screen.xwd
105+
xwdtopnm /tmp/ibkr-gateway-screen.xwd | pnmtopng > /tmp/ibkr-gateway-screen.png
106+
chmod 0644 /tmp/ibkr-gateway-screen.png
107+
'
108+
sudo docker cp ib-gateway:/tmp/ibkr-gateway-screen.png /tmp/ibkr-gateway-screen.png
109+
chmod 0644 /tmp/ibkr-gateway-screen.png
110+
ls -lh /tmp/ibkr-gateway-screen.png
111+
EOF
112+
)
113+
114+
gcloud compute ssh "${REMOTE_TARGET}" "${SSH_FLAGS[@]}" --command "${REMOTE_COMMAND}"
115+
gcloud compute scp "${REMOTE_TARGET}:${remote_png}" "${local_png}" "${SCP_FLAGS[@]}"
116+
echo "SCREENSHOT_PATH=${local_png}" >> "$GITHUB_ENV"
117+
118+
- name: Upload screenshot
119+
uses: actions/upload-artifact@v4
120+
with:
121+
name: ibkr-gateway-screen
122+
path: ${{ env.SCREENSHOT_PATH }}
123+
if-no-files-found: error

0 commit comments

Comments
 (0)