From c97c5bcbcf369ffcdc3cd38612cdbd2e0b09ff07 Mon Sep 17 00:00:00 2001 From: Chad Curtis Date: Mon, 17 Mar 2025 01:07:10 -0400 Subject: [PATCH 01/12] Add trigger to call Playwright test pipeline via webhook. --- .gitlab-ci.yml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2b9f0555..c24a038e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -5,6 +5,7 @@ default: stages: - test + - trigger-playwright-tests test: stage: test @@ -29,3 +30,23 @@ test: - deno-test.xml reports: junit: deno-test.xml + +trigger-playwright-tests: + stage: trigger-playwright-tests + image: ubuntu:latest + before_script: + - apt update && apt install -y curl + script: + - | + curl --request POST \ + --form "token=${PLAYWRIGHT_TRIGGER_TOKEN}" \ + --form "ref=main" \ + --form "merge_requests_events=true" \ + --form "variables[CI_PROJECT_ID]=${CI_PROJECT_ID}" \ + --form "variables[CI_MERGE_REQUEST_IID]=${CI_MERGE_REQUEST_IID}" \ + --form "variables[CI_COMMIT_SHA]=${CI_COMMIT_SHA}" \ + --form "variables[CI_COMMIT_SHORT_SHA]=${CI_COMMIT_SHORT_SHA}" \ + --form "variables[CI_COMMIT_REF_NAME]=${CI_COMMIT_REF_NAME}" \ + "https://gitlab.com/api/v4/projects/67335996/trigger/pipeline" + only: + - merge_requests \ No newline at end of file From 9e4bb769d29a78e199359bae48f65a5eac4b59d0 Mon Sep 17 00:00:00 2001 From: Chad Curtis Date: Mon, 17 Mar 2025 01:12:56 -0400 Subject: [PATCH 02/12] Add a newline ending because the rabbit asked nicely. --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c24a038e..02c565e7 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -49,4 +49,4 @@ trigger-playwright-tests: --form "variables[CI_COMMIT_REF_NAME]=${CI_COMMIT_REF_NAME}" \ "https://gitlab.com/api/v4/projects/67335996/trigger/pipeline" only: - - merge_requests \ No newline at end of file + - merge_requests From d67c380f4cc78422092686d344af6fd3ef4ca802 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Wed, 19 Mar 2025 15:15:44 -0500 Subject: [PATCH 03/12] Fix memory leak in relay? --- packages/ditto/controllers/nostr/relay.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/ditto/controllers/nostr/relay.ts b/packages/ditto/controllers/nostr/relay.ts index 3690b61e..bbec9b5c 100644 --- a/packages/ditto/controllers/nostr/relay.ts +++ b/packages/ditto/controllers/nostr/relay.ts @@ -171,6 +171,10 @@ function connectStream(socket: WebSocket, ip: string | undefined, opts: ConnectS } else { const [verb, , ...rest] = msg; send([verb, subId, ...rest] as NostrRelayMsg); + + if (verb === 'CLOSED') { + break; + } } } } catch (e) { @@ -182,6 +186,7 @@ function connectStream(socket: WebSocket, ip: string | undefined, opts: ConnectS send(['CLOSED', subId, 'error: something went wrong']); } } finally { + controllers.get(subId)?.abort(); controllers.delete(subId); } } From 44c7eb72a3bb6c4efda09725f91c0f83fdd29ce4 Mon Sep 17 00:00:00 2001 From: "P. Reis" Date: Fri, 21 Mar 2025 16:56:24 -0300 Subject: [PATCH 04/12] fix: index k tag even if the value is not a number and count is less than 3 --- packages/ditto/storages/DittoPgStore.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ditto/storages/DittoPgStore.ts b/packages/ditto/storages/DittoPgStore.ts index 1c85b07c..e8a969be 100644 --- a/packages/ditto/storages/DittoPgStore.ts +++ b/packages/ditto/storages/DittoPgStore.ts @@ -85,7 +85,7 @@ export class DittoPgStore extends NPostgres { 'a': ({ count }) => count < 15, 'd': ({ event, count }) => count === 0 && NKinds.parameterizedReplaceable(event.kind), 'e': DittoPgStore.eTagCondition, - 'k': ({ count, value }) => count === 0 && Number.isInteger(Number(value)), + 'k': ({ count }) => count < 3, 'L': ({ event, count }) => event.kind === 1985 || count === 0, 'l': ({ event, count }) => event.kind === 1985 || count === 0, 'n': ({ count, value }) => count < 50 && value.length < 50, From e7cb0075b70f2ac52a3a3236dd1bab56922881ab Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Sun, 23 Mar 2025 12:11:39 -0500 Subject: [PATCH 05/12] Fix name grant notification not being rendered --- packages/ditto/views/mastodon/notifications.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/ditto/views/mastodon/notifications.ts b/packages/ditto/views/mastodon/notifications.ts index 7f71c1ea..16d1b52e 100644 --- a/packages/ditto/views/mastodon/notifications.ts +++ b/packages/ditto/views/mastodon/notifications.ts @@ -98,14 +98,14 @@ async function renderReaction(store: NStore, event: DittoEvent, opts: RenderNoti }; } -async function renderNameGrant(event: DittoEvent) { +function renderNameGrant(event: DittoEvent) { const r = event.tags.find(([name]) => name === 'r')?.[1]; const d = event.tags.find(([name]) => name === 'd')?.[1]; const name = r ?? d; - if (name) return; + if (!name) return; - const account = event.author ? await renderAccount(event.author) : await accountFromPubkey(event.pubkey); + const account = event.author ? renderAccount(event.author) : accountFromPubkey(event.pubkey); return { id: notificationId(event), From 6b084ca917d237e3ec6bdc93c1b6d5316ebba42b Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 28 Mar 2025 14:53:24 -0500 Subject: [PATCH 06/12] Add .goosehints file --- .goosehints | 43 +++++++++++++++++++++++++++++++++++++++++++ .vscode/settings.json | 5 ++++- 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 .goosehints diff --git a/.goosehints b/.goosehints new file mode 100644 index 00000000..4e17068c --- /dev/null +++ b/.goosehints @@ -0,0 +1,43 @@ +# Ditto + +This project is called Ditto, a self-hosted social media server written in TypeScript with Deno. It implements the [Nostr Protocol](https://raw.githubusercontent.com/nostr-protocol/nips/refs/heads/master/README.md), and parts of the [Mastodon API](https://docs.joinmastodon.org/methods/) and [Pleroma API](https://git.pleroma.social/pleroma/pleroma/-/raw/develop/docs/development/API/pleroma_api.md). + +## Project Structure + +Ditto is a monorepo with a `packages` directory. The main package is `packages/ditto`, and the main API definition is in `packages/ditto/app.ts`. + +## Deno, npm, and jsr + +Ditto uses Deno 2.x + +Dependencies are managed in `deno.json`, which are added with the `deno add` command. This command also updates the `deno.lock` file. npm packages can be added by using `deno add` and prefixing the package name with an `npm:` protocol. For example, `deno add npm:kysely` would add the `kysely` package from npm. + +[jsr](https://jsr.io/) is a modern alternative to npm. It's a completely different registry with different packages available. jsr packages can be added by using `deno add` and prefixing the package name with a `jsr:` protocol. For example, `deno add jsr:@std/assert` would add the `@std/assert` package from jsr. + +## Nostr + +Nostr is a decentralized social media protocol involving clients, relays, keys, and a unified Nostr event format. + +Specifications on Nostr are called "NIPs". NIP stands for "Nostr Implementation Possibilities". NIPs are numbered like `NIP-XX` where `XX` are two capitalized hexadecimal digits, eg `NIP-01` and `NIP-C7`. + +To learn about Nostr, use the fetch tool to read [NIP-01](https://raw.githubusercontent.com/nostr-protocol/nips/refs/heads/master/01.md). + +To read a specific NIP, construct the NIP URL following this template: `https://raw.githubusercontent.com/nostr-protocol/nips/refs/heads/master/{nip}.md` (replace `{nip}` in the URL template with the relevant NIP name, eg `07` for NIP-07, or `C7` for NIP-C7). Then use the fetch tool to read the URL. + +To discover the full list of NIPs, use the fetch tool to read the [NIPs README](https://raw.githubusercontent.com/nostr-protocol/nips/refs/heads/master/README.md). + +It's important that Ditto conforms to Nostr standards. Please read as much of the NIPs as you need to have a full understanding before adding or modifying Nostr events and filters. It is possible to add new ideas to Nostr that don't exist yet in the NIPs, but only after other options have been explored. Care must be taken when adding new Nostr ideas, to ensure they fit seamlessly within the existing Nostr ecosystem. + +## How Ditto uses Nostr and Mastodon API + +Ditto implements a full Nostr relay, available at `/relay` of the Ditto server. + +Mastodon API functionality, available at `/api/*, is built around the Nostr relay's storage implementation. + +Ditto's goal is to enable Mastodon API clients to interact directly with Nostr. It achieves this by implementing most of Mastodon's API, and "pretending" to be a Mastodon server to client applications, while in actuality it uses Nostr as its decentralized protocol layer. + +## Testing Changes + +After making changes, please run `deno task check` to check for type errors. If there are any type errors, please try to fix them. + +Afterwards, run `deno fmt` to format the code, and then you are done. Please do not try to run the server, or run any other tests. \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index ba5b1bb4..8a761ba9 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,5 +2,8 @@ "deno.enable": true, "deno.lint": true, "editor.defaultFormatter": "denoland.vscode-deno", - "path-intellisense.extensionOnImport": true + "path-intellisense.extensionOnImport": true, + "files.associations": { + ".goosehints": "markdown" + } } From 814d9397f5bf5b78ff037c9e8dd6fcc5883142e8 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 28 Mar 2025 16:15:20 -0500 Subject: [PATCH 07/12] NIP-11 improvements --- packages/ditto/controllers/nostr/relay-info.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/ditto/controllers/nostr/relay-info.ts b/packages/ditto/controllers/nostr/relay-info.ts index 945e311b..f9df43d0 100644 --- a/packages/ditto/controllers/nostr/relay-info.ts +++ b/packages/ditto/controllers/nostr/relay-info.ts @@ -9,6 +9,8 @@ const relayInfoController: AppController = async (c) => { const meta = await getInstanceMetadata(c.var); c.res.headers.set('access-control-allow-origin', '*'); + c.res.headers.set('access-control-allow-headers', '*'); + c.res.headers.set('access-control-allow-methods', 'GET, POST, OPTIONS'); return c.json({ name: meta.name, @@ -16,7 +18,7 @@ const relayInfoController: AppController = async (c) => { pubkey: await conf.signer.getPublicKey(), contact: meta.email, supported_nips: [1, 5, 9, 11, 16, 45, 50, 46, 98], - software: 'Ditto', + software: 'https://gitlab.com/soapbox-pub/ditto', version: denoJson.version, limitation: { auth_required: false, From 6399a2889be4ffc83e106112f2a5e9a71cce49c4 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 28 Mar 2025 16:22:03 -0500 Subject: [PATCH 08/12] Fix inline codeblock in .goosehints --- .goosehints | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.goosehints b/.goosehints index 4e17068c..f22691c7 100644 --- a/.goosehints +++ b/.goosehints @@ -32,7 +32,7 @@ It's important that Ditto conforms to Nostr standards. Please read as much of th Ditto implements a full Nostr relay, available at `/relay` of the Ditto server. -Mastodon API functionality, available at `/api/*, is built around the Nostr relay's storage implementation. +Mastodon API functionality, available at `/api/*`, is built around the Nostr relay's storage implementation. Ditto's goal is to enable Mastodon API clients to interact directly with Nostr. It achieves this by implementing most of Mastodon's API, and "pretending" to be a Mastodon server to client applications, while in actuality it uses Nostr as its decentralized protocol layer. From 5ee1fc1b7fc8eaf07cc8ad5f990e388fb0cf77e5 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 28 Mar 2025 17:50:51 -0500 Subject: [PATCH 09/12] Fix relay always sending a CLOSED message after the client sends CLOSE --- packages/ditto/controllers/nostr/relay.ts | 4 +++- packages/ditto/storages/DittoPgStore.ts | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/ditto/controllers/nostr/relay.ts b/packages/ditto/controllers/nostr/relay.ts index bbec9b5c..af233c86 100644 --- a/packages/ditto/controllers/nostr/relay.ts +++ b/packages/ditto/controllers/nostr/relay.ts @@ -165,6 +165,8 @@ function connectStream(socket: WebSocket, ip: string | undefined, opts: ConnectS try { for await (const msg of relay.req(filters, { limit: 100, signal, timeout: conf.db.timeouts.relay })) { + if (!controllers.has(subId)) break; + if (msg[0] === 'EVENT') { const [, , event] = msg; send(['EVENT', subId, purifyEvent(event)]); @@ -186,8 +188,8 @@ function connectStream(socket: WebSocket, ip: string | undefined, opts: ConnectS send(['CLOSED', subId, 'error: something went wrong']); } } finally { - controllers.get(subId)?.abort(); controllers.delete(subId); + controller.abort(); } } diff --git a/packages/ditto/storages/DittoPgStore.ts b/packages/ditto/storages/DittoPgStore.ts index e8a969be..a1499f1d 100644 --- a/packages/ditto/storages/DittoPgStore.ts +++ b/packages/ditto/storages/DittoPgStore.ts @@ -324,7 +324,7 @@ export class DittoPgStore extends NPostgres { machina.push(['EOSE', subId]); }).catch((error) => { - if (error instanceof Error && error.message.includes('timeout')) { + if (error instanceof Error && (error.name === 'TimeoutError' || error.message.includes('timeout'))) { machina.push(['CLOSED', subId, 'error: the relay could not respond fast enough']); } else { machina.push(['CLOSED', subId, 'error: something went wrong']); @@ -361,7 +361,7 @@ export class DittoPgStore extends NPostgres { yield msg; } } catch (e) { - if (e instanceof Error && e.name === 'AbortError') { + if (e instanceof Error && (e.name === 'TimeoutError' || e.message.includes('timeout'))) { yield ['CLOSED', subId, 'error: the relay could not respond fast enough']; } else { yield ['CLOSED', subId, 'error: something went wrong']; From 9355ab9b17ddbc0d24666f2141c54483505b8c1d Mon Sep 17 00:00:00 2001 From: Chad Curtis Date: Tue, 1 Apr 2025 05:41:31 -0400 Subject: [PATCH 10/12] Attempt to build ditto locally for test run target. --- .dockerignore | 12 ++++++- .gitlab-ci.yml | 78 ++++++++++++++++++++++++++++++++--------- Dockerfile.test | 27 ++++++++++++++ docker-compose.test.yml | 28 +++++++++++++++ 4 files changed, 127 insertions(+), 18 deletions(-) create mode 100644 Dockerfile.test create mode 100644 docker-compose.test.yml diff --git a/.dockerignore b/.dockerignore index 0771aee5..926a4484 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,6 +1,16 @@ +.git .env +.env.* *.cpuprofile *.swp +*.log +node_modules +cov_profile deno-test.xml -/data \ No newline at end of file +/data +Dockerfile +Dockerfile.* +docker-compose.* +.dockerignore +.gitlab-ci.yml \ No newline at end of file diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 02c565e7..4369eddb 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -5,11 +5,20 @@ default: stages: - test - - trigger-playwright-tests + - e2e-setup + - e2e-test +# Original test stage test: stage: test timeout: 2 minutes + before_script: + # Install nak for test environment + - apt-get update && apt-get install -y curl build-essential + - curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y + - . "$HOME/.cargo/env" && cargo install nak + # Generate NSEC + - export DITTO_NSEC=$(nak key generate | nak encode nsec) script: - deno fmt --check - deno task lint @@ -20,7 +29,6 @@ test: services: - postgres:16 variables: - DITTO_NSEC: nsec1zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygs4rm7hz DATABASE_URL: postgres://postgres:postgres@postgres:5432/postgres POSTGRES_HOST_AUTH_METHOD: trust RUST_BACKTRACE: 1 @@ -31,22 +39,58 @@ test: reports: junit: deno-test.xml -trigger-playwright-tests: - stage: trigger-playwright-tests - image: ubuntu:latest - before_script: - - apt update && apt install -y curl +# Start E2E environment +e2e-environment: + stage: e2e-setup + image: docker/compose:latest + services: + - docker:dind + variables: + DOCKER_HOST: tcp://docker:2375 + DOCKER_TLS_CERTDIR: "" + DOCKER_DRIVER: overlay2 script: + - docker compose -f docker-compose.test.yml up -d + # Wait for Ditto to be healthy - | - curl --request POST \ - --form "token=${PLAYWRIGHT_TRIGGER_TOKEN}" \ - --form "ref=main" \ - --form "merge_requests_events=true" \ - --form "variables[CI_PROJECT_ID]=${CI_PROJECT_ID}" \ - --form "variables[CI_MERGE_REQUEST_IID]=${CI_MERGE_REQUEST_IID}" \ - --form "variables[CI_COMMIT_SHA]=${CI_COMMIT_SHA}" \ - --form "variables[CI_COMMIT_SHORT_SHA]=${CI_COMMIT_SHORT_SHA}" \ - --form "variables[CI_COMMIT_REF_NAME]=${CI_COMMIT_REF_NAME}" \ - "https://gitlab.com/api/v4/projects/67335996/trigger/pipeline" + until docker compose -f docker-compose.test.yml ps ditto | grep -q "healthy"; do + echo "Waiting for Ditto to be ready..." + sleep 2 + done + # Generate dynamic child pipeline configuration + - | + cat > child-pipeline.yml << EOF + playwright-tests: + trigger: + project: your-group/ditto-playwright + strategy: depend + variables: + BASE_URL: http://localhost:4036 + CI_PROJECT_ID: ${CI_PROJECT_ID} + CI_MERGE_REQUEST_IID: ${CI_MERGE_REQUEST_IID} + CI_COMMIT_SHA: ${CI_COMMIT_SHA} + CI_COMMIT_SHORT_SHA: ${CI_COMMIT_SHORT_SHA} + CI_COMMIT_REF_NAME: ${CI_COMMIT_REF_NAME} + EOF + artifacts: + paths: + - child-pipeline.yml only: - merge_requests + +# Trigger child pipeline +e2e-test: + stage: e2e-test + trigger: + include: + - artifact: child-pipeline.yml + job: e2e-environment + strategy: depend + needs: + - e2e-environment + variables: + BASE_URL: http://localhost:4036 + after_script: + - docker compose -f docker-compose.test.yml down -v + only: + - merge_requests \ No newline at end of file diff --git a/Dockerfile.test b/Dockerfile.test new file mode 100644 index 00000000..002f564d --- /dev/null +++ b/Dockerfile.test @@ -0,0 +1,27 @@ +FROM denoland/deno:2.2.2 + +WORKDIR /app + +# Install curl and Rust for nak installation +RUN apt-get update && apt-get install -y \ + curl \ + jq \ + unzip \ + && rm -rf /var/lib/apt/lists/* + +# Copy the application files +COPY . . + +# Install soapbox +RUN deno task soapbox + +# Generate NSEC at build time +RUN export DITTO_NSEC=$(deno task nsec) && \ + echo "export DITTO_NSEC=$DITTO_NSEC" > /app/nsec.env + +ENV DATABASE_URL="" + +EXPOSE 4036 + +# Use array form with shell -c to properly handle the command +CMD ["/bin/sh", "-c", ". /app/nsec.env && deno run -A /app/packages/ditto/server.ts"] \ No newline at end of file diff --git a/docker-compose.test.yml b/docker-compose.test.yml new file mode 100644 index 00000000..e09a98ae --- /dev/null +++ b/docker-compose.test.yml @@ -0,0 +1,28 @@ +version: '3.8' + +services: + postgres: + image: postgres:16 + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + POSTGRES_DB: postgres + POSTGRES_HOST_AUTH_METHOD: trust + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres"] + interval: 5s + timeout: 5s + retries: 5 + + ditto: + build: + context: . + dockerfile: Dockerfile.test + environment: + - DATABASE_URL=postgres://postgres:postgres@postgres:5432/postgres + - RUST_BACKTRACE=1 + ports: + - "4036:4036" + depends_on: + postgres: + condition: service_healthy \ No newline at end of file From 5db08619febc0edca180c32c7f1b39fe8c987d72 Mon Sep 17 00:00:00 2001 From: Chad Curtis Date: Tue, 1 Apr 2025 05:55:56 -0400 Subject: [PATCH 11/12] remove goose feathers. --- .gitlab-ci.yml | 24 +++++++----------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4369eddb..8548a947 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -12,13 +12,6 @@ stages: test: stage: test timeout: 2 minutes - before_script: - # Install nak for test environment - - apt-get update && apt-get install -y curl build-essential - - curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y - - . "$HOME/.cargo/env" && cargo install nak - # Generate NSEC - - export DITTO_NSEC=$(nak key generate | nak encode nsec) script: - deno fmt --check - deno task lint @@ -29,6 +22,7 @@ test: services: - postgres:16 variables: + DITTO_NSEC: nsec1zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygs4rm7hz DATABASE_URL: postgres://postgres:postgres@postgres:5432/postgres POSTGRES_HOST_AUTH_METHOD: trust RUST_BACKTRACE: 1 @@ -50,19 +44,15 @@ e2e-environment: DOCKER_TLS_CERTDIR: "" DOCKER_DRIVER: overlay2 script: - - docker compose -f docker-compose.test.yml up -d - # Wait for Ditto to be healthy - - | - until docker compose -f docker-compose.test.yml ps ditto | grep -q "healthy"; do - echo "Waiting for Ditto to be ready..." - sleep 2 - done + - docker compose -f docker-compose.test.yml up -d --build + # Wait for ditto instance to become active + - end=$((SECONDS + 30)); while [[ $SECONDS -lt $end ]] && ! curl http://localhost:4036; do echo "Waiting for localhost:4036..."; sleep 1; echo $SECONDS ; done # Generate dynamic child pipeline configuration - | cat > child-pipeline.yml << EOF playwright-tests: trigger: - project: your-group/ditto-playwright + project: soapbox-pub/ditto-playwright strategy: depend variables: BASE_URL: http://localhost:4036 @@ -90,7 +80,7 @@ e2e-test: - e2e-environment variables: BASE_URL: http://localhost:4036 - after_script: - - docker compose -f docker-compose.test.yml down -v + # after_script: + # - docker compose -f docker-compose.test.yml down -v only: - merge_requests \ No newline at end of file From c697df24e17edbf1f7288572ef7f95ee96432b46 Mon Sep 17 00:00:00 2001 From: Chad Curtis Date: Tue, 1 Apr 2025 05:57:30 -0400 Subject: [PATCH 12/12] Final item for the night - do not ignore compose file --- .dockerignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.dockerignore b/.dockerignore index 926a4484..c35383ab 100644 --- a/.dockerignore +++ b/.dockerignore @@ -11,6 +11,5 @@ deno-test.xml /data Dockerfile Dockerfile.* -docker-compose.* .dockerignore .gitlab-ci.yml \ No newline at end of file