8000 chore: 워커 호출량 그래프 자동 갱신 · hmmhmmhm/daiso-mcp@8862ddd · GitHub
[go: up one dir, main page]

Skip to content

External Smoke

External Smoke #185

name: External Smoke
on:
schedule:
# 한국시간 00:40 = UTC 15:40 (전날)
- cron: '40 15 * * *'
workflow_dispatch:
permissions:
contents: read
concurrency:
group: external-smoke-${{ github.ref }}
cancel-in-progress: false
jobs:
external-smoke:
runs-on: ubuntu-latest
timeout-minutes: 60
name: Sequential external smoke
steps:
- name: Checkout
uses: actions/checkout@v7
- name: Setup Node.js
uses: actions/setup-node@v7
with:
node-version: '24'
cache: npm
- name: Install dependencies
run: npm ci
- name: Build once
run: npm run build
- name: Run external smoke sequentially
env:
CLI_SMOKE_SERVICES: daiso daiso_jp gs25 seveneleven emart24 oliveyoung megabox lottecinema cgv opinet dtryx
MCP_SMOKE_SERVICES: daiso daiso_jp gs25 seveneleven emart24 opinet
SMOKE_ATTEMPT_TIMEOUT_SECONDS: 90
run: |
set +e
FAILURES=()
run_smoke_once() {
local SMOKE_SUITE="$1"
local SMOKE_SERVICE="$2"
local OUTPUT_FILE="$3"
if [ "${SMOKE_SUITE}" = "cli" ]; then
timeout --signal=TERM --kill-after=10s "${SMOKE_ATTEMPT_TIMEOUT_SECONDS}s" npx tsx scripts/ops/cli-smoke.ts --service "${SMOKE_SERVICE}" 2>&1 | tee "${OUTPUT_FILE}"
return "${PIPESTATUS[0]}"
fi
timeout --signal=TERM --kill-after=10s "${SMOKE_ATTEMPT_TIMEOUT_SECONDS}s" npx tsx scripts/ops/mcp-smoke.ts --service "${SMOKE_SERVICE}" 2>&1 | tee "${OUTPUT_FILE}"
return "${PIPESTATUS[0]}"
}
run_smoke_with_retry() {
local SMOKE_SUITE="$1"
local SMOKE_SERVICE="$2"
local OUTPUT_FILE="external-smoke-${SMOKE_SUITE}-${SMOKE_SERVICE}.txt"
if run_smoke_once "${SMOKE_SUITE}" "${SMOKE_SERVICE}" "${OUTPUT_FILE}"; then
return 0
fi
echo "${SMOKE_SUITE}.${SMOKE_SERVICE} failed; retrying after 15 seconds"
sleep 15
if run_smoke_once "${SMOKE_SUITE}" "${SMOKE_SERVICE}" "${OUTPUT_FILE}"; then
return 0
fi
local EXCERPT
EXCERPT="$(tail -n 8 "${OUTPUT_FILE}" | tr '\n' ' ' | cut -c1-1000)"
FAILURES+=("${SMOKE_SUITE}.${SMOKE_SERVICE}: ${EXCERPT:-unknown}")
return 1
}
for SMOKE_SERVICE in ${CLI_SMOKE_SERVICES}; do
run_smoke_with_retry "cli" "${SMOKE_SERVICE}" || true
done
for SMOKE_SERVICE in ${MCP_SMOKE_SERVICES}; do
run_smoke_with_retry "mcp" "${SMOKE_SERVICE}" || true
done
RUN_URL="${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}"
if [ "${#FAILURES[@]}" -gt 0 ]; then
{
printf 'status=failed failures=%s run=%s ' "${#FAILURES[@]}" "${RUN_URL}"
printf '%s | ' "${FAILURES[@]}"
printf '\n'
} | tee external-smoke-summary.txt
exit 1
fi
echo "status=ok failures=0 run=${RUN_URL}" | tee external-smoke-summary.txt
- name: Notify smoke failure
if: failure() && github.event_name == 'schedule'
env:
MOSHI_WEBHOOK_TOKEN: ${{ secrets.MOSHI_WEBHOOK_TOKEN }}
run: |
if [ -z "${MOSHI_WEBHOOK_TOKEN}" ]; then
echo "MOSHI_WEBHOOK_TOKEN is not set; skipping failure notification"
exit 0
fi
SUMMARY="$(cat external-smoke-summary.txt 2>/dev/null || echo 'external smoke command failed')" node <<'NODE'
const fs = require('node:fs');
fs.writeFileSync(
'moshi-payload.json',
JSON.stringify({
token: process.env.MOSHI_WEBHOOK_TOKEN,
title: 'External Smoke Failed',
message: `${process.env.GITHUB_REPOSITORY}: ${process.env.SUMMARY || ''}`.slice(0, 3500),
}),
);
NODE
curl --fail-with-body --silent --show-error \
-X POST https://api.getmoshi.app/api/webhook \
-H "Content-Type: application/json" \
--data-binary @moshi-payload.json
0