Merge branch '26-restructure' into develop
						commit
						bffbb61124
					
				|  | @ -1,7 +1,7 @@ | |||
| #!/usr/bin/env bash | ||||
| 
 | ||||
| # This hook lints the code, and if we're on develop or master, also forces the tests to pass. | ||||
| make lint &> /dev/null 2>&1 || { | ||||
| ./fejctl lint &> /dev/null 2>&1 || { | ||||
|     >&2 echo "Format check failed, use 'make lint' for more information."; | ||||
|     exit 1; | ||||
| } | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ authors = ["Jef Roosens <roosensjef@gmail.com>"] | |||
| edition = "2018" | ||||
| 
 | ||||
| [lib] | ||||
| name = "fej_lib" | ||||
| name = "fej" | ||||
| src = "src/lib.rs" | ||||
| test = true | ||||
| bench = true | ||||
|  | @ -13,8 +13,8 @@ doc = true | |||
| doctest = true | ||||
| 
 | ||||
| [[bin]] | ||||
| name = "fej" | ||||
| src = "src/main.rs" | ||||
| name = "server" | ||||
| src = "src/bin/server/main.rs" | ||||
| test = false | ||||
| bench = false | ||||
| doc = false | ||||
|  |  | |||
							
								
								
									
										76
									
								
								Makefile
								
								
								
								
							
							
						
						
									
										76
									
								
								Makefile
								
								
								
								
							|  | @ -1,76 +0,0 @@ | |||
| all: debug | ||||
| .PHONY: all | ||||
| 
 | ||||
| # Builds the debug release inside the Alpine container. For build caching, two
 | ||||
| # volumes are used named `fej_build-cache` and `fej_registry-cache`. These
 | ||||
| # images are automatically created for you if they don't exist. If you
 | ||||
| # encounter any strange build errors, you can try removing this volumes to
 | ||||
| # start a completely fresh build.
 | ||||
| debug: | ||||
| 	@ ./build -m dev -a run build | ||||
| .PHONY: debug | ||||
| 
 | ||||
| # Builds the release version. In contrary to the debug version, this build
 | ||||
| # doesn't use volumes for caching, as this would require the build to happen
 | ||||
| # during runtime instead of during the building of the image. Instead, it uses
 | ||||
| # the new `--mount` feature from Buildkit. This does mean that only very recent
 | ||||
| # Docker engines can build the release version (in my case, at the time of
 | ||||
| # writing this, 20.10.5).
 | ||||
| release: | ||||
| 	@ ./build -m rel | ||||
| .PHONY: release | ||||
| 
 | ||||
| # This builds the release version, and pushes all relevant tags to my Docker
 | ||||
| # Hub repository, namely chewingbever/fej
 | ||||
| push: | ||||
| 	@ ./build -m rel -a push | ||||
| .PHONY: push | ||||
| 
 | ||||
| # This builds the debug release, and runs it detached. The reason we detach the
 | ||||
| # container is because Rocket has a tendency to ignore ctlr-c when inside a
 | ||||
| # container, which gets annoying really fast.
 | ||||
| run: | ||||
| 	@ ./build -m dev -a run | ||||
| .PHONY: run | ||||
| 
 | ||||
| # As a workaround, we just have a stop command that stops the container.
 | ||||
| stop: | ||||
| 	@ docker stop -t 2 fej | ||||
| 	@ docker stop fej_db | ||||
| .PHONY: stop | ||||
| 
 | ||||
| # This attaches to the running container, essentially giving the same result as
 | ||||
| # just running `cargo run` locally.
 | ||||
| logs: | ||||
| 	@ docker logs -f fej | ||||
| .PHONY: logs | ||||
| 
 | ||||
| # This just starts up a shell inside the fej container
 | ||||
| sh: | ||||
| 	@ docker exec -it fej sh | ||||
| .PHONY: sh | ||||
| 
 | ||||
| # Starts a psql session in the database container
 | ||||
| dbsh: | ||||
| 	@ docker exec -it fej_db psql -U fej -d fej | ||||
| 
 | ||||
| # Builds the debug version, and runs the tests (but doesn't detach).
 | ||||
| test: | ||||
| 	@ ./build -m dev -a run -l -- test --no-fail-fast | ||||
| .PHONY: test | ||||
| 
 | ||||
| # Runs the cargo code formatter on your code.
 | ||||
| format: | ||||
| 	@ cargo fmt | ||||
| .PHONY: format | ||||
| 
 | ||||
| # Lints your code. This also gets run in the pre-commit hook, basically
 | ||||
| # preventing you from committing badly-formatted code.
 | ||||
| lint: | ||||
| 	@ cargo fmt -- --check | ||||
| .PHONY: lint | ||||
| 
 | ||||
| # This builds the documentation for the project, excluding the documentation.
 | ||||
| docs: | ||||
| 	@ cargo doc --no-deps | ||||
| .PHONY: docs | ||||
							
								
								
									
										108
									
								
								build
								
								
								
								
							
							
						
						
									
										108
									
								
								build
								
								
								
								
							|  | @ -1,108 +0,0 @@ | |||
| #!/usr/bin/env bash | ||||
| 
 | ||||
| image="chewingbever/fej" | ||||
| # Should be either dev or rel | ||||
| mode="dev" | ||||
| action="" | ||||
| attach="--detach" | ||||
| 
 | ||||
| while getopts ":i:m:a:l" c; do | ||||
|     case $c in | ||||
|         i ) image="$OPTARG" ;; | ||||
|         m ) mode="$OPTARG" ;; | ||||
|         a ) action="$OPTARG" ;; | ||||
|         l ) attach="" ;; | ||||
|         ? ) exit 1 ;; | ||||
|     esac | ||||
| done | ||||
| shift $((OPTIND-1)) | ||||
| 
 | ||||
| # Extract current version from Cargo.toml & get current branch | ||||
| patch_version=`grep -Po '(?<=version = ").*(?=")' Cargo.toml | head -n1` | ||||
| major_version=`echo "$patch_version" | sed -E 's/([0-9]+)\.([0-9]+)\.([0-9]+)/\1/'` | ||||
| minor_version=`echo "$patch_version" | sed -E 's/([0-9]+).([0-9]+).([0-9]+)/\1.\2/'` | ||||
| branch=`git rev-parse --abbrev-ref HEAD` | ||||
| 
 | ||||
| if [[ "$branch" = "master" ]]; then | ||||
|     tags=("$patch_version" "$minor_version" "$major_version" "latest") | ||||
| 
 | ||||
| elif [[ "$branch" = "develop" ]]; then | ||||
|     tags=("$patch_version-dev" "$minor_version-dev" "$major_version-dev" "dev") | ||||
| 
 | ||||
| else | ||||
|     tags=("$branch") | ||||
| 
 | ||||
| fi | ||||
| 
 | ||||
| # First, we build the builder | ||||
| DOCKER_BUILDKIT=1 docker build -f docker/Dockerfile.builder -t "$image-builder:latest" . | ||||
| 
 | ||||
| # Run the actual build command | ||||
| if [ "$mode" = "rel" ]; then | ||||
|     DOCKER_BUILDKIT=1 docker build -t "$image:$tags" -f docker/Dockerfile.rel . | ||||
| 
 | ||||
| elif [[ "$mode" = "dev" ]]; then | ||||
|     DOCKER_BUILDKIT=1 docker build -t "$image-dev:$tags" -f docker/Dockerfile.dev . | ||||
| 
 | ||||
| else | ||||
|     >&2 echo "Invalid mode." | ||||
|     exit 1 | ||||
| 
 | ||||
| fi | ||||
| 
 | ||||
| if [[ "$action" = push ]]; then | ||||
|     [[ "$branch" =~ ^develop|master$ ]] || { | ||||
|         >&2 echo "You can only push from develop or master." | ||||
|         exit 2 | ||||
|     } | ||||
| 
 | ||||
|     [[ "$mode" = "rel" ]] || { | ||||
|         >&2 echo "You can only push release builds." | ||||
|         exit 3 | ||||
|     } | ||||
| 
 | ||||
|     for tag in "${tags[@]}"; do | ||||
|         # Create the tag | ||||
|         docker tag "$image:$tags" "$image:$tag" | ||||
| 
 | ||||
|         # Push the tag | ||||
|         docker push "$image:$tag" | ||||
| 
 | ||||
|         # Remove the tag again, if it's not the main tag | ||||
|         [[ "$tag" != "$tags" ]] && docker rmi "$image:$tag" | ||||
|     done | ||||
| 
 | ||||
| elif [[ "$action" = run ]]; then | ||||
|     # Create the network & start the database container | ||||
|     docker network create fej | ||||
|     docker volume create fej_db-data | ||||
| 
 | ||||
|     docker run --rm \ | ||||
|         --detach \ | ||||
|         --name fej_db \ | ||||
|         --network fej \ | ||||
|         -p 5432:5432 \ | ||||
|         -e "POSTGRES_DB=fej" \ | ||||
|         -e "POSTGRES_USER=fej" \ | ||||
|         -e "POSTGRES_PASSWORD=fej" \ | ||||
|         -v 'fej_db-data:/var/lib/postgresql/data' \ | ||||
|         postgres:13-alpine | ||||
| 
 | ||||
|     if [[ "$mode" = "dev" ]]; then | ||||
|         # Create caching volumes if needed (they need to be named) | ||||
|         docker volume create fej_build-cache | ||||
|         docker volume create fej_registry-cache | ||||
| 
 | ||||
|         flags="-v fej_build-cache:/usr/src/app/target -v fej_registry-cache:/root/.cargo/registry" | ||||
|     fi | ||||
| 
 | ||||
|     docker run $attach $flags \ | ||||
|         --rm \ | ||||
|         --interactive \ | ||||
|         --tty \ | ||||
|         --publish 8000:8000 \ | ||||
|         --name fej \ | ||||
|         --env-file .env.container \ | ||||
|         --network fej \ | ||||
|         "$image$([[ "$mode" != "rel" ]] && echo "-dev"):$tags" "$@" | ||||
| fi | ||||
|  | @ -3,4 +3,4 @@ FROM chewingbever/fej-builder:latest | |||
| ENV RUST_BACKTRACE 1 | ||||
| 
 | ||||
| ENTRYPOINT ["cargo"] | ||||
| CMD ["run"] | ||||
| CMD ["run", "--bin", "server"] | ||||
|  |  | |||
|  | @ -7,7 +7,7 @@ FROM chewingbever/fej-builder:latest AS builder | |||
| # NOTE: cargo install auto-appends bin to the path | ||||
| RUN --mount=type=cache,target=/usr/src/app/target \ | ||||
|     --mount=type=cache,target=/root/.cargo/registry \ | ||||
|     cargo install --path . --bin fej --root /usr/local | ||||
|     cargo install --path . --root /usr/local | ||||
| 
 | ||||
| 
 | ||||
| # Now, we create the actual image | ||||
|  | @ -17,7 +17,7 @@ FROM alpine:latest | |||
| RUN apk update && apk add --no-cache openssl libgcc curl | ||||
| 
 | ||||
| # Copy binary over to final image | ||||
| COPY --from=builder /usr/local/bin/fej /usr/local/bin/fej | ||||
| COPY --from=builder /usr/local/bin/server /usr/local/bin/server | ||||
| 
 | ||||
| HEALTHCHECK \ | ||||
|     --interval=10s \ | ||||
|  | @ -26,4 +26,4 @@ HEALTHCHECK \ | |||
|     --retries=3 \ | ||||
|     CMD curl -q localhost:8000 | ||||
| 
 | ||||
| CMD ["/usr/local/bin/fej"] | ||||
| CMD ["/usr/local/bin/server"] | ||||
|  |  | |||
|  | @ -0,0 +1,159 @@ | |||
| #!/usr/bin/env bash | ||||
| 
 | ||||
| image='chewingbever/fej' | ||||
| 
 | ||||
| # Creates the needed images | ||||
| # | ||||
| # $1: wether to build the debug or the release image (default debug) | ||||
| function create_images() { | ||||
|     # First, we build the builder | ||||
|     DOCKER_BUILDKIT=1 docker build \ | ||||
|         -f docker/Dockerfile.builder \ | ||||
|         -t "$image-builder:latest" . | ||||
| 
 | ||||
|     if [[ "$1" = "rel" ]]; then | ||||
|         DOCKER_BUILDKIT=1 docker build \ | ||||
|             -t "$image:latest" \ | ||||
|             -f docker/Dockerfile.rel . | ||||
| 
 | ||||
|     else | ||||
|         # Then, we create the debug image | ||||
|         DOCKER_BUILDKIT=1 docker build \ | ||||
|             -t "$image:dev" \ | ||||
|             -f docker/Dockerfile.dev . | ||||
|     fi | ||||
| } | ||||
| 
 | ||||
| # Execute the debug image (must be built first) | ||||
| # | ||||
| # $@: the arguments to pass to the image (passed as arguments to cargo) | ||||
| function run_image() { | ||||
|     # Run the database image | ||||
|     docker run --rm \ | ||||
|         --detach \ | ||||
|         --name fej_db \ | ||||
|         --network fej \ | ||||
|         -p 5432:5432 \ | ||||
|         -e 'POSTGRES_DB=fej' \ | ||||
|         -e 'POSTGRES_USER=fej' \ | ||||
|         -e 'POSTGRES_PASSWORD=fej' \ | ||||
|         -v 'fej_db-data:/var/lib/postgresql/data' \ | ||||
|         postgres:13-alpine | ||||
| 
 | ||||
|     # Run the binary image | ||||
|     docker run \ | ||||
|         --detach \ | ||||
|         --rm \ | ||||
|         --interactive \ | ||||
|         --tty \ | ||||
|         --publish 8000:8000 \ | ||||
|         --name fej \ | ||||
|         --env-file .env.container \ | ||||
|         --network fej \ | ||||
|         -v 'fej_build-cache:/usr/src/app/target' \ | ||||
|         -v 'fej_registry-cache:/root/.cargo/registry' \ | ||||
|         "$image:dev" "$@" | ||||
| } | ||||
| 
 | ||||
| # Attach to the fej container | ||||
| function logs() { | ||||
|     docker logs -f fej | ||||
| } | ||||
| 
 | ||||
| # Builds the given binary | ||||
| # | ||||
| # $1: the binary to build | ||||
| function build() { | ||||
|     create_images | ||||
|     run_image build --bin "$1" | ||||
|     logs | ||||
| } | ||||
| 
 | ||||
| # Runs the given binary | ||||
| # | ||||
| # $1: the binary to run | ||||
| function run() { | ||||
|     create_images | ||||
|     run_image run --bin "$1" | ||||
|     logs | ||||
| } | ||||
| 
 | ||||
| # Runs the tests | ||||
| function tests() { | ||||
|     create_images | ||||
|     run_image test --no-fail-fast | ||||
|     logs | ||||
| } | ||||
| 
 | ||||
| # Stops both containers | ||||
| function stop() { | ||||
|     docker stop fej_db | ||||
|     docker stop -t 0 fej | ||||
| } | ||||
| 
 | ||||
| function run_release() { | ||||
|     echo "Not implemented" | ||||
| } | ||||
| 
 | ||||
| # Tags & pushes the release version to Docker Hub | ||||
| function publish() { | ||||
|     branch=`git rev-parse --abbrev-ref HEAD` | ||||
| 
 | ||||
|     if [[ "$branch" != master ]]; then | ||||
|         >&2 echo "You can only publish from master." | ||||
|         exit 2 | ||||
|     fi | ||||
| 
 | ||||
|     patch_version=`grep -Po '(?<=version = ").*(?=")' Cargo.toml | head -n1` | ||||
|     major_version=`echo "$patch_version" | sed -E 's/([0-9]+)\.([0-9]+)\.([0-9]+)/\1/'` | ||||
|     minor_version=`echo "$patch_version" | sed -E 's/([0-9]+).([0-9]+).([0-9]+)/\1.\2/'` | ||||
|     tags=("latest" "$patch_version" "$minor_version" "$major_version") | ||||
| 
 | ||||
|     for tag in "${tags[@]}"; do | ||||
|         # Create the tag | ||||
|         docker tag "$image:$tags" "$image:$tag" | ||||
| 
 | ||||
|         # Push the tag | ||||
|         docker push "$image:$tag" | ||||
| 
 | ||||
|         # Remove the tag again, if it's not the main tag | ||||
|         [[ "$tag" != "$tags" ]] && docker rmi "$image:$tag" | ||||
|     done | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| # Entrypoint to the script | ||||
| # | ||||
| # $1: action to perform, defaults to 'build' | ||||
| # $2: binary to use, defaults to 'server' | ||||
| function main() { | ||||
|     # Default values | ||||
|     cmd="${1:-build}" | ||||
|     bin="${2:-server}" | ||||
| 
 | ||||
|     case $cmd in | ||||
|         # Building | ||||
|         b | build ) build "$bin" ;; | ||||
|         br | build-release ) create_images rel ;; | ||||
| 
 | ||||
|         # Running | ||||
|         r | run ) run "$bin" ;; | ||||
|         rr | run-release ) run_release ;; | ||||
|         s | stop ) stop ;; | ||||
| 
 | ||||
|         # Ease of life | ||||
|         psql ) docker exec -it fej_db psql -U fej -d fej ;; | ||||
|         sh ) docker exec -it fej sh ;; | ||||
| 
 | ||||
|         # Misc | ||||
|         docs ) cargo doc --no-deps ;; | ||||
|         format ) cargo fmt ;; | ||||
|         l | logs ) logs ;; | ||||
|         lint ) cargo fmt -- --check ;; | ||||
|         p | push | publish ) publish ;; | ||||
|         t | test ) tests ;; | ||||
|         * ) >&2 echo "Invalid command."; exit 1 ;; | ||||
|     esac | ||||
| } | ||||
| 
 | ||||
| main "$@" | ||||
|  | @ -1,7 +1,7 @@ | |||
| #[macro_use] | ||||
| extern crate rocket; | ||||
| 
 | ||||
| use fej_lib::{catchers, ivago}; | ||||
| use fej::{catchers, ivago}; | ||||
| 
 | ||||
| // Very temporary solution for CORS
 | ||||
| // https://stackoverflow.com/questions/62412361/how-to-set-up-cors-or-options-for-rocket-rs
 | ||||
		Loading…
	
		Reference in New Issue