FROM node:20-alpine AS api-deps WORKDIR /app/solver-api COPY solver-api/package.json solver-api/package-lock.json* ./ RUN npm install FROM node:20-alpine AS gui-deps WORKDIR /app/gui-ts COPY gui-ts/package.json gui-ts/package-lock.json* ./ RUN npm install FROM alpine:3.20 AS solver-build RUN apk add --no-cache build-base WORKDIR /app COPY solver-c ./solver-c RUN SRCS="./solver-c/src/solver_common.c ./solver-c/src/json_stdin.c ./solver-c/src/trajectory.c ./solver-c/src/solver_diagnostic.c ./solver-c/src/solver.c ./solver-c/src/solver_fea.c ./solver-c/src/solver_fourier.c" \ && gcc -std=c99 -I./solver-c/include $$SRCS ./solver-c/src/main.c -lm -o ./solver-c/solver_main \ && gcc -std=c99 -I./solver-c/include $$SRCS ./solver-c/src/main_fea.c -lm -o ./solver-c/solver_fea_main \ && gcc -std=c99 -I./solver-c/include $$SRCS ./solver-c/tests/test_solver.c -lm -o ./solver-c/test_solver \ && ./solver-c/test_solver FROM node:20-alpine AS ci WORKDIR /app COPY --from=solver-build /app/solver-c ./solver-c COPY --from=api-deps /app/solver-api/node_modules ./solver-api/node_modules COPY --from=gui-deps /app/gui-ts/node_modules ./gui-ts/node_modules COPY solver-api ./solver-api COPY gui-ts ./gui-ts COPY data ./data CMD ["sh", "-c", "cd /app/solver-api && npm test && cd /app/gui-ts && npm test"]