From 3136a2944c6345edeb377df9303b363131da175f Mon Sep 17 00:00:00 2001 From: coc0a25 Date: Tue, 7 Feb 2023 16:44:49 +0900 Subject: [PATCH] =?UTF-8?q?chore:=20=EA=B0=9C=EB=B0=9C/=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EC=9A=A9=20docker=20=EA=B5=AC=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - rabbitmq에 queue/exchange 자동 적용 - testcase server 추가 - .env는 초기값 유지 목적으로 커밋. 추후 gitignore에 추가 - main에 환경변수 기본값 수정 - testcase-server의 testcaes get routing 경로 수정 --- .env | 21 ++++++++++ Dockerfile-deploy => Dockerfile | 58 +++++++++------------------ docker-compose.deploy.yml | 34 ---------------- docker-compose.yml | 70 +++++++++++++++++++++++++++++++++ main.go | 8 ++-- scripts/entrypoint.sh | 5 ++- scripts/rabbitmq-setup.sh | 25 ++++++++++++ tests/testcase-server/main.go | 2 +- 8 files changed, 144 insertions(+), 79 deletions(-) create mode 100644 .env rename Dockerfile-deploy => Dockerfile (51%) delete mode 100644 docker-compose.deploy.yml create mode 100644 docker-compose.yml create mode 100755 scripts/rabbitmq-setup.sh diff --git a/.env b/.env new file mode 100644 index 0000000..e987879 --- /dev/null +++ b/.env @@ -0,0 +1,21 @@ +# RABBITMQ +RABBITMQ_HOST=rabbitmq +RABBITMQ_PORT=5672 +RABBITMQ_ADMIN_PORT=15672 +RABBITMQ_DEFAULT_USER=skku +RABBITMQ_DEFAULT_PASS=1234 + +JUDGE_EXCHANGE_NAME=iris.e.direct.judge +JUDGE_SUBMISSION_QUEUE_NAME=client.q.judge.submission +JUDGE_SUBMISSION_ROUTING_KEY=judge.submission +JUDGE_RESULT_QUEUE_NAME=iris.q.judge.result +JUDGE_RESULT_ROUTING_KEY=judge.result + +# IRIS +RABBITMQ_CONSUMER_CONNECTION_NAME=iris-consumer +RABBITMQ_CONSUMER_TAG=consumer +RABBITMQ_PRODUCER_CONNECTION_NAME=iris-producer + +# REDIS +REDIS_HOST=redis +REDIS_PORT=6379 \ No newline at end of file diff --git a/Dockerfile-deploy b/Dockerfile similarity index 51% rename from Dockerfile-deploy rename to Dockerfile index 27d319c..2543dca 100644 --- a/Dockerfile-deploy +++ b/Dockerfile @@ -1,49 +1,22 @@ -FROM ubuntu:20.04 AS base - -COPY sources.list /etc/apt/ -ENV TZ=Asia/Seoul -RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone - - -####################### -## Install libjudger ## -####################### -FROM base AS build-judger - -WORKDIR /build -COPY ./libjudger ./ - -RUN apt-get update && apt-get -y install libseccomp-dev cmake -RUN cmake CMakeLists.txt && make && make install - - -####################### -## Install go server ## -####################### -FROM golang:1.19-alpine AS build-server +### SERVER ### +FROM golang:1.20-alpine as build WORKDIR /build - COPY . . + RUN go mod vendor -RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o bin/server +RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o main ./main.go +### PRODUCTION ### +FROM ubuntu:20.04 -#################### -## for production ## -#################### -FROM base AS production +COPY sources.list /etc/apt/ +ENV TZ=Asia/Seoul +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone WORKDIR /app -RUN mkdir -p sandbox/policy \ - && mkdir sandbox/results\ - && mkdir -p sandbox/logs/run \ - && mkdir -p sandbox/logs/compile - -COPY libjudger/java_policy sandbox/policy/ - RUN buildDeps='software-properties-common curl' \ - && apt-get update && apt-get install -y $buildDeps \ + && apt-get update && apt-get install -y $buildDeps netcat \ && add-apt-repository ppa:deadsnakes/ppa \ && curl -sL https://deb.nodesource.com/setup_16.x | bash -E - \ && apt-get update && apt-get install -y \ @@ -56,8 +29,15 @@ RUN buildDeps='software-properties-common curl' \ && apt-get purge -y --auto-remove $buildDeps \ && apt-get clean && rm -rf /var/lib/apt/lists/* -COPY --from=build-judger /build/output/libjudger.so ./sandbox/ -COPY --from=build-server /build/bin/server . + +RUN mkdir -p sandbox/policy \ + && mkdir sandbox/results\ + && mkdir -p sandbox/logs/run \ + && mkdir -p sandbox/logs/compile + +COPY lib/java_policy sandbox/policy/ +COPY lib/libjudger.so ./sandbox/ +COPY --from=build /build/main . ENV APP_ENV=production COPY ./scripts/entrypoint.sh /app/ diff --git a/docker-compose.deploy.yml b/docker-compose.deploy.yml deleted file mode 100644 index d02fcb7..0000000 --- a/docker-compose.deploy.yml +++ /dev/null @@ -1,34 +0,0 @@ -version: "3" -services: - judge-manager-deploy: - container_name: judge-manager-dev - image: coc0a25/judge-manager:dev - stdin_open: true - tty: true - environment: - - TESTCASE_SERVER_URL=http://host.docker.internal:3000/testcase/problem/ - - TESTCASE_SERVER_AUTH_TOKEN=AUTH_TOKEN - - REDIS_HOST=redis - - REDIS_PORT=6379 - - RABBITMQ_DEFAULT_USER=skku - - RABBITMQ_DEFAULT_PASS=1234 - - RABBITMQ_HOST=rabbitmq - - RABBITMQ_PORT=5672 - cpuset: "0,1,2" - - redis: - container_name: redis-dev - image: redis:alpine - ports: - - 6379:6379 - - rabbitmq: - image: rabbitmq:3-management-alpine - container_name: rabbitmq-dev - ports: - - 5672:5672 - - 15672:15672 - environment: - - RABBITMQ_ERLANG_COOKIE=RabbitMQ-My-Cookies - - RABBITMQ_DEFAULT_USER=skku - - RABBITMQ_DEFAULT_PASS=1234 diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..0dd555c --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,70 @@ +version: "3" +services: + app: + container_name: iris + image: iris:test + profiles: + - e2e-test + depends_on: + - rabbitmq + stdin_open: true + tty: true + environment: + TESTCASE_SERVER_URL: http://testcase-server:30000/testcase/problem + TESTCASE_SERVER_AUTH_TOKEN: AUTH_TOKEN + REDIS_HOST: ${REDIS_HOST} + REDIS_PORT: ${REDIS_PORT} + RABBITMQ_DEFAULT_USER: ${RABBITMQ_DEFAULT_USER} + RABBITMQ_DEFAULT_PASS: ${RABBITMQ_DEFAULT_PASS} + RABBITMQ_HOST: ${RABBITMQ_HOST} + RABBITMQ_PORT: ${RABBITMQ_PORT} + RABBITMQ_CONSUMER_CONNECTION_NAME: ${RABBITMQ_CONSUMER_CONNECTION_NAME} + RABBITMQ_CONSUMER_QUEUE_NAME: ${JUDGE_SUBMISSION_QUEUE_NAME} + RABBITMQ_CONSUMER_TAG: ${RABBITMQ_CONSUMER_TAG} + RABBITMQ_PRODUCER_CONNECTION_NAME: ${RABBITMQ_PRODUCER_CONNECTION_NAME} + RABBITMQ_PRODUCER_EXCHANGE_NAME: ${JUDGE_EXCHANGE_NAME} + RABBITMQ_PRODUCER_ROUTING_KEY: ${JUDGE_RESULT_ROUTING_KEY} + + testcase-server: + container_name: testcase-server + image: testcase-server:test + stdin_open: true + tty: true + ports: + - 20000:30000 + + redis: + container_name: ${REDIS_HOST} + image: redis:alpine + ports: + - 6379:6379 + + setup: + image: python:3.8-alpine + depends_on: + - rabbitmq + volumes: + - ./scripts/rabbitmq-setup.sh:/setup.sh + environment: + RABBITMQ_HOST: ${RABBITMQ_HOST} + RABBITMQ_PORT: ${RABBITMQ_PORT} + JUDGE_EXCHANGE_NAME: ${JUDGE_EXCHANGE_NAME} + JUDGE_SUBMISSION_QUEUE_NAME: ${JUDGE_SUBMISSION_QUEUE_NAME} + JUDGE_SUBMISSION_ROUTING_KEY: ${JUDGE_SUBMISSION_ROUTING_KEY} + JUDGE_RESULT_QUEUE_NAME: ${JUDGE_RESULT_QUEUE_NAME} + JUDGE_RESULT_ROUTING_KEY: ${JUDGE_RESULT_ROUTING_KEY} + entrypoint: + - /setup.sh + + rabbitmq: + image: rabbitmq:3-management-alpine + container_name: ${RABBITMQ_HOST} + expose: + - ${RABBITMQ_PORT} + ports: + - 5672:5672 + - ${RABBITMQ_ADMIN_PORT}:15672 + environment: + RABBITMQ_ERLANG_COOKIE: RabbitMQ-My-Cookies + RABBITMQ_DEFAULT_USER: ${RABBITMQ_DEFAULT_USER} + RABBITMQ_DEFAULT_PASS: ${RABBITMQ_DEFAULT_PASS} diff --git a/main.go b/main.go index 0754cc8..dc59fa1 100644 --- a/main.go +++ b/main.go @@ -77,14 +77,14 @@ func main() { connector.Providers{Router: routeProvider, Logger: logProvider}, rabbitmq.ConsumerConfig{ AmqpURI: uri, - ConnectionName: utils.Getenv("RABBITMQ_CONSUMER_CONNECTION_NAME", "go-consumer"), - QueueName: utils.Getenv("RABBITMQ_CONSUMER_QUEUE_NAME", "iris.q.judge.submission"), + ConnectionName: utils.Getenv("RABBITMQ_CONSUMER_CONNECTION_NAME", "iris-consumer"), + QueueName: utils.Getenv("RABBITMQ_CONSUMER_QUEUE_NAME", "client.q.judge.submission"), Ctag: utils.Getenv("RABBITMQ_CONSUMER_TAG", "consumer-tag"), }, rabbitmq.ProducerConfig{ AmqpURI: uri, - ConnectionName: utils.Getenv("RABBITMQ_PRODUCER_CONNECTION_NAME", "go-producer"), - ExchangeName: utils.Getenv("RABBITMQ_PRODUCER_QUEUE_NAME", "iris.e.direct.judge.result"), + ConnectionName: utils.Getenv("RABBITMQ_PRODUCER_CONNECTION_NAME", "iris-producer"), + ExchangeName: utils.Getenv("RABBITMQ_PRODUCER_EXCHANGE_NAME", "iris.e.direct.judge"), RoutingKey: utils.Getenv("RABBITMQ_PRODUCER_ROUTING_KEY", "judge.result"), }, ).Connect(context.Background()) diff --git a/scripts/entrypoint.sh b/scripts/entrypoint.sh index 3fe6a58..20410fa 100644 --- a/scripts/entrypoint.sh +++ b/scripts/entrypoint.sh @@ -1,4 +1,7 @@ #!/bin/sh set -ex -/app/server \ No newline at end of file +while ! nc -z "$RABBITMQ_HOST" "$RABBITMQ_PORT"; do sleep 3; done +>&2 echo "rabbitmq is up - server running..." + +/app/main \ No newline at end of file diff --git a/scripts/rabbitmq-setup.sh b/scripts/rabbitmq-setup.sh new file mode 100755 index 0000000..2b57c75 --- /dev/null +++ b/scripts/rabbitmq-setup.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +while ! nc -z "$RABBITMQ_HOST" "$RABBITMQ_PORT"; do sleep 3; done +>&2 echo "rabbitmq is up - server running..." + +# install rabbitmqadmin +wget http://rabbitmq:15672/cli/rabbitmqadmin +chmod +x rabbitmqadmin + +# Make an Exchange +./rabbitmqadmin -H rabbitmq -u skku -p 1234 declare exchange name="$JUDGE_EXCHANGE_NAME" type=direct + +# Make queues +./rabbitmqadmin -H rabbitmq -u skku -p 1234 declare queue name="$JUDGE_RESULT_QUEUE_NAME" durable=true +./rabbitmqadmin -H rabbitmq -u skku -p 1234 declare queue name="$JUDGE_SUBMISSION_QUEUE_NAME" durable=true + +# Make bindings +./rabbitmqadmin -H rabbitmq -u skku -p 1234 declare binding source="$JUDGE_EXCHANGE_NAME"\ + destination_type=queue destination="$JUDGE_RESULT_QUEUE_NAME" routing_key="$JUDGE_RESULT_ROUTING_KEY" +./rabbitmqadmin -H rabbitmq -u skku -p 1234 declare binding source="$JUDGE_EXCHANGE_NAME"\ + destination_type=queue destination="$JUDGE_SUBMISSION_QUEUE_NAME" routing_key="$JUDGE_SUBMISSION_ROUTING_KEY" + + +rm rabbitmqadmin + diff --git a/tests/testcase-server/main.go b/tests/testcase-server/main.go index f6a741e..6adfd04 100644 --- a/tests/testcase-server/main.go +++ b/tests/testcase-server/main.go @@ -16,7 +16,7 @@ func main() { responser := response.NewResponser() testcaseHandler := handler.NewTestcaseHandler(responser) - r.Handle(method.GET, "/problem/:id/testcase", + r.Handle(method.GET, "/testcase/problem/:id", middleware.Adapt( testcaseHandler, middleware.SetJsonContentType(),