Skip to content

Commit d94cf9b

Browse files
committed
feat(trogon-source-linear): add Linear webhook receiver that sinks events to NATS JetStream
Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
1 parent 19aea84 commit d94cf9b

10 files changed

Lines changed: 1962 additions & 42 deletions

File tree

devops/docker/compose/compose.yml

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,32 @@ services:
4242
start_period: 10s
4343
retries: 3
4444

45+
trogon-source-linear:
46+
build:
47+
context: ../../../rsworkspace
48+
dockerfile: ../devops/docker/compose/services/trogon-source-linear/Dockerfile
49+
environment:
50+
NATS_URL: "nats:4222"
51+
LINEAR_WEBHOOK_SECRET: "${LINEAR_WEBHOOK_SECRET:-}"
52+
LINEAR_WEBHOOK_PORT: "${LINEAR_WEBHOOK_PORT:-8080}"
53+
LINEAR_SUBJECT_PREFIX: "${LINEAR_SUBJECT_PREFIX:-linear}"
54+
LINEAR_STREAM_NAME: "${LINEAR_STREAM_NAME:-LINEAR}"
55+
LINEAR_STREAM_MAX_AGE_SECS: "${LINEAR_STREAM_MAX_AGE_SECS:-604800}"
56+
LINEAR_WEBHOOK_TIMESTAMP_TOLERANCE_SECS: "${LINEAR_WEBHOOK_TIMESTAMP_TOLERANCE_SECS:-60}"
57+
LINEAR_NATS_ACK_TIMEOUT_MS: "${LINEAR_NATS_ACK_TIMEOUT_MS:-10000}"
58+
LINEAR_NATS_STREAM_OP_TIMEOUT_MS: "${LINEAR_NATS_STREAM_OP_TIMEOUT_MS:-10000}"
59+
RUST_LOG: "${RUST_LOG:-info}"
60+
depends_on:
61+
nats:
62+
condition: service_healthy
63+
restart: unless-stopped
64+
healthcheck:
65+
test: ["CMD", "curl", "-sf", "http://localhost:${LINEAR_WEBHOOK_PORT:-8080}/health"]
66+
interval: 10s
67+
timeout: 3s
68+
start_period: 10s
69+
retries: 3
70+
4571
trogon-source-slack:
4672
build:
4773
context: ../../../rsworkspace
@@ -73,6 +99,7 @@ services:
7399
environment:
74100
NGROK_AUTHTOKEN: "${NGROK_AUTHTOKEN:-}"
75101
GITHUB_ADDR: "trogon-source-github:${GITHUB_WEBHOOK_PORT:-8080}"
102+
LINEAR_ADDR: "trogon-source-linear:${LINEAR_WEBHOOK_PORT:-8080}"
76103
SLACK_ADDR: "trogon-source-slack:${SLACK_WEBHOOK_PORT:-3000}"
77104
entrypoint:
78105
- /bin/sh
@@ -84,6 +111,9 @@ services:
84111
github:
85112
addr: $${GITHUB_ADDR}
86113
proto: http
114+
linear:
115+
addr: $${LINEAR_ADDR}
116+
proto: http
87117
slack:
88118
addr: $${SLACK_ADDR}
89119
proto: http
@@ -92,6 +122,8 @@ services:
92122
depends_on:
93123
trogon-source-github:
94124
condition: service_healthy
125+
trogon-source-linear:
126+
condition: service_healthy
95127
trogon-source-slack:
96128
condition: service_healthy
97129
restart: unless-stopped
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# ── Stage 1: chef — generate dependency recipe ──────────────────────────────
2+
FROM rust:1.93-slim AS chef
3+
4+
RUN cargo install cargo-chef --locked
5+
6+
WORKDIR /build
7+
8+
# ── Stage 2: planner — capture dependency graph ─────────────────────────────
9+
FROM chef AS planner
10+
11+
COPY Cargo.toml Cargo.lock ./
12+
COPY crates/ crates/
13+
14+
RUN cargo chef prepare --recipe-path recipe.json
15+
16+
# ── Stage 3: builder — cached dependency build + final compile ──────────────
17+
FROM chef AS builder
18+
19+
COPY --from=planner /build/recipe.json recipe.json
20+
RUN cargo chef cook --release --recipe-path recipe.json -p trogon-source-linear
21+
22+
COPY Cargo.toml Cargo.lock ./
23+
COPY crates/ crates/
24+
25+
RUN cargo build --release -p trogon-source-linear && \
26+
strip target/release/trogon-source-linear
27+
28+
# ── Stage 4: runtime ────────────────────────────────────────────────────────
29+
FROM debian:bookworm-20250317-slim AS runtime
30+
31+
RUN apt-get update && apt-get install -y --no-install-recommends \
32+
ca-certificates curl \
33+
&& rm -rf /var/lib/apt/lists/*
34+
35+
RUN useradd --no-create-home --shell /usr/sbin/nologin trogon
36+
37+
COPY --from=builder /build/target/release/trogon-source-linear /usr/local/bin/trogon-source-linear
38+
39+
USER trogon
40+
41+
EXPOSE 8080
42+
43+
STOPSIGNAL SIGTERM
44+
45+
ENTRYPOINT ["/usr/local/bin/trogon-source-linear"]

0 commit comments

Comments
 (0)