From b8610b62182281d6c55f2475fc756d161bc3dd66 Mon Sep 17 00:00:00 2001 From: Mikilio Date: Sat, 19 Jul 2025 20:55:20 +0200 Subject: [PATCH 1/3] chore: validate CI --- client/trigger | 0 embedding-bridge/trigger | 0 nix/checks/podman/default.nix | 2 -- schedule-manager/trigger | 0 scraper/trigger | 0 5 files changed, 2 deletions(-) create mode 100644 client/trigger create mode 100644 embedding-bridge/trigger create mode 100644 schedule-manager/trigger create mode 100644 scraper/trigger diff --git a/client/trigger b/client/trigger new file mode 100644 index 00000000..e69de29b diff --git a/embedding-bridge/trigger b/embedding-bridge/trigger new file mode 100644 index 00000000..e69de29b diff --git a/nix/checks/podman/default.nix b/nix/checks/podman/default.nix index 5a65a822..0a1e7a26 100644 --- a/nix/checks/podman/default.nix +++ b/nix/checks/podman/default.nix @@ -32,8 +32,6 @@ machine.copy_from_host( "${./env.txt}", ".env") machine.succeed("docker compose pull") machine.succeed("docker compose up -d") - machine.succeed('${pkgs.chromium}/bin/chromium --headless --disable-gpu --dump-dom http://localhost:3000 > /tmp/page.html') - machine.succeed('grep "Select Study Program" /tmp/page.html') machine.sleep(20) output = machine.succeed("docker ps -a --format '{{.Names}} {{.Status}}'").strip().splitlines() diff --git a/schedule-manager/trigger b/schedule-manager/trigger new file mode 100644 index 00000000..e69de29b diff --git a/scraper/trigger b/scraper/trigger new file mode 100644 index 00000000..e69de29b From ae01e325704158c69eaea03d3ec9ff2a55c11012 Mon Sep 17 00:00:00 2001 From: Florian Nalu Adam <64063379+FlorianNAdam@users.noreply.github.com> Date: Sat, 19 Jul 2025 21:02:09 +0200 Subject: [PATCH 2/3] fix swagger-ui for scraper and schedule-manager docker images (#101) --- schedule-manager/build.gradle.kts | 2 ++ .../controller/OpenApiSpecController.kt | 15 +++++++++------ scraper/build.gradle.kts | 2 ++ .../scraper/controller/OpenApiSpecController.kt | 15 +++++++++------ 4 files changed, 22 insertions(+), 12 deletions(-) diff --git a/schedule-manager/build.gradle.kts b/schedule-manager/build.gradle.kts index 2616f1e4..a1e6fefe 100644 --- a/schedule-manager/build.gradle.kts +++ b/schedule-manager/build.gradle.kts @@ -125,6 +125,8 @@ tasks.register( )) } +tasks.processResources { from("$projectDir/openapi.yaml") { into(".") } } + tasks.test { useJUnitPlatform() } tasks.named("compileKotlin") { diff --git a/schedule-manager/src/main/kotlin/com/nixops/schedulemanager/controller/OpenApiSpecController.kt b/schedule-manager/src/main/kotlin/com/nixops/schedulemanager/controller/OpenApiSpecController.kt index 6dc1558a..8150d6cc 100644 --- a/schedule-manager/src/main/kotlin/com/nixops/schedulemanager/controller/OpenApiSpecController.kt +++ b/schedule-manager/src/main/kotlin/com/nixops/schedulemanager/controller/OpenApiSpecController.kt @@ -1,8 +1,8 @@ package com.nixops.schedulemanager.controller -import java.io.File -import org.springframework.core.io.FileSystemResource +import org.springframework.core.io.ClassPathResource import org.springframework.core.io.Resource +import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController @@ -10,9 +10,12 @@ import org.springframework.web.bind.annotation.RestController class OpenApiSpecController { @RequestMapping("/api-docs.yaml", produces = ["application/yaml"]) - fun getOpenApiYaml(): Resource { - val file = File("openapi.yaml") - println("Trying to serve: ${file.absolutePath} exists: ${file.exists()}") - return FileSystemResource(file) + fun getOpenApiYaml(): ResponseEntity { + val resource = ClassPathResource("openapi.yaml") + return if (resource.exists()) { + ResponseEntity.ok(resource) + } else { + ResponseEntity.notFound().build() + } } } diff --git a/scraper/build.gradle.kts b/scraper/build.gradle.kts index 7fbb6d0d..fa8e9cf8 100644 --- a/scraper/build.gradle.kts +++ b/scraper/build.gradle.kts @@ -94,6 +94,8 @@ tasks.openApiGenerate { skipValidateSpec.set(true) } +tasks.processResources { from("$projectDir/openapi.yaml") { into(".") } } + tasks.named("compileKotlin") { dependsOn("openApiGenerate") } tasks.test { useJUnitPlatform { excludeTags("remoteApi") } } diff --git a/scraper/src/main/kotlin/com/nixops/scraper/controller/OpenApiSpecController.kt b/scraper/src/main/kotlin/com/nixops/scraper/controller/OpenApiSpecController.kt index 931c7be6..82d920cf 100644 --- a/scraper/src/main/kotlin/com/nixops/scraper/controller/OpenApiSpecController.kt +++ b/scraper/src/main/kotlin/com/nixops/scraper/controller/OpenApiSpecController.kt @@ -1,8 +1,8 @@ package com.nixops.scraper.controller -import java.io.File -import org.springframework.core.io.FileSystemResource +import org.springframework.core.io.ClassPathResource import org.springframework.core.io.Resource +import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController @@ -10,9 +10,12 @@ import org.springframework.web.bind.annotation.RestController class OpenApiSpecController { @RequestMapping("/api-docs.yaml", produces = ["application/yaml"]) - fun getOpenApiYaml(): Resource { - val file = File("openapi.yaml") - println("Trying to serve: ${file.absolutePath} exists: ${file.exists()}") - return FileSystemResource(file) + fun getOpenApiYaml(): ResponseEntity { + val resource = ClassPathResource("openapi.yaml") + return if (resource.exists()) { + ResponseEntity.ok(resource) + } else { + ResponseEntity.notFound().build() + } } } From 811b36584caa66b4f7614a52e0ede8648f7da396 Mon Sep 17 00:00:00 2001 From: Mikilio Date: Sat, 19 Jul 2025 20:55:20 +0200 Subject: [PATCH 3/3] feat: browser tests feat: browser tests --- nix/checks/podman/default.nix | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/nix/checks/podman/default.nix b/nix/checks/podman/default.nix index 0a1e7a26..0a694e42 100644 --- a/nix/checks/podman/default.nix +++ b/nix/checks/podman/default.nix @@ -26,6 +26,24 @@ testScript = #python '' + def launch_browser(): + """Launches the web browser with the correct options.""" + # Determine the name of the binary: + binary = ${pkgs.chromium}/bin/chromium + # Add optional CLI options: + options = [] + if major_version > "95" and not pname.startswith("google-chrome"): + # Workaround to avoid a GPU crash: + options.append("--use-gl=swiftshader") + # Launch the process: + options.append("http://localhost:3000") + machine.succeed(ru(f'ulimit -c unlimited; {binary} {shlex.join(options)} >&2 & disown')) + if binary.startswith("google-chrome"): + # Need to click away the first window: + machine.wait_for_text("Make Google Chrome the default browser") + machine.screenshot("google_chrome_default_browser_prompt") + machine.send_key("ret") + machine.wait_for_unit("multi-user.target") machine.succeed("cd") machine.succeed("curl -L https://raw.githubusercontent.com/AET-DevOps25/team-nixops/refs/heads/main/docker-compose.yml -o docker-compose.yml") @@ -33,6 +51,8 @@ machine.succeed("docker compose pull") machine.succeed("docker compose up -d") + launch_browser() + machine.sleep(20) output = machine.succeed("docker ps -a --format '{{.Names}} {{.Status}}'").strip().splitlines()