Skip to content

Commit b635bb7

Browse files
committed
Support secret-backed Telegram token sync
1 parent 1288df4 commit b635bb7

File tree

6 files changed

+65
-29
lines changed

6 files changed

+65
-29
lines changed

.github/workflows/sync-cloud-run-env.yml

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ jobs:
1212
ENABLE_GITHUB_ENV_SYNC: ${{ vars.ENABLE_GITHUB_ENV_SYNC }}
1313
CLOUD_RUN_REGION: ${{ vars.CLOUD_RUN_REGION }}
1414
CLOUD_RUN_SERVICE: ${{ vars.CLOUD_RUN_SERVICE }}
15+
TELEGRAM_TOKEN_SECRET_NAME: ${{ vars.TELEGRAM_TOKEN_SECRET_NAME }}
1516
STRATEGY_PROFILE: ${{ vars.STRATEGY_PROFILE }}
1617
ACCOUNT_GROUP: ${{ vars.ACCOUNT_GROUP }}
1718
IB_ACCOUNT_GROUP_CONFIG_SECRET_NAME: ${{ vars.IB_ACCOUNT_GROUP_CONFIG_SECRET_NAME }}
@@ -42,7 +43,6 @@ jobs:
4243
GLOBAL_TELEGRAM_CHAT_ID
4344
NOTIFY_LANG
4445
GCP_SA_KEY
45-
TELEGRAM_TOKEN
4646
)
4747
4848
missing_vars=()
@@ -52,6 +52,10 @@ jobs:
5252
fi
5353
done
5454
55+
if [ -z "${TELEGRAM_TOKEN_SECRET_NAME:-}" ] && [ -z "${TELEGRAM_TOKEN:-}" ]; then
56+
missing_vars+=("TELEGRAM_TOKEN_SECRET_NAME or TELEGRAM_TOKEN")
57+
fi
58+
5559
if [ "${#missing_vars[@]}" -gt 0 ]; then
5660
echo "enabled=false" >> "$GITHUB_OUTPUT"
5761
echo "Cloud Run env sync is enabled, but these values are missing:" >&2
@@ -81,13 +85,13 @@ jobs:
8185
set -euo pipefail
8286
8387
env_pairs=(
84-
"TELEGRAM_TOKEN=${TELEGRAM_TOKEN}"
8588
"GLOBAL_TELEGRAM_CHAT_ID=${GLOBAL_TELEGRAM_CHAT_ID}"
8689
"NOTIFY_LANG=${NOTIFY_LANG}"
8790
"STRATEGY_PROFILE=${STRATEGY_PROFILE}"
8891
"ACCOUNT_GROUP=${ACCOUNT_GROUP}"
8992
"IB_ACCOUNT_GROUP_CONFIG_SECRET_NAME=${IB_ACCOUNT_GROUP_CONFIG_SECRET_NAME}"
9093
)
94+
secret_pairs=()
9195
9296
remove_env_vars=(
9397
"IB_GATEWAY_HOST"
@@ -97,6 +101,14 @@ jobs:
97101
"IB_GATEWAY_INSTANCE_NAME"
98102
"IB_GATEWAY_MODE"
99103
)
104+
remove_secret_vars=()
105+
106+
if [ -n "${TELEGRAM_TOKEN_SECRET_NAME:-}" ]; then
107+
secret_pairs+=("TELEGRAM_TOKEN=${TELEGRAM_TOKEN_SECRET_NAME}:latest")
108+
else
109+
env_pairs+=("TELEGRAM_TOKEN=${TELEGRAM_TOKEN}")
110+
remove_secret_vars+=("TELEGRAM_TOKEN")
111+
fi
100112
101113
if [ -n "${IB_GATEWAY_ZONE:-}" ]; then
102114
env_pairs+=("IB_GATEWAY_ZONE=${IB_GATEWAY_ZONE}")
@@ -110,7 +122,19 @@ jobs:
110122
remove_env_vars+=("IB_GATEWAY_IP_MODE")
111123
fi
112124
113-
gcloud run services update "${CLOUD_RUN_SERVICE}" \
114-
--region "${CLOUD_RUN_REGION}" \
115-
--remove-env-vars "$(IFS=,; echo "${remove_env_vars[*]}")" \
125+
gcloud_args=(
126+
run services update "${CLOUD_RUN_SERVICE}"
127+
--region "${CLOUD_RUN_REGION}"
128+
--remove-env-vars "$(IFS=,; echo "${remove_env_vars[*]}")"
116129
--update-env-vars "$(IFS=,; echo "${env_pairs[*]}")"
130+
)
131+
132+
if [ "${#remove_secret_vars[@]}" -gt 0 ]; then
133+
gcloud_args+=(--remove-secrets "$(IFS=,; echo "${remove_secret_vars[*]}")")
134+
fi
135+
136+
if [ "${#secret_pairs[@]}" -gt 0 ]; then
137+
gcloud_args+=(--update-secrets "$(IFS=,; echo "${secret_pairs[*]}")")
138+
fi
139+
140+
gcloud "${gcloud_args[@]}"

README.md

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ The selected `ACCOUNT_GROUP` is now the runtime identity. Keep broker-specific i
109109
| `ACCOUNT_GROUP` | Yes | Account-group selector. No default fallback. |
110110
| `IB_ACCOUNT_GROUP_CONFIG_SECRET_NAME` | Yes for Cloud Run | Secret Manager secret name for account-group config JSON. Recommended production source. |
111111
| `IB_ACCOUNT_GROUP_CONFIG_JSON` | No | Local/dev JSON fallback for account-group config. Not recommended for production Cloud Run. |
112-
| `TELEGRAM_TOKEN` | Yes | Telegram bot token |
112+
| `TELEGRAM_TOKEN` | Yes | Telegram bot token. For Cloud Run, prefer a Secret Manager reference instead of a literal env var. |
113113
| `GLOBAL_TELEGRAM_CHAT_ID` | Yes | Telegram chat ID used by this service. |
114114
| `NOTIFY_LANG` | No | `en` (default) or `zh` |
115115

@@ -155,7 +155,7 @@ Recommended account-group config payload:
155155
"ib_gateway_mode": "paper",
156156
"ib_gateway_ip_mode": "internal",
157157
"ib_client_id": 1,
158-
"service_name": "interactive-brokers-quant",
158+
"service_name": "interactive-brokers-quant-global-etf-rotation",
159159
"account_ids": ["DU1234567"]
160160
},
161161
"ira": {
@@ -164,7 +164,7 @@ Recommended account-group config payload:
164164
"ib_gateway_mode": "paper",
165165
"ib_gateway_ip_mode": "internal",
166166
"ib_client_id": 7,
167-
"service_name": "interactive-brokers-quant-ira",
167+
"service_name": "interactive-brokers-quant-global-etf-rotation-ira",
168168
"account_ids": ["U1234567"]
169169
}
170170
}
@@ -190,14 +190,15 @@ Recommended setup:
190190
- `ENABLE_GITHUB_ENV_SYNC` = `true`
191191
- `CLOUD_RUN_REGION`
192192
- `CLOUD_RUN_SERVICE`
193+
- `TELEGRAM_TOKEN_SECRET_NAME` (recommended when Cloud Run already uses Secret Manager for `TELEGRAM_TOKEN`)
193194
- `STRATEGY_PROFILE` (recommended: `global_etf_rotation`)
194195
- `ACCOUNT_GROUP` (recommended: `default`)
195196
- `IB_ACCOUNT_GROUP_CONFIG_SECRET_NAME`
196197
- `GLOBAL_TELEGRAM_CHAT_ID`
197198
- `NOTIFY_LANG`
198199
- **Repository Secrets**
199200
- `GCP_SA_KEY`
200-
- `TELEGRAM_TOKEN`
201+
- `TELEGRAM_TOKEN` (fallback only when `TELEGRAM_TOKEN_SECRET_NAME` is not set)
201202
- **Optional transition Variables**
202203
- `IB_GATEWAY_ZONE`
203204
- `IB_GATEWAY_IP_MODE`
@@ -209,14 +210,14 @@ For now, `STRATEGY_PROFILE` still only supports one strategy profile. `ACCOUNT_G
209210
Important:
210211

211212
- The workflow only becomes strict when `ENABLE_GITHUB_ENV_SYNC=true`. If this variable is unset, the sync job is skipped.
212-
- Here "shared config" still only means the **IBKR pair** (`IBKRQuant` + `IBKRGatewayManager`). `GCP_SA_KEY` and `TELEGRAM_TOKEN` remain repository-specific.
213+
- Here "shared config" still only means the **IBKR pair** (`InteractiveBrokersPlatform` + `IBKRGatewayManager`). `GCP_SA_KEY`, `TELEGRAM_TOKEN`, and `TELEGRAM_TOKEN_SECRET_NAME` remain repository-specific.
213214
- If `IB_ACCOUNT_GROUP_CONFIG_SECRET_NAME` is set, the Cloud Run runtime needs Secret Manager access to that secret.
214215
- `GCP_SA_KEY` belongs to the GitHub Actions deploy identity, not to the Cloud Run runtime service account.
215216

216217
### Deployment unit and naming
217218

218-
- `QuantPlatformKit` is only a shared dependency; Cloud Run still deploys `InteractiveBrokersQuant` itself.
219-
- Recommended Cloud Run service name: `interactive-brokers-quant`.
219+
- `QuantPlatformKit` is only a shared dependency; Cloud Run now deploys `InteractiveBrokersPlatform`.
220+
- Recommended Cloud Run service name: `interactive-brokers-quant-global-etf-rotation`.
220221
- For future multi-account rollout, keep one Cloud Run service per `ACCOUNT_GROUP`, and let each service select its account-group config at runtime.
221222
- If you later rename or move this repository, reselect the GitHub source in Cloud Build / Cloud Run trigger instead of assuming the existing source binding will update itself.
222223
- For the shared deployment model and trigger migration checklist, see [`QuantPlatformKit/docs/deployment_model.md`](../QuantPlatformKit/docs/deployment_model.md).
@@ -233,7 +234,7 @@ Important:
233234
Example deploy/update command:
234235

235236
```bash
236-
gcloud run deploy interactive-brokers-quant \
237+
gcloud run deploy interactive-brokers-quant-global-etf-rotation \
237238
--source . \
238239
--region us-central1 \
239240
--service-account interactive-brokers-quant-runtime@PROJECT_ID.iam.gserviceaccount.com \
@@ -320,7 +321,7 @@ IBKR 账户
320321
| `ACCOUNT_GROUP` || 账号组选择器,不再提供默认回退。 |
321322
| `IB_ACCOUNT_GROUP_CONFIG_SECRET_NAME` | Cloud Run 建议必填 | 账号组配置 JSON 在 Secret Manager 里的密钥名。生产环境推荐使用。 |
322323
| `IB_ACCOUNT_GROUP_CONFIG_JSON` || 本地开发用的账号组配置 JSON fallback。不建议在生产 Cloud Run 直接使用。 |
323-
| `TELEGRAM_TOKEN` || Telegram 机器人 Token |
324+
| `TELEGRAM_TOKEN` || Telegram 机器人 Token。Cloud Run 上更推荐走 Secret Manager 引用,不要直接写成明文 env。 |
324325
| `GLOBAL_TELEGRAM_CHAT_ID` || 这个服务使用的 Telegram Chat ID。 |
325326
| `NOTIFY_LANG` || `en`(默认)或 `zh` |
326327

@@ -366,7 +367,7 @@ IB_GATEWAY_IP_MODE=internal
366367
"ib_gateway_mode": "paper",
367368
"ib_gateway_ip_mode": "internal",
368369
"ib_client_id": 1,
369-
"service_name": "interactive-brokers-quant",
370+
"service_name": "interactive-brokers-quant-global-etf-rotation",
370371
"account_ids": ["DU1234567"]
371372
},
372373
"ira": {
@@ -375,7 +376,7 @@ IB_GATEWAY_IP_MODE=internal
375376
"ib_gateway_mode": "paper",
376377
"ib_gateway_ip_mode": "internal",
377378
"ib_client_id": 7,
378-
"service_name": "interactive-brokers-quant-ira",
379+
"service_name": "interactive-brokers-quant-global-etf-rotation-ira",
379380
"account_ids": ["U1234567"]
380381
}
381382
}
@@ -401,14 +402,15 @@ IB_GATEWAY_IP_MODE=internal
401402
- `ENABLE_GITHUB_ENV_SYNC` = `true`
402403
- `CLOUD_RUN_REGION`
403404
- `CLOUD_RUN_SERVICE`
405+
- `TELEGRAM_TOKEN_SECRET_NAME`(如果 Cloud Run 上的 `TELEGRAM_TOKEN` 已经改成 Secret Manager,建议配置)
404406
- `STRATEGY_PROFILE`(建议设为 `global_etf_rotation`
405407
- `ACCOUNT_GROUP`(建议设为 `default`
406408
- `IB_ACCOUNT_GROUP_CONFIG_SECRET_NAME`
407409
- `GLOBAL_TELEGRAM_CHAT_ID`
408410
- `NOTIFY_LANG`
409411
- **仓库级 Secrets**
410412
- `GCP_SA_KEY`
411-
- `TELEGRAM_TOKEN`
413+
- `TELEGRAM_TOKEN`(仅在没设置 `TELEGRAM_TOKEN_SECRET_NAME` 时作为 fallback)
412414
- **可选过渡 Variables**
413415
- `IB_GATEWAY_ZONE`
414416
- `IB_GATEWAY_IP_MODE`
@@ -420,14 +422,14 @@ IB_GATEWAY_IP_MODE=internal
420422
注意:
421423

422424
- 只有在 `ENABLE_GITHUB_ENV_SYNC=true` 时,这个 workflow 才会严格校验并执行同步。没打开时会直接跳过。
423-
- 这里说的“共享配置”仍然只针对 **IBKR 这一组系统**`GCP_SA_KEY``TELEGRAM_TOKEN` 依然是这个仓库自己的 secrets,不建议提升成所有 quant 共用的全局 secret
425+
- 这里说的“共享配置”仍然只针对 **IBKR 这一组系统**`GCP_SA_KEY``TELEGRAM_TOKEN``TELEGRAM_TOKEN_SECRET_NAME` 都还是这个仓库自己的配置,不建议提升成所有 quant 共用的全局配置
424426
- 如果设置了 `IB_ACCOUNT_GROUP_CONFIG_SECRET_NAME`,Cloud Run 运行时还需要有对应 Secret 的访问权限。
425427
- `GCP_SA_KEY` 对应的是 GitHub Actions 的部署身份,不是 Cloud Run runtime service account。
426428

427429
### 部署单元和命名建议
428430

429-
- `QuantPlatformKit` 只是共享依赖,不单独部署;Cloud Run 继续只部署 `InteractiveBrokersQuant`
430-
- 推荐 Cloud Run 服务名:`interactive-brokers-quant`
431+
- `QuantPlatformKit` 只是共享依赖,不单独部署;Cloud Run 现在部署的是 `InteractiveBrokersPlatform`
432+
- 推荐 Cloud Run 服务名:`interactive-brokers-quant-global-etf-rotation`
431433
- 后续如果扩到多账户,建议按 `ACCOUNT_GROUP` 拆成多个 Cloud Run 服务,并让每个服务在运行时选中自己的账号组配置。
432434
- 如果后面改 GitHub 仓库名或再次迁组织,Cloud Build / Cloud Run 里的 GitHub 来源需要重新选择,不要假设旧绑定会自动跟过去。
433435
- 统一部署模型和触发器迁移清单见 [`QuantPlatformKit/docs/deployment_model.md`](../QuantPlatformKit/docs/deployment_model.md)
@@ -444,7 +446,7 @@ IB_GATEWAY_IP_MODE=internal
444446
示例部署命令:
445447

446448
```bash
447-
gcloud run deploy interactive-brokers-quant \
449+
gcloud run deploy interactive-brokers-quant-global-etf-rotation \
448450
--source . \
449451
--region us-central1 \
450452
--service-account interactive-brokers-quant-runtime@PROJECT_ID.iam.gserviceaccount.com \

docs/examples/ibkr-account-groups.default.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"ib_gateway_mode": "paper",
77
"ib_gateway_ip_mode": "internal",
88
"ib_client_id": 1,
9-
"service_name": "interactive-brokers-quant",
9+
"service_name": "interactive-brokers-quant-global-etf-rotation",
1010
"account_ids": [
1111
"DU1234567"
1212
]

docs/ibkr_runtime_rollout.md

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# IBKRQuant 配置落地:先跑通 `ACCOUNT_GROUP=default`
22

3-
这份文档只管当前这一步:**先把 `interactive-brokers-quant` 这一个 Cloud Run 服务,用 `ACCOUNT_GROUP=default` 跑通。**
3+
这份文档只管当前这一步:**先把 `interactive-brokers-quant-global-etf-rotation` 这一个 Cloud Run 服务,用 `ACCOUNT_GROUP=default` 跑通。**
44

55
不在这一步里做的事:
66

@@ -20,7 +20,8 @@
2020
- `IB_ACCOUNT_GROUP_CONFIG_SECRET_NAME`
2121
- `GLOBAL_TELEGRAM_CHAT_ID`
2222
- `NOTIFY_LANG`
23-
- `TELEGRAM_TOKEN`
23+
- `TELEGRAM_TOKEN_SECRET_NAME`(推荐)
24+
- `TELEGRAM_TOKEN`(fallback)
2425

2526
可选过渡变量:
2627

@@ -66,7 +67,7 @@ cp docs/examples/ibkr-account-groups.default.json /tmp/ibkr-account-groups.json
6667
"ib_gateway_mode": "paper",
6768
"ib_gateway_ip_mode": "internal",
6869
"ib_client_id": 1,
69-
"service_name": "interactive-brokers-quant",
70+
"service_name": "interactive-brokers-quant-global-etf-rotation",
7071
"account_ids": ["DU1234567"]
7172
}
7273
}
@@ -166,6 +167,7 @@ gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
166167
- `ENABLE_GITHUB_ENV_SYNC=true`
167168
- `CLOUD_RUN_REGION`
168169
- `CLOUD_RUN_SERVICE`
170+
- `TELEGRAM_TOKEN_SECRET_NAME=interactive-brokers-telegram-token`
169171
- `STRATEGY_PROFILE=global_etf_rotation`
170172
- `ACCOUNT_GROUP=default`
171173
- `IB_ACCOUNT_GROUP_CONFIG_SECRET_NAME=ibkr-account-groups`
@@ -185,7 +187,7 @@ gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
185187
### Repository Secrets
186188

187189
- `GCP_SA_KEY`
188-
- `TELEGRAM_TOKEN`
190+
- `TELEGRAM_TOKEN`(仅在没设置 `TELEGRAM_TOKEN_SECRET_NAME` 时作为 fallback)
189191

190192
说明:
191193

@@ -223,7 +225,7 @@ gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
223225
6. **检查 Cloud Run 当前 env**
224226

225227
```bash
226-
gcloud run services describe interactive-brokers-quant \
228+
gcloud run services describe interactive-brokers-quant-global-etf-rotation \
227229
--project "${PROJECT_ID}" \
228230
--region "us-central1" \
229231
--format="yaml(spec.template.spec.serviceAccountName,spec.template.spec.containers[0].env)"
@@ -232,7 +234,7 @@ gcloud run services describe interactive-brokers-quant \
232234
7. **看启动日志**
233235

234236
```bash
235-
gcloud run services logs read interactive-brokers-quant \
237+
gcloud run services logs read interactive-brokers-quant-global-etf-rotation \
236238
--project "${PROJECT_ID}" \
237239
--region "us-central1" \
238240
--limit=100

tests/test_account_group_examples.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,5 @@ def test_default_account_group_example_is_valid():
1919
assert default_group.ib_gateway_mode == "paper"
2020
assert default_group.ib_gateway_ip_mode == "internal"
2121
assert default_group.ib_client_id == 1
22-
assert default_group.service_name == "interactive-brokers-quant"
22+
assert default_group.service_name == "interactive-brokers-quant-global-etf-rotation"
2323
assert default_group.account_ids == ("DU1234567",)

tests/test_sync_cloud_run_env_workflow.sh

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ workflow_file="$repo_dir/.github/workflows/sync-cloud-run-env.yml"
77
grep -Fq 'ENABLE_GITHUB_ENV_SYNC: ${{ vars.ENABLE_GITHUB_ENV_SYNC }}' "$workflow_file"
88
grep -Fq 'CLOUD_RUN_REGION: ${{ vars.CLOUD_RUN_REGION }}' "$workflow_file"
99
grep -Fq 'CLOUD_RUN_SERVICE: ${{ vars.CLOUD_RUN_SERVICE }}' "$workflow_file"
10+
grep -Fq 'TELEGRAM_TOKEN_SECRET_NAME: ${{ vars.TELEGRAM_TOKEN_SECRET_NAME }}' "$workflow_file"
1011
grep -Fq 'STRATEGY_PROFILE: ${{ vars.STRATEGY_PROFILE }}' "$workflow_file"
1112
grep -Fq 'ACCOUNT_GROUP: ${{ vars.ACCOUNT_GROUP }}' "$workflow_file"
1213
grep -Fq 'IB_ACCOUNT_GROUP_CONFIG_SECRET_NAME: ${{ vars.IB_ACCOUNT_GROUP_CONFIG_SECRET_NAME }}' "$workflow_file"
@@ -19,16 +20,23 @@ grep -Fq 'TELEGRAM_TOKEN: ${{ secrets.TELEGRAM_TOKEN }}' "$workflow_file"
1920
grep -Fq 'credentials_json: ${{ env.GCP_SA_KEY }}' "$workflow_file"
2021
grep -Fq "Skipping Cloud Run env sync because ENABLE_GITHUB_ENV_SYNC is not set to true." "$workflow_file"
2122
grep -Fq "Cloud Run env sync is enabled, but these values are missing:" "$workflow_file"
23+
grep -Fq 'TELEGRAM_TOKEN_SECRET_NAME or TELEGRAM_TOKEN' "$workflow_file"
2224
grep -Fq "if: steps.config.outputs.enabled == 'true'" "$workflow_file"
2325
grep -Fq 'env_pairs=(' "$workflow_file"
26+
grep -Fq 'secret_pairs=(' "$workflow_file"
2427
grep -Fq 'remove_env_vars=(' "$workflow_file"
28+
grep -Fq 'remove_secret_vars=(' "$workflow_file"
2529
grep -Fq 'STRATEGY_PROFILE=${STRATEGY_PROFILE}' "$workflow_file"
2630
grep -Fq 'ACCOUNT_GROUP=${ACCOUNT_GROUP}' "$workflow_file"
2731
grep -Fq 'IB_ACCOUNT_GROUP_CONFIG_SECRET_NAME=${IB_ACCOUNT_GROUP_CONFIG_SECRET_NAME}' "$workflow_file"
32+
grep -Fq 'secret_pairs+=("TELEGRAM_TOKEN=${TELEGRAM_TOKEN_SECRET_NAME}:latest")' "$workflow_file"
33+
grep -Fq 'env_pairs+=("TELEGRAM_TOKEN=${TELEGRAM_TOKEN}")' "$workflow_file"
2834
grep -Fq 'remove_env_vars+=("IB_GATEWAY_ZONE")' "$workflow_file"
2935
grep -Fq 'remove_env_vars+=("IB_GATEWAY_IP_MODE")' "$workflow_file"
3036
grep -Fq '"IB_CLIENT_ID"' "$workflow_file"
3137
grep -Fq '"IB_GATEWAY_INSTANCE_NAME"' "$workflow_file"
3238
grep -Fq '"IB_GATEWAY_MODE"' "$workflow_file"
39+
grep -Fq -- '--remove-secrets "$(IFS=,; echo "${remove_secret_vars[*]}")"' "$workflow_file"
40+
grep -Fq -- '--update-secrets "$(IFS=,; echo "${secret_pairs[*]}")"' "$workflow_file"
3341
grep -Fq -- '--remove-env-vars "$(IFS=,; echo "${remove_env_vars[*]}")"' "$workflow_file"
3442
grep -Fq -- '--update-env-vars "$(IFS=,; echo "${env_pairs[*]}")"' "$workflow_file"

0 commit comments

Comments
 (0)