Skip to content

Commit

Permalink
chore: 개발/테스트용 docker 구성
Browse files Browse the repository at this point in the history
- rabbitmq에 queue/exchange 자동 적용
- testcase server 추가
- .env는 초기값 유지 목적으로 커밋. 추후 gitignore에 추가
- main에 환경변수 기본값 수정
- testcase-server의 testcaes get routing 경로 수정
  • Loading branch information
cranemont committed Feb 7, 2023
1 parent c606e1e commit 3136a29
Show file tree
Hide file tree
Showing 8 changed files with 144 additions and 79 deletions.
21 changes: 21 additions & 0 deletions .env
Original file line number Diff line number Diff line change
@@ -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
58 changes: 19 additions & 39 deletions Dockerfile-deploy → Dockerfile
Original file line number Diff line number Diff line change
@@ -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 \
Expand All @@ -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/
Expand Down
34 changes: 0 additions & 34 deletions docker-compose.deploy.yml

This file was deleted.

70 changes: 70 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -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}
8 changes: 4 additions & 4 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand Down
5 changes: 4 additions & 1 deletion scripts/entrypoint.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
#!/bin/sh
set -ex

/app/server
while ! nc -z "$RABBITMQ_HOST" "$RABBITMQ_PORT"; do sleep 3; done
>&2 echo "rabbitmq is up - server running..."

/app/main
25 changes: 25 additions & 0 deletions scripts/rabbitmq-setup.sh
Original file line number Diff line number Diff line change
@@ -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

2 changes: 1 addition & 1 deletion tests/testcase-server/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
Expand Down

0 comments on commit 3136a29

Please sign in to comment.