ALL: added docker and kubernetes support

master
Martin Gerhardy 2018-10-20 21:47:54 +02:00
parent b09b2819df
commit 8317302143
10 changed files with 205 additions and 2 deletions

1
.dockerignore Normal file
View File

@ -0,0 +1 @@
/build

View File

@ -36,6 +36,7 @@ include(${SCRIPTS_CMAKE_DIR}/vogl.cmake)
include(${SCRIPTS_CMAKE_DIR}/debug.cmake)
include(${SCRIPTS_CMAKE_DIR}/googletest.cmake)
include(${SCRIPTS_CMAKE_DIR}/manifests.cmake)
include(${SCRIPTS_CMAKE_DIR}/docker.cmake)
include(${SCRIPTS_CMAKE_DIR}/lua.cmake)
include(${SCRIPTS_CMAKE_DIR}/ui.cmake)
include(${SCRIPTS_CMAKE_DIR}/macros.cmake)
@ -52,6 +53,7 @@ option(UNITTESTS_SANITIZER_ADDRESS "Builds tests with address sanitizer" OFF)
option(TOOLS "Builds with tools" ON)
option(RCON "Builds with rcon tool - also needs TOOLS to be active" ON)
option(SERVER "Builds with server" ON)
set(DOCKER_EXECUTABLE "docker" CACHE STRING "The docker cli to use for the docker target")
set(GDB_EXECUTABLE "gdb" CACHE STRING "The gnu debugger binary to use for the debug target")
set(LLDB_EXECUTABLE "lldb" CACHE STRING "The lldb binary to use for the debug target")
set(GIT_EXECUTABLE "git" CACHE STRING "The git binary to use for the update-libs target")
@ -65,9 +67,12 @@ option(USE_CPPCHECK "Enable cppcheck" OFF)
option(USE_CLANG_TIDY "Enable Clang Tidy" OFF)
set(DEBUGGER "gdb" CACHE STRING "Which debugger should be used")
set_property(CACHE DEBUGGER PROPERTY STRINGS gdb lldb)
set(SERVER_HOST "localhost" CACHE STRING "Host where the server is running on")
set(FQDN "example.com" CACHE STRING "The domain to place the services in")
set(DB_PW "engine" CACHE STRING "The database password")
set(SERVER_HOST "server-${FQDN}" CACHE STRING "Host where the server is running on")
set(SERVER_PORT "11337" CACHE STRING "Port where the server is listening on")
set(BASE_URL "http://localhost/" CACHE STRING "Base url of the http endpoints")
set(DOCKER_REGISTRY "" CACHE STRING "Docker registry")
if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
set(WINDOWS 1)
elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Android")

71
cmake/docker.cmake Normal file
View File

@ -0,0 +1,71 @@
set(DOCKER_BUILD_ARGS "" CACHE STRING "Docker cli arguments for building an image")
set(DOCKER_RUN_ARGS "" CACHE STRING "Docker cli arguments for running an image")
set(DOCKER_DELETE_IUMAGE_ARGS "" CACHE STRING "Docker cli arguments for deleting an image")
set(DOCKER_PUSH_ARGS "" CACHE STRING "Docker cli arguments for pushing an image")
#
# Adds a docker target to a project if a Dockerfile (copied) or Dockerfile.in (template) is in the directory
# The working directory is the root dir of the project.
#
# The DOCKER_IMAGE_NAME_TAG variable that is set here, must be in sync with the kubernetes manifests
#
macro(engine_docker NAME)
set(DOCKERFILE_SRC)
if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Dockerfile.in)
set(DOCKERFILE_SRC ${CMAKE_CURRENT_SOURCE_DIR}/Dockerfile.in)
configure_file(${DOCKERFILE_SRC} ${CMAKE_CURRENT_BINARY_DIR}/Dockerfile @ONLY)
elseif (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Dockerfile)
set(DOCKERFILE_SRC ${CMAKE_CURRENT_SOURCE_DIR}/Dockerfile)
configure_file(${DOCKERFILE_SRC} ${CMAKE_CURRENT_BINARY_DIR}/Dockerfile COPYONLY)
endif()
set(DOCKERFILE_TARGET ${CMAKE_CURRENT_BINARY_DIR}/Dockerfile)
if (DOCKER_REGISTRY)
set(DOCKER_IMAGE_NAME_TAG "${DOCKER_REGISTRY}/${NAME}:${ROOT_PROJECT_VERSION}")
else()
set(DOCKER_IMAGE_NAME_TAG "${NAME}:${ROOT_PROJECT_VERSION}")
endif()
if (DOCKERFILE_SRC AND DOCKER_EXECUTABLE)
add_custom_target(${NAME}-docker
COMMAND
${DOCKER_EXECUTABLE}
build
--pull
${DOCKER_BUILD_ARGS}
-t ${DOCKER_IMAGE_NAME_TAG}
.
-f - < ${DOCKERFILE_TARGET}
DEPENDS ${DOCKERFILE_TARGET}
SOURCES ${DOCKERFILE_SRC}
COMMENT "Docker image name of ${NAME} is ${DOCKER_IMAGE_NAME_TAG}"
VERBATIM
WORKING_DIRECTORY "${ROOT_DIR}"
)
add_custom_target(${NAME}-docker-run
COMMAND
${DOCKER_EXECUTABLE}
run
-it
${DOCKER_RUN_ARGS}
${DOCKER_IMAGE_NAME_TAG}
VERBATIM
DEPENDS ${NAME}-docker
)
add_custom_target(${NAME}-docker-push
COMMAND
${DOCKER_EXECUTABLE}
push
${DOCKER_PUSH_ARGS}
"${DOCKER_IMAGE_NAME_TAG}"
COMMAND
${DOCKER_EXECUTABLE}
rmi
${DOCKER_DELETE_IUMAGE_ARGS}
"${DOCKER_IMAGE_NAME_TAG}"
VERBATIM
)
endif()
endmacro()

View File

@ -10,7 +10,11 @@
# The DOCKER_IMAGE_NAME_TAG variable that is set here, must be in sync with the docker target
#
macro(engine_manifests NAME)
set(DOCKER_IMAGE_NAME_TAG "${NAME}:${ROOT_PROJECT_VERSION}")
if (DOCKER_REGISTRY)
set(DOCKER_IMAGE_NAME_TAG "${DOCKER_REGISTRY}/${NAME}:${ROOT_PROJECT_VERSION}")
else()
set(DOCKER_IMAGE_NAME_TAG "${NAME}:${ROOT_PROJECT_VERSION}")
endif()
foreach (FILEPATH ${ARGN})
get_filename_component(FILENAME ${FILEPATH} NAME_WE)
configure_file(${FILEPATH} ${CMAKE_CURRENT_BINARY_DIR}/deployment/${FILENAME}.yaml)

View File

@ -15,6 +15,14 @@ set(LUA_SRCS
map/map001.lua
)
set(FILES)
set(MANIFESTS
deployment/deployment.yaml.in
deployment/route.yaml.in
deployment/service.yaml.in
deployment/secrets.yaml.in
)
engine_add_executable(TARGET ${PROJECT_NAME} SRCS ${SRCS} FILES ${FILES} LUA_SRCS ${LUA_SRCS})
engine_target_link_libraries(TARGET ${PROJECT_NAME} DEPENDENCIES backend)
engine_docker(${PROJECT_NAME})
engine_manifests(${PROJECT_NAME} ${MANIFESTS})

32
src/server/Dockerfile.in Normal file
View File

@ -0,0 +1,32 @@
FROM debian:buster as builder
MAINTAINER Martin Gerhardy <martin.gerhardy@gmail.com>
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update -q && apt-get install -y cmake g++ pkg-config \
libpq-dev opencl-c-headers libcurl4-openssl-dev \
libsdl2-dev zlib1g-dev libuv1-dev
COPY contrib /tmp/@ROOT_PROJECT_NAME@/contrib
COPY tools /tmp/@ROOT_PROJECT_NAME@/tools
COPY cmake /tmp/@ROOT_PROJECT_NAME@/cmake
COPY data /tmp/@ROOT_PROJECT_NAME@/data
COPY src /tmp/@ROOT_PROJECT_NAME@/src
COPY CMakeLists.txt /tmp/@ROOT_PROJECT_NAME@/
RUN mkdir /tmp/@ROOT_PROJECT_NAME@/build
RUN cmake -H/tmp/@ROOT_PROJECT_NAME@ -B/tmp/@ROOT_PROJECT_NAME@/build -DUNITTESTS=OFF -DVISUALTESTS=OFF -DTOOLS=OFF -DSERVER=ON -DRCON=OFF -DCMAKE_INSTALL_PREFIX=installation
RUN make -C /tmp/@ROOT_PROJECT_NAME@/build -j $(nproc) server
FROM debian:buster
RUN apt-get update -q && \
apt-get install -y libatomic1 libcurl4 zlib1g libuv1 libpq5 libsdl2-2.0.0 && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
COPY --from=builder /tmp/@ROOT_PROJECT_NAME@/build/@PROJECT_NAME@ /opt/@ROOT_PROJECT_NAME@/
EXPOSE @SERVER_PORT@
WORKDIR /opt/@ROOT_PROJECT_NAME@
ENTRYPOINT ./@ROOT_PROJECT_NAME@-@PROJECT_NAME@

View File

@ -0,0 +1,48 @@
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: @PROJECT_NAME@-deployment
spec:
replicas: 1
selector:
matchLabels:
app: @PROJECT_NAME@
template:
metadata:
labels:
app: @PROJECT_NAME@
spec:
containers:
- name: @PROJECT_NAME@
image: @DOCKER_IMAGE_NAME_TAG@
ports:
- name: service-port
containerPort: @SERVER_PORT@
env:
- name: DB_HOST
value: postgres-@FQDN@
livenessProbe:
failureThreshold: 3
exec:
command:
- /opt/@ROOT_PROJECT_NAME@/vengi-@PROJECT_NAME@-healthcheck
initialDelaySeconds: 30
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 5
readinessProbe:
failureThreshold: 3
exec:
command:
- /opt/@ROOT_PROJECT_NAME@/vengi-@PROJECT_NAME@-healthcheck
initialDelaySeconds: 30
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 5
resources:
requests:
memory: 256Mi
cpu: 1000m
limits:
memory: 4096Mi
cpu: 10000m

View File

@ -0,0 +1,14 @@
apiVersion: v1
kind: Route
metadata:
name: @PROJECT_NAME@-route
spec:
host: @PROJECT_NAME@-@FQDN@
port:
targetPort: tcp
tls:
insecureEdgeTerminationPolicy: Allow
termination: edge
to:
kind: Service
name: @PROJECT_NAME@

View File

@ -0,0 +1,8 @@
apiVersion: v1
kind: Secret
metadata:
name: database-credentials
type: Opaque
data:
DB_PW: >-
@DB_PW@

View File

@ -0,0 +1,12 @@
apiVersion: v1
kind: Service
metadata:
name: @PROJECT_NAME@
spec:
ports:
- name: tcp
port: @SERVER_PORT@
protocol: TCP
targetPort: @SERVER_PORT@
selector:
app: @PROJECT_NAME@