serverless-ircd 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/ci.yml +96 -2
- package/.github/workflows/deploy-aws.yml +129 -0
- package/.github/workflows/deploy-cf.yml +0 -2
- package/.gitmodules +3 -0
- package/CHANGELOG.md +436 -0
- package/README.md +127 -84
- package/apps/aws-stack/README.md +73 -0
- package/apps/aws-stack/bin/aws.ts +49 -0
- package/apps/aws-stack/cdk.json +10 -0
- package/apps/aws-stack/package.json +41 -0
- package/apps/aws-stack/scripts/smoke-helpers.d.mts +22 -0
- package/apps/aws-stack/scripts/smoke-helpers.mjs +89 -0
- package/apps/aws-stack/scripts/smoke.mjs +142 -0
- package/apps/aws-stack/src/aws-stack.ts +263 -0
- package/apps/aws-stack/src/tables.ts +10 -0
- package/apps/aws-stack/tests/localstack.test.ts +46 -0
- package/apps/aws-stack/tests/smoke-helpers.test.ts +98 -0
- package/apps/aws-stack/tests/stack.test.ts +464 -0
- package/apps/aws-stack/tsconfig.build.json +11 -0
- package/apps/aws-stack/tsconfig.test.json +8 -0
- package/apps/aws-stack/vitest.config.ts +20 -0
- package/apps/cf-worker/package.json +1 -1
- package/apps/cf-worker/scripts/smoke.mjs +0 -0
- package/apps/cf-worker/src/worker.ts +8 -2
- package/apps/cf-worker/tests/smoke.test.ts +1 -0
- package/apps/cf-worker/wrangler.test.toml +5 -1
- package/apps/cf-worker/wrangler.toml +66 -17
- package/apps/local-cli/package.json +1 -1
- package/apps/local-cli/src/config-loader.ts +57 -0
- package/apps/local-cli/src/main.ts +1 -1
- package/apps/local-cli/src/server.ts +267 -32
- package/apps/local-cli/tests/config-loader.test.ts +107 -0
- package/apps/local-cli/tests/e2e.test.ts +126 -0
- package/apps/local-cli/tests/security-e2e.test.ts +239 -0
- package/biome.json +3 -1
- package/docs/ADR-001-pure-reducers-and-effect-system.md +74 -0
- package/docs/ADR-002-location-of-authority.md +82 -0
- package/docs/ADR-003-durable-object-sharding.md +93 -0
- package/docs/ADR-004-dynamodb-schema.md +96 -0
- package/docs/ADR-005-wss-only-transport-v1.md +83 -0
- package/docs/ADR-006-sasl-mechanism-scope.md +86 -0
- package/docs/ADR-007-deterministic-ports.md +82 -0
- package/docs/ADR-008-monorepo-tooling.md +60 -0
- package/docs/AWS-Adapter-Architecture.md +496 -0
- package/docs/AWS-Deployment.md +1186 -0
- package/docs/Cloudflare-Deployment-Guide.md +660 -0
- package/docs/Home.md +11 -0
- package/docs/Observability.md +87 -0
- package/docs/PlanIRCv3Websocket.md +489 -0
- package/docs/PlanWebClient.md +451 -0
- package/docs/Release-Process.md +443 -0
- package/package.json +19 -14
- package/packages/aws-adapter/README.md +35 -0
- package/packages/aws-adapter/package.json +52 -0
- package/packages/aws-adapter/src/account-store.ts +121 -0
- package/packages/aws-adapter/src/aws-runtime.ts +871 -0
- package/packages/aws-adapter/src/cdk-table-defs.ts +73 -0
- package/packages/aws-adapter/src/config-loader.ts +126 -0
- package/packages/aws-adapter/src/dynamo-account-store.ts +156 -0
- package/packages/aws-adapter/src/dynamo.ts +61 -0
- package/packages/aws-adapter/src/handlers/connect.ts +44 -0
- package/packages/aws-adapter/src/handlers/default.ts +330 -0
- package/packages/aws-adapter/src/handlers/disconnect.ts +48 -0
- package/packages/aws-adapter/src/handlers/index.ts +293 -0
- package/packages/aws-adapter/src/handlers/ping-checker.ts +217 -0
- package/packages/aws-adapter/src/handlers/state.ts +13 -0
- package/packages/aws-adapter/src/handlers/sweeper.ts +84 -0
- package/packages/aws-adapter/src/index.ts +74 -0
- package/packages/aws-adapter/src/message-store.ts +34 -0
- package/packages/aws-adapter/src/serialize.ts +283 -0
- package/packages/aws-adapter/src/tables.ts +53 -0
- package/packages/aws-adapter/tests/account-store-dynamo.test.ts +171 -0
- package/packages/aws-adapter/tests/account-store.test.ts +280 -0
- package/packages/aws-adapter/tests/aws-harness.ts +408 -0
- package/packages/aws-adapter/tests/aws-integration.test.ts +17 -0
- package/packages/aws-adapter/tests/aws-runtime.test.ts +654 -0
- package/packages/aws-adapter/tests/config-loader.test.ts +213 -0
- package/packages/aws-adapter/tests/disconnect-fanout.test.ts +336 -0
- package/packages/aws-adapter/tests/dynamo.test.ts +57 -0
- package/packages/aws-adapter/tests/global-setup.ts +301 -0
- package/packages/aws-adapter/tests/gone-exception.test.ts +271 -0
- package/packages/aws-adapter/tests/handlers.test.ts +473 -0
- package/packages/aws-adapter/tests/message-store.test.ts +55 -0
- package/packages/aws-adapter/tests/ping-checker.test.ts +571 -0
- package/packages/aws-adapter/tests/serialize.test.ts +249 -0
- package/packages/aws-adapter/tests/smoke.test.ts +48 -0
- package/packages/aws-adapter/tests/sweeper.test.ts +420 -0
- package/packages/aws-adapter/tests/tables.test.ts +74 -0
- package/packages/aws-adapter/tests/transactions.test.ts +446 -0
- package/packages/aws-adapter/tsconfig.build.json +16 -0
- package/packages/aws-adapter/tsconfig.test.json +14 -0
- package/packages/aws-adapter/vitest.config.ts +23 -0
- package/packages/cf-adapter/package.json +2 -1
- package/packages/cf-adapter/src/cf-runtime.ts +42 -22
- package/packages/cf-adapter/src/channel-do.ts +40 -1
- package/packages/cf-adapter/src/channel-registry-do.ts +58 -0
- package/packages/cf-adapter/src/config-loader.ts +135 -0
- package/packages/cf-adapter/src/connection-do.ts +119 -0
- package/packages/cf-adapter/src/env.ts +27 -1
- package/packages/cf-adapter/src/index.ts +2 -1
- package/packages/cf-adapter/tests/cf-harness.ts +2 -2
- package/packages/cf-adapter/tests/cf-integration.test.ts +2 -2
- package/packages/cf-adapter/tests/cf-runtime.test.ts +91 -0
- package/packages/cf-adapter/tests/config-loader.test.ts +149 -0
- package/packages/cf-adapter/tests/connection-do.test.ts +82 -0
- package/packages/cf-adapter/tests/worker/main.ts +2 -1
- package/packages/cf-adapter/tests/worker/stubs/channel-stub.ts +7 -1
- package/packages/cf-adapter/wrangler.test.toml +10 -1
- package/packages/in-memory-runtime/package.json +1 -1
- package/packages/in-memory-runtime/src/in-memory-runtime.ts +107 -16
- package/packages/in-memory-runtime/src/index.ts +1 -1
- package/packages/in-memory-runtime/tests/in-memory-runtime.test.ts +134 -0
- package/packages/irc-core/package.json +13 -2
- package/packages/irc-core/src/admission.ts +216 -0
- package/packages/irc-core/src/caps/capabilities.ts +1 -0
- package/packages/irc-core/src/case-fold.ts +64 -0
- package/packages/irc-core/src/cloak.ts +81 -0
- package/packages/irc-core/src/commands/cap.ts +1 -2
- package/packages/irc-core/src/commands/chathistory.ts +305 -0
- package/packages/irc-core/src/commands/index.ts +9 -0
- package/packages/irc-core/src/commands/invite.ts +6 -9
- package/packages/irc-core/src/commands/isupport.ts +1 -1
- package/packages/irc-core/src/commands/join.ts +63 -10
- package/packages/irc-core/src/commands/kick.ts +4 -11
- package/packages/irc-core/src/commands/list.ts +5 -4
- package/packages/irc-core/src/commands/mode.ts +5 -9
- package/packages/irc-core/src/commands/motd-lines.ts +127 -0
- package/packages/irc-core/src/commands/motd.ts +6 -110
- package/packages/irc-core/src/commands/oper.ts +151 -0
- package/packages/irc-core/src/commands/privmsg.ts +24 -0
- package/packages/irc-core/src/commands/registration.ts +79 -21
- package/packages/irc-core/src/commands/sasl.ts +251 -0
- package/packages/irc-core/src/commands/tagmsg.ts +205 -0
- package/packages/irc-core/src/config.ts +270 -0
- package/packages/irc-core/src/flood-control.ts +175 -0
- package/packages/irc-core/src/index.ts +7 -0
- package/packages/irc-core/src/ports.ts +719 -0
- package/packages/irc-core/src/protocol/base64.ts +16 -0
- package/packages/irc-core/src/protocol/index.ts +2 -1
- package/packages/irc-core/src/protocol/numerics.ts +11 -0
- package/packages/irc-core/src/protocol/parser.ts +27 -2
- package/packages/irc-core/src/state/connection.ts +41 -0
- package/packages/irc-core/src/types.ts +88 -2
- package/packages/irc-core/stryker.commands.conf.json +41 -0
- package/packages/irc-core/stryker.protocol.conf.json +26 -0
- package/packages/irc-core/tests/account-store.test.ts +88 -0
- package/packages/irc-core/tests/admission.test.ts +229 -0
- package/packages/irc-core/tests/caps/capabilities.test.ts +22 -0
- package/packages/irc-core/tests/case-fold.test.ts +80 -0
- package/packages/irc-core/tests/cloak.test.ts +78 -0
- package/packages/irc-core/tests/commands/chathistory.test.ts +996 -0
- package/packages/irc-core/tests/commands/join.test.ts +246 -2
- package/packages/irc-core/tests/commands/kick.test.ts +15 -0
- package/packages/irc-core/tests/commands/oper.test.ts +257 -0
- package/packages/irc-core/tests/commands/privmsg.test.ts +146 -2
- package/packages/irc-core/tests/commands/registration.test.ts +380 -20
- package/packages/irc-core/tests/commands/sasl.test.ts +536 -0
- package/packages/irc-core/tests/commands/tagmsg.test.ts +688 -0
- package/packages/irc-core/tests/commands/who.test.ts +22 -4
- package/packages/irc-core/tests/commands/whois.test.ts +8 -1
- package/packages/irc-core/tests/config.test.ts +721 -0
- package/packages/irc-core/tests/flood-control.test.ts +394 -0
- package/packages/irc-core/tests/message-store.test.ts +530 -0
- package/packages/irc-core/tests/parser.test.ts +44 -1
- package/packages/irc-core/tests/ports.test.ts +263 -0
- package/packages/irc-server/package.json +1 -1
- package/packages/irc-server/src/actor.ts +186 -44
- package/packages/irc-server/src/dispatch.ts +89 -5
- package/packages/irc-server/src/index.ts +2 -0
- package/packages/irc-server/src/routing.ts +160 -0
- package/packages/irc-server/tests/actor.test.ts +690 -15
- package/packages/irc-server/tests/dispatch.test.ts +84 -0
- package/packages/irc-server/tests/routing.test.ts +204 -0
- package/packages/irc-test-support/README.md +32 -0
- package/packages/irc-test-support/package.json +37 -0
- package/packages/{cf-adapter/tests/integration → irc-test-support/src}/in-memory-harness.ts +6 -5
- package/packages/irc-test-support/src/index.ts +24 -0
- package/packages/{cf-adapter/tests/integration/harness.test.ts → irc-test-support/tests/in-memory-harness.test.ts} +1 -1
- package/packages/{cf-adapter/tests/integration/scenarios.test.ts → irc-test-support/tests/in-memory-scenarios.test.ts} +1 -2
- package/packages/irc-test-support/tests/smoke.test.ts +11 -0
- package/packages/irc-test-support/tsconfig.build.json +16 -0
- package/packages/irc-test-support/tsconfig.test.json +14 -0
- package/packages/irc-test-support/vitest.config.ts +20 -0
- package/pnpm-workspace.yaml +1 -0
- package/tools/ci-hardening/package.json +30 -0
- package/tools/ci-hardening/src/index.ts +6 -0
- package/tools/ci-hardening/src/validate.ts +103 -0
- package/tools/ci-hardening/tests/__no_thresholds__.txt +11 -0
- package/tools/ci-hardening/tests/__partial_thresholds__.txt +16 -0
- package/tools/ci-hardening/tests/__stryker_bad__.json +4 -0
- package/tools/ci-hardening/tests/validate.test.ts +177 -0
- package/tools/ci-hardening/tsconfig.build.json +12 -0
- package/tools/ci-hardening/tsconfig.test.json +10 -0
- package/tools/ci-hardening/vitest.config.ts +21 -0
- package/tools/seed-aws-accounts.ts +80 -0
- package/tools/tcp-ws-forwarder/package.json +1 -1
- package/tools/tcp-ws-forwarder/src/forwarder.ts +34 -23
- package/tools/tcp-ws-forwarder/src/logger.ts +155 -0
- package/tools/tcp-ws-forwarder/src/main.ts +33 -14
- package/tools/tcp-ws-forwarder/tests/forwarder.test.ts +86 -0
- package/tools/tcp-ws-forwarder/tests/logger.test.ts +136 -0
- package/packages/cf-adapter/tests/integration/index.ts +0 -17
- /package/packages/{cf-adapter/tests/integration → irc-test-support/src}/harness.ts +0 -0
- /package/packages/{cf-adapter/tests/integration → irc-test-support/src}/scenarios.ts +0 -0
package/.github/workflows/ci.yml
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
name: CI
|
|
2
2
|
|
|
3
|
+
# Cross-cutting verification pipeline (coverage gate + contract suite
|
|
4
|
+
# on every PR + mutation-testing spot-check on irc-core).
|
|
5
|
+
#
|
|
6
|
+
# Failure modes (any of these blocks the merge):
|
|
7
|
+
# - biome lint
|
|
8
|
+
# - tsc strict typecheck across the workspace
|
|
9
|
+
# - any package unit/integration test
|
|
10
|
+
# - vitest per-package coverage threshold regression
|
|
11
|
+
# (100% on irc-core/irc-server/in-memory-runtime, >=90% elsewhere)
|
|
12
|
+
# - integration contract suite (packages/cf-adapter/tests/integration)
|
|
13
|
+
# - Stryker mutation score < 80% on irc-core/protocol or
|
|
14
|
+
# irc-core/commands
|
|
15
|
+
#
|
|
16
|
+
# The coverage gate is split into its own named step so the GitHub
|
|
17
|
+
# Actions UI surfaces "Coverage gate" as the failing step instead of
|
|
18
|
+
# the generic "Test with coverage" name. The mutation job runs in
|
|
19
|
+
# parallel because Stryker is the slowest single task in the pipeline
|
|
20
|
+
# and is independent of the typecheck/lint/coverage chain.
|
|
21
|
+
|
|
3
22
|
on:
|
|
4
23
|
push:
|
|
5
24
|
branches: [main]
|
|
@@ -16,8 +35,6 @@ jobs:
|
|
|
16
35
|
|
|
17
36
|
- name: Setup pnpm
|
|
18
37
|
uses: pnpm/action-setup@v4
|
|
19
|
-
with:
|
|
20
|
-
version: 9
|
|
21
38
|
|
|
22
39
|
- name: Setup Node
|
|
23
40
|
uses: actions/setup-node@v4
|
|
@@ -37,6 +54,40 @@ jobs:
|
|
|
37
54
|
- name: Test with coverage
|
|
38
55
|
run: pnpm coverage
|
|
39
56
|
|
|
57
|
+
- name: Coverage gate (coverage-thresholds enforced per package)
|
|
58
|
+
# Vitest enforces 100% line/function/branch/statement coverage
|
|
59
|
+
# on irc-core/irc-server/in-memory-runtime and >=90% on
|
|
60
|
+
# cf-adapter/local-cli/tcp-ws-forwarder via the `thresholds`
|
|
61
|
+
# block in each package's vitest.config.ts. The previous step
|
|
62
|
+
# exits non-zero on any regression; this named no-op marker
|
|
63
|
+
# makes the gate explicit in the Actions UI and reserves a
|
|
64
|
+
# place to plug in a future aggregate-coverage check.
|
|
65
|
+
if: success()
|
|
66
|
+
run: |
|
|
67
|
+
echo "coverage-thresholds: PASSED"
|
|
68
|
+
echo " irc-core: 100% (lines/functions/branches/statements)"
|
|
69
|
+
echo " irc-server: 100% (lines/functions/branches/statements)"
|
|
70
|
+
echo " in-memory-runtime: 100% (lines/functions/branches/statements)"
|
|
71
|
+
echo " cf-adapter: >=90% (lines/functions/branches/statements)"
|
|
72
|
+
echo " local-cli: >=90% (lines/functions/branches/statements)"
|
|
73
|
+
|
|
74
|
+
- name: Contract tests (parametrized integration suite)
|
|
75
|
+
# The parametrized integration contract suite
|
|
76
|
+
# (packages/cf-adapter/tests/integration) runs the same IRC
|
|
77
|
+
# scenarios against every runtime via a runtime factory, so
|
|
78
|
+
# any contract regression in irc-core surfaces here even when
|
|
79
|
+
# unit coverage is 100%. Invoked explicitly here so the step
|
|
80
|
+
# name shows up in the Actions UI; the underlying test files
|
|
81
|
+
# are also exercised by `pnpm coverage` above.
|
|
82
|
+
run: pnpm --filter @serverless-ircd/cf-adapter test
|
|
83
|
+
|
|
84
|
+
- name: CI hardening config self-check
|
|
85
|
+
# Validates that the coverage gate and mutation-testing
|
|
86
|
+
# configs exist and meet the documented thresholds. Catches
|
|
87
|
+
# drift (someone lowering a threshold or dropping a Stryker
|
|
88
|
+
# config) before it reaches main.
|
|
89
|
+
run: pnpm --filter @serverless-ircd/ci-hardening test
|
|
90
|
+
|
|
40
91
|
- name: Upload coverage
|
|
41
92
|
if: always()
|
|
42
93
|
uses: actions/upload-artifact@v4
|
|
@@ -45,3 +96,46 @@ jobs:
|
|
|
45
96
|
path: |
|
|
46
97
|
packages/*/coverage
|
|
47
98
|
apps/*/coverage
|
|
99
|
+
|
|
100
|
+
mutation:
|
|
101
|
+
name: mutation spot-check (irc-core)
|
|
102
|
+
runs-on: ubuntu-latest
|
|
103
|
+
# Stryker is the slowest single task; it is independent of the
|
|
104
|
+
# typecheck/lint/coverage chain and runs in parallel.
|
|
105
|
+
steps:
|
|
106
|
+
- name: Checkout
|
|
107
|
+
uses: actions/checkout@v4
|
|
108
|
+
|
|
109
|
+
- name: Setup pnpm
|
|
110
|
+
uses: pnpm/action-setup@v4
|
|
111
|
+
|
|
112
|
+
- name: Setup Node
|
|
113
|
+
uses: actions/setup-node@v4
|
|
114
|
+
with:
|
|
115
|
+
node-version: 20
|
|
116
|
+
cache: pnpm
|
|
117
|
+
|
|
118
|
+
- name: Install dependencies
|
|
119
|
+
run: pnpm install --frozen-lockfile
|
|
120
|
+
|
|
121
|
+
- name: Build workspace (irc-core mutation targets)
|
|
122
|
+
run: pnpm build
|
|
123
|
+
|
|
124
|
+
- name: Stryker spot-check on irc-core/protocol
|
|
125
|
+
# Mutation score threshold >=80% is enforced by the
|
|
126
|
+
# stryker.protocol.conf.json `thresholds.break` field. The
|
|
127
|
+
# job fails if the score drops below the gate.
|
|
128
|
+
run: pnpm mutation:protocol
|
|
129
|
+
|
|
130
|
+
- name: Stryker spot-check on irc-core/commands
|
|
131
|
+
# Mutation score threshold >=80% is enforced by the
|
|
132
|
+
# stryker.commands.conf.json `thresholds.break` field. The
|
|
133
|
+
# job fails if the score drops below the gate.
|
|
134
|
+
run: pnpm mutation:commands
|
|
135
|
+
|
|
136
|
+
- name: Upload mutation report
|
|
137
|
+
if: always()
|
|
138
|
+
uses: actions/upload-artifact@v4
|
|
139
|
+
with:
|
|
140
|
+
name: mutation-report
|
|
141
|
+
path: packages/irc-core/reports/mutation
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
name: deploy-aws
|
|
2
|
+
|
|
3
|
+
# AWS CDK deploy pipeline.
|
|
4
|
+
#
|
|
5
|
+
# On every push to `main`:
|
|
6
|
+
# 1. Install deps (frozen lockfile).
|
|
7
|
+
# 2. Build the aws-adapter + irc-core/irc-server so the CDK stack
|
|
8
|
+
# typechecks against real workspace packages.
|
|
9
|
+
# 3. `cdk deploy --all` the `apps/aws-stack` stack (API Gateway v2
|
|
10
|
+
# WebSocket API, Lambda, DynamoDB tables) to the staging AWS
|
|
11
|
+
# account/region.
|
|
12
|
+
# 4. Replay the smoke e2e (`scripts/smoke.mjs`) against the deployed
|
|
13
|
+
# WebSocket endpoint — CONNECT/REGISTER/JOIN/PRIVMSG/QUIT. Failure
|
|
14
|
+
# blocks the merge (the deploy job is required on `main`).
|
|
15
|
+
#
|
|
16
|
+
# Secrets / variables (configure under repo Settings → Secrets and
|
|
17
|
+
# variables → Actions):
|
|
18
|
+
# AWS_ACCESS_KEY_ID Static AWS access key with permission to deploy
|
|
19
|
+
# the stack (IAM, APIGW, Lambda, DynamoDB).
|
|
20
|
+
# Required unless OIDC is used (see below).
|
|
21
|
+
# AWS_SECRET_ACCESS_KEY Companion secret key. Required unless OIDC.
|
|
22
|
+
# AWS_DEPLOY_ROLE_ARN Optional. When set, the job assumes this role
|
|
23
|
+
# via OIDC web identity instead of using static
|
|
24
|
+
# access keys. Requires `permissions.id-token:
|
|
25
|
+
# write` (declared below) and an OIDC trust
|
|
26
|
+
# policy on the role granting
|
|
27
|
+
# `sts:AssumeRoleWithWebIdentity` to this repo's
|
|
28
|
+
# GitHub OIDC provider.
|
|
29
|
+
# AWS_REGION AWS region to deploy into (e.g. us-east-1).
|
|
30
|
+
#
|
|
31
|
+
# Repo variable (Settings → Secrets and variables → Variables):
|
|
32
|
+
# AWS_SMOKE_URL Optional. The wss:// URL of the deployed
|
|
33
|
+
# WebSocket stage. When unset the workflow
|
|
34
|
+
# falls back to reading the stack's `ConnectUrl`
|
|
35
|
+
# CloudFormation output via the AWS CLI; if that
|
|
36
|
+
# also fails the smoke step is skipped with a
|
|
37
|
+
# warning (mirrors the CF pipeline's skip
|
|
38
|
+
# behaviour).
|
|
39
|
+
|
|
40
|
+
on:
|
|
41
|
+
push:
|
|
42
|
+
branches: [main]
|
|
43
|
+
workflow_dispatch:
|
|
44
|
+
|
|
45
|
+
# OIDC web identity requires id-token write; contents:read for checkout.
|
|
46
|
+
permissions:
|
|
47
|
+
id-token: write
|
|
48
|
+
contents: read
|
|
49
|
+
|
|
50
|
+
# Prevent two deploys racing the same CloudFormation stack.
|
|
51
|
+
concurrency:
|
|
52
|
+
group: aws-staging
|
|
53
|
+
cancel-in-progress: false
|
|
54
|
+
|
|
55
|
+
jobs:
|
|
56
|
+
deploy-staging:
|
|
57
|
+
name: cdk deploy --all (staging)
|
|
58
|
+
runs-on: ubuntu-latest
|
|
59
|
+
timeout-minutes: 10
|
|
60
|
+
steps:
|
|
61
|
+
- name: Checkout
|
|
62
|
+
uses: actions/checkout@v4
|
|
63
|
+
|
|
64
|
+
- name: Setup pnpm
|
|
65
|
+
uses: pnpm/action-setup@v4
|
|
66
|
+
with:
|
|
67
|
+
version: 9
|
|
68
|
+
|
|
69
|
+
- name: Setup Node
|
|
70
|
+
uses: actions/setup-node@v4
|
|
71
|
+
with:
|
|
72
|
+
node-version: 20
|
|
73
|
+
cache: pnpm
|
|
74
|
+
|
|
75
|
+
- name: Install dependencies
|
|
76
|
+
run: pnpm install --frozen-lockfile
|
|
77
|
+
|
|
78
|
+
- name: Build workspace
|
|
79
|
+
run: pnpm build
|
|
80
|
+
|
|
81
|
+
- name: Typecheck
|
|
82
|
+
run: pnpm typecheck
|
|
83
|
+
|
|
84
|
+
- name: Test
|
|
85
|
+
run: pnpm test
|
|
86
|
+
|
|
87
|
+
# When AWS_DEPLOY_ROLE_ARN is set, assume it via OIDC web identity
|
|
88
|
+
# (ignores the static access keys). Otherwise fall back to the
|
|
89
|
+
# static access-key pair. Both shapes are handled by the action:
|
|
90
|
+
# an empty role-to-assume is treated as unset.
|
|
91
|
+
- name: Configure AWS credentials
|
|
92
|
+
uses: aws-actions/configure-aws-credentials@v4
|
|
93
|
+
with:
|
|
94
|
+
aws-region: ${{ secrets.AWS_REGION }}
|
|
95
|
+
role-to-assume: ${{ secrets.AWS_DEPLOY_ROLE_ARN }}
|
|
96
|
+
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
|
97
|
+
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
|
98
|
+
|
|
99
|
+
- name: Deploy to staging
|
|
100
|
+
run: pnpm deploy:aws:staging -- -c environmentName=staging
|
|
101
|
+
|
|
102
|
+
- name: Resolve smoke URL
|
|
103
|
+
id: smoke-url
|
|
104
|
+
env:
|
|
105
|
+
AWS_SMOKE_URL: ${{ vars.AWS_SMOKE_URL }}
|
|
106
|
+
run: |
|
|
107
|
+
if [ -n "$AWS_SMOKE_URL" ]; then
|
|
108
|
+
echo "url=$AWS_SMOKE_URL" >> "$GITHUB_OUTPUT"
|
|
109
|
+
else
|
|
110
|
+
# Fall back to the stack's ConnectUrl CloudFormation output.
|
|
111
|
+
# Stack name is `IrcAwsStack-<environmentName>`; staging →
|
|
112
|
+
# `IrcAwsStack-staging`.
|
|
113
|
+
URL=$(aws cloudformation describe-stacks \
|
|
114
|
+
--stack-name IrcAwsStack-staging \
|
|
115
|
+
--query 'Stacks[0].Outputs[?OutputKey==`ConnectUrl`].OutputValue' \
|
|
116
|
+
--output text 2>/dev/null || true)
|
|
117
|
+
if [ -n "$URL" ]; then
|
|
118
|
+
echo "url=$URL" >> "$GITHUB_OUTPUT"
|
|
119
|
+
else
|
|
120
|
+
echo "::warning::Unable to resolve the staging WebSocket URL (set the AWS_SMOKE_URL repo variable or check the stack ConnectUrl output); smoke step will be skipped."
|
|
121
|
+
echo "url=" >> "$GITHUB_OUTPUT"
|
|
122
|
+
fi
|
|
123
|
+
fi
|
|
124
|
+
|
|
125
|
+
- name: Smoke e2e
|
|
126
|
+
if: steps.smoke-url.outputs.url != ''
|
|
127
|
+
env:
|
|
128
|
+
SMOKE_URL: ${{ steps.smoke-url.outputs.url }}
|
|
129
|
+
run: pnpm smoke:aws:staging -- --url "$SMOKE_URL"
|
package/.gitmodules
ADDED