Skip to content

Commit

Permalink
Better docker build/deploy-pipeline (#147)
Browse files Browse the repository at this point in the history
To allow for better development with docker I've integrated the files from the `jenkins/linux` directory into the normal Makefile process.

If you are on Linux and have docker installed you get the following new `make` targets.

**NOTE: During executing of the docker command, the local directory is mounted  with r/w  permissions into the container and artifacts will be written to your local directory structure. The reason for this is that it allows us to package them further.**

 * `make docker-start`

 Builds a docker image (if needed) that will be used to build the project inside a docker container.
After creating the builder image from `Dockerfile.builder` a container is started in the background under a name that is known to the Makefile. This container will be used in the other new Make targets to execute steps one by one and repeatable.
 * `make docker-deps`
 
 Inside the running container execute the `make deps` step.
 * `make docker-generate`
 
 Inside the running container execute the `make generate` step.
 * `make docker-build`
 
 Inside the running container execute the `make build` step.
 * `make docker-test-unit`
 
 Inside the running container execute the `make test-unit` step.
 * `make docker-test-integration`
 
 Inside the running container execute the `make test-integration` step. This target checks for the existence of a PostgreSQL container that was started using the `make integration-test-env-prepare` command. This target doesn't bother if there is any other PostgreSQL container 	running at the moment. It only accepts the one created from the `.make/docker-compose.integration-test.yaml`.
 * `make docker-rm`
 
 Stops and removes the running container that was started with `make docker-start`.
 * `make docker-image-deploy`
 
 Creates a docker image named "almighty-core-deploy" based on `Dockerfile.deploy` that contains a ready to run almighty-core server. The artifacts packaged in this image will be taken from the `bin/` directory, so beware that you've created them using the new `docker-*` targets.

* `make docker-publish-deploy`

 Tags the image that was build with `docker-image-deploy` to `almightycore/almighty-core:latest` and pushes it to the docker hub.

To not break compatibility with running Jenkins jobs, the Makefile in `jenkins/linux` now calls the above `docker-*` make targets.

***

We have two `Dockerfile`s now:

1. `Dockerfile.builder` - Used to build almighty-core (using centos:7 so #118 is done) 
2. `Dockerfile.deploy` -  Used to package almighty-core for deployment.

***

Tests now populate the return code as exit code to the CLI when executed with `go test`.

***

The `docker-compose.yaml` file now contains two services `db` and `core` and uses version 2 of the docker-compose file format. The core container waits until the database container has opened the required port before it starts the almighty-core process.
  • Loading branch information
kwk authored Aug 24, 2016
1 parent da46077 commit 48a4c23
Show file tree
Hide file tree
Showing 18 changed files with 290 additions and 185 deletions.
2 changes: 2 additions & 0 deletions .make/Makefile.lnx
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@ BINARY_CLIENT_BIN=$(INSTALL_PREFIX)/alm-cli
GLIDE_BIN=glide
GOAGEN_BIN=$(VENDOR_DIR)/github.com/goadesign/goa/goagen/goagen
GO_BINDATA_BIN=$(VENDOR_DIR)/github.com/jteeuwen/go-bindata/go-bindata/go-bindata
GO_BINDATA_DIR=$(VENDOR_DIR)/github.com/jteeuwen/go-bindata/go-bindata/
GO_BINDATA_ASSETFS_BIN=$(VENDOR_DIR)/github.com/elazarl/go-bindata-assetfs/go-bindata-assetfs/go-bindata-assetfs
FRESH_BIN=$(VENDOR_DIR)/github.com/pilu/fresh/fresh
EXTRA_PATH=$(shell dirname $(GO_BINDATA_BIN))
GOCOV_BIN=$(VENDOR_DIR)/github.com/axw/gocov/gocov/gocov
GOCOVMERGE_BIN=$(VENDOR_DIR)/github.com/wadey/gocovmerge/gocovmerge
DOCKER_BIN_NAME=docker
DOCKER_COMPOSE_BIN_NAME=docker-compose

GIT_BIN_NAME := git
Expand Down
3 changes: 2 additions & 1 deletion .make/Makefile.win
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ FRESH_BIN=$(VENDOR_DIR)/github.com/pilu/fresh/fresh.exe
EXTRA_PATH=$(shell cygpath --unix '$(GO_BINDATA_DIR)')
GOCOV_BIN=$(VENDOR_DIR)/github.com/axw/gocov/gocov/gocov.exe
GOCOVMERGE_BIN=$(VENDOR_DIR)/github.com/wadey/gocovmerge/gocovmerge.exe
DOCKER_COMPOSE_BIN_NAME=docker-compose
DOCKER_BIN_NAME=docker.exe
DOCKER_COMPOSE_BIN_NAME=docker-compose.exe

GIT_BIN_NAME := git.exe
GLIDE_BIN_NAME := glide.exe
Expand Down
136 changes: 136 additions & 0 deletions .make/docker.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
DOCKER_IMAGE_CORE := $(PROJECT_NAME)
DOCKER_IMAGE_DEPLOY := $(PROJECT_NAME)-deploy

# If running in Jenkins we don't allow for interactively running the container
ifneq ($(BUILD_TAG),)
DOCKER_RUN_INTERACTIVE_SWITCH :=
else
DOCKER_RUN_INTERACTIVE_SWITCH := -i
endif

# The workspace environment is set by Jenkins and defaults to /tmp if not set
WORKSPACE ?= /tmp
DOCKER_BUILD_DIR := $(WORKSPACE)/$(PROJECT_NAME)-build

# The BUILD_TAG environment variable will be set by jenkins
# to reflect jenkins-${JOB_NAME}-${BUILD_NUMBER}
BUILD_TAG ?= $(PROJECT_NAME)-local-build
DOCKER_CONTAINER_NAME := $(BUILD_TAG)

## Where is the GOPATH inside the build container?
GOPATH_IN_CONTAINER=/tmp/go
PACKAGE_PATH=$(GOPATH_IN_CONTAINER)/src/$(PACKAGE_NAME)

.PHONY: docker-image-builder
## Builds the docker image used to build the software.
docker-image-builder:
@echo "Building docker image $(DOCKER_IMAGE_CORE)"
docker build -t $(DOCKER_IMAGE_CORE) -f $(CUR_DIR)/Dockerfile.builder $(CUR_DIR)

.PHONY: docker-image-deploy
## Creates a runnable image using the artifacts from the bin directory.
docker-image-deploy:
docker build -t $(DOCKER_IMAGE_DEPLOY) -f $(CUR_DIR)/Dockerfile.deploy $(CUR_DIR)

.PHONY: docker-publish-deploy
## Tags the runnable image and pushes it to the docker hub.
docker-publish-deploy:
docker tag $(DOCKER_IMAGE_DEPLOY) almightycore/almighty-core:latest
docker push almightycore/almighty-core:latest

.PHONY: docker-build-dir
## Creates the docker build directory.
docker-build-dir:
@echo "Creating build directory $(BUILD_DIR)"
mkdir -p $(DOCKER_BUILD_DIR)

CLEAN_TARGETS += clean-docker-build-container
.PHONY: clean-docker-build-container
## Removes any existing container used to build the software (if any).
clean-docker-build-container:
@echo "Removing container named \"$(DOCKER_CONTAINER_NAME)\" (if any)"
ifneq ($(strip $(shell docker ps -qa --filter "name=$(DOCKER_CONTAINER_NAME)" 2>/dev/null)),)
@docker rm -f $(DOCKER_CONTAINER_NAME)
else
@echo "No container named \"$(DOCKER_CONTAINER_NAME)\" to remove"
endif

CLEAN_TARGETS += clean-docker-build-dir
.PHONY: clean-docker-build-dir
## Removes the docker build directory.
clean-docker-build-dir:
@echo "Cleaning build directory $(BUILD_DIR)"
-rm -rf $(DOCKER_BUILD_DIR)

.PHONY: docker-start
## Starts the docker build container in the background (detached mode).
docker-start: docker-build-dir docker-image-builder
ifneq ($(strip $(shell docker ps -qa --filter "name=$(DOCKER_CONTAINER_NAME)" 2>/dev/null)),)
@echo "Docker container \"$(DOCKER_CONTAINER_NAME)\" already exists. To recreate, run \"make docker-rm\"."
else
docker run \
--detach=true \
-t \
$(DOCKER_RUN_INTERACTIVE_SWITCH) \
--name="$(DOCKER_CONTAINER_NAME)" \
-v $(CUR_DIR):$(PACKAGE_PATH):rw \
-u $(shell id -u $(USER)):$(shell id -g $(USER)) \
-e GOPATH=$(GOPATH_IN_CONTAINER) \
-w $(PACKAGE_PATH) \
$(DOCKER_IMAGE_CORE)
@echo "Docker container \"$(DOCKER_CONTAINER_NAME)\" created. Continue with \"make docker-deps\"."
endif

.PHONY: docker-deps
## Runs "make deps" inside the already started docker build container (see "make docker-start").
docker-deps:
ifeq ($(strip $(shell docker ps -qa --filter "name=$(DOCKER_CONTAINER_NAME)" 2>/dev/null)),)
$(error No container name "$(DOCKER_CONTAINER_NAME)" exists to run the build. Try running "make docker-start && make docker-deps")
endif
docker exec -t $(DOCKER_RUN_INTERACTIVE_SWITCH) "$(DOCKER_CONTAINER_NAME)" make deps

.PHONY: docker-generate
## Runs "make generate" inside the already started docker build container (see "make docker-start").
docker-generate:
ifeq ($(strip $(shell docker ps -qa --filter "name=$(DOCKER_CONTAINER_NAME)" 2>/dev/null)),)
$(error No container name "$(DOCKER_CONTAINER_NAME)" exists to run the build. Try running "make docker-start && make docker-deps && make docker-generate")
endif
docker exec -t $(DOCKER_RUN_INTERACTIVE_SWITCH) "$(DOCKER_CONTAINER_NAME)" make generate

.PHONY: docker-build
## Runs "make build" inside the already started docker build container (see "make docker-start").
docker-build:
ifeq ($(strip $(shell docker ps -qa --filter "name=$(DOCKER_CONTAINER_NAME)" 2>/dev/null)),)
$(error No container name "$(DOCKER_CONTAINER_NAME)" exists to run the build. Try running "make docker-start && make docker-deps && make docker-generate && make docker-build")
endif
docker exec -t $(DOCKER_RUN_INTERACTIVE_SWITCH) "$(DOCKER_CONTAINER_NAME)" make build

.PHONY: docker-test-unit
## Runs "make test-unit" inside the already started docker build container (see "make docker-start").
docker-test-unit:
ifeq ($(strip $(shell docker ps -qa --filter "name=$(DOCKER_CONTAINER_NAME)" 2>/dev/null)),)
$(error No container name "$(DOCKER_CONTAINER_NAME)" exists to run the build. Try running "make docker-start && make docker-deps && make docker-generate && make docker-build && make docker-test-unit")
endif
docker exec -t $(DOCKER_RUN_INTERACTIVE_SWITCH) "$(DOCKER_CONTAINER_NAME)" make test-unit

.PHONY: docker-test-integration
## Runs "make test-unit" inside the already started docker build container (see "make docker-start").
## Make sure you ran "make integration-test-env-prepare" before you run this target.
docker-test-integration:
ifeq ($(strip $(shell docker ps -qa --filter "name=$(DOCKER_CONTAINER_NAME)" 2>/dev/null)),)
$(error No container name "$(DOCKER_CONTAINER_NAME)" exists to run the build. Try running "make docker-start && make docker-deps && make docker-generate && make docker-build && make docker-test-unit")
endif
ifeq ($(strip $(shell docker inspect --format '{{ .NetworkSettings.IPAddress }}' make_postgres_integration_test_1 2>/dev/null)),)
$(error Failed to find PostgreSQL container. Try running "make integration-test-env-prepare && make docker-test-integration")
endif
$(eval ALMIGHTY_DB_HOST := $(shell docker inspect --format '{{ .NetworkSettings.IPAddress }}' make_postgres_integration_test_1 2>/dev/null))
docker exec -t $(DOCKER_RUN_INTERACTIVE_SWITCH) "$(DOCKER_CONTAINER_NAME)" bash -c 'export ALMIGHTY_DB_HOST=$(ALMIGHTY_DB_HOST); make test-integration'

.PHONY: docker-rm
## Removes the docker build container, if any (see "make docker-start").
docker-rm:
ifneq ($(strip $(shell docker ps -qa --filter "name=$(DOCKER_CONTAINER_NAME)" 2>/dev/null)),)
docker rm -f "$(DOCKER_CONTAINER_NAME)"
else
@echo "No container named \"$(DOCKER_CONTAINER_NAME)\" to remove."
endif
74 changes: 64 additions & 10 deletions .make/test.mk
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,12 @@ COV_PATH_INTEGRATION = $(TMP_PATH)/coverage.integration.mode-$(COVERAGE_MODE)
# File that stores overall coverge for all packages and unit- and integration-tests
COV_PATH_OVERALL = $(TMP_PATH)/coverage.mode-$(COVERAGE_MODE)

# Alternative path to docker-compose (if downloaded)
DOCKER_COMPOSE_BIN_ALT = $(TMP_PATH)/docker-compose

# docker-compose file for integration tests
DOCKER_COMPOSE_FILE = $(CUR_DIR)/.make/docker-compose.integration-test.yaml

#-------------------------------------------------------------------------------
# Normal test targets
#
Expand All @@ -114,21 +120,46 @@ test-unit: prebuild-check clean-coverage-unit $(COV_PATH_UNIT)
## Runs the integration tests and produces coverage files for each package.
test-integration: prebuild-check clean-coverage-integration $(COV_PATH_INTEGRATION)

# Downloads docker-compose to tmp/docker-compose if it does not already exist.
define download-docker-compose
@if [ ! -f "$(DOCKER_COMPOSE_BIN_ALT)" ]; then \
echo "Downloading docker-compose to $(DOCKER_COMPOSE_BIN_ALT)"; \
UNAME_S=$(shell uname -s); \
UNAME_M=$(shell uname -m); \
URL="https://github.com/docker/compose/releases/download/1.8.0/docker-compose-$${UNAME_S}-$${UNAME_M}"; \
curl --silent -L $${URL} > $(DOCKER_COMPOSE_BIN_ALT); \
chmod +x $(DOCKER_COMPOSE_BIN_ALT); \
fi
endef

.PHONY: integration-test-env-prepare
## Prepares all services needed to run the integration tests
## Prepares all services needed to run the integration tests.
## If not already available, this target will download docker-compose (on Linux).
integration-test-env-prepare:
ifndef DOCKER_COMPOSE_BIN
ifdef DOCKER_COMPOSE_BIN
@$(DOCKER_COMPOSE_BIN) -f $(DOCKER_COMPOSE_FILE) up -d
else
ifneq ($(OS),Windows_NT)
$(call download-docker-compose)
@$(DOCKER_COMPOSE_BIN_ALT) -f $(DOCKER_COMPOSE_FILE) up -d
else
$(error The "$(DOCKER_COMPOSE_BIN_NAME)" executable could not be found in your PATH)
endif
@$(DOCKER_COMPOSE_BIN) -f $(CUR_DIR)/.make/docker-compose.integration-test.yaml up -d
endif

.PHONY: integration-test-env-tear-down
## Tears down all services needed to run the integration tests
integration-test-env-tear-down:
ifndef DOCKER_COMPOSE_BIN
ifdef DOCKER_COMPOSE_BIN
@$(DOCKER_COMPOSE_BIN) -f $(DOCKER_COMPOSE_FILE) down
else
ifneq ($(OS),Windows_NT)
$(call download-docker-compose)
@$(DOCKER_COMPOSE_BIN_ALT) -f $(DOCKER_COMPOSE_FILE) down
else
$(error The "$(DOCKER_COMPOSE_BIN_NAME)" executable could not be found in your PATH)
endif
@$(DOCKER_COMPOSE_BIN) -f $(CUR_DIR)/.make/docker-compose.integration-test.yaml down
endif

#-------------------------------------------------------------------------------
# Inspect coverage of unit tests or integration tests in either pure
Expand Down Expand Up @@ -216,41 +247,64 @@ gocov-integration-annotate: prebuild-check $(GOCOV_BIN) $(COV_PATH_INTEGRATION)
# 1. Test name (e.g. "unit" or "integration")
# 2. package name "github.com/almighty/almighty-core/model"
# 3. File in which to combine the output
# 4. (optional) parameters for "go test" command
# 4. Path to file in which to store names of packages that failed testing
# 5. (optional) parameters for "go test" command
define test-package
$(eval TEST_NAME := $(1))
$(eval PACKAGE_NAME := $(2))
$(eval COMBINED_OUT_FILE := $(3))
$(eval EXTRA_TEST_PARAMS := $(4))
$(eval ERRORS_FILE := $(4))
$(eval EXTRA_TEST_PARAMS := $(5))

@mkdir -p $(COV_DIR)/$(PACKAGE_NAME);
$(eval COV_OUT_FILE := $(COV_DIR)/$(PACKAGE_NAME)/coverage.$(TEST_NAME).mode-$(COVERAGE_MODE))
@ALMIGHTY_DB_HOST=$(ALMIGHTY_DB_HOST) go test $(PACKAGE_NAME) -v -coverprofile $(COV_OUT_FILE) -covermode=$(COVERAGE_MODE) -timeout 10m $(EXTRA_TEST_PARAMS);
-@ALMIGHTY_DB_HOST=$(ALMIGHTY_DB_HOST) go test $(PACKAGE_NAME) -v -coverprofile $(COV_OUT_FILE) -covermode=$(COVERAGE_MODE) -timeout 10m $(EXTRA_TEST_PARAMS) || echo $(PACKAGE_NAME) >> $(ERRORS_FILE)

@if [ -e "$(COV_OUT_FILE)" ]; then \
tail -n +2 $(COV_OUT_FILE) >> $(COMBINED_OUT_FILE); \
fi
endef

# Exits the makefile with an error if the file (first parameter) exists.
# Before existing, the contents of the passed file is printed.
define check-test-results
$(eval ERRORS_FILE := $(1))
@if [ -e "$(ERRORS_FILE)" ]; then \
echo ""; \
echo "ERROR: The following packages did not pass the tests:"; \
echo "-----------------------------------------------------"; \
cat $(ERRORS_FILE); \
echo "-----------------------------------------------------"; \
echo ""; \
exit 1; \
fi
endef

# NOTE: We don't have prebuild-check as a dependency here because it would cause
# the recipe to be always executed.
$(COV_PATH_UNIT): $(SOURCES)
$(eval TEST_NAME := unit)
$(eval ERRORS_FILE := $(TMP_PATH)/errors.$(TEST_NAME))
$(call log-info,"Running test: $(TEST_NAME)")
@mkdir -p $(COV_DIR)
@echo "mode: $(COVERAGE_MODE)" > $(COV_PATH_UNIT)
-rm -f $(ERRORS_FILE)
$(eval TEST_PACKAGES:=$(shell go list ./... | grep -v vendor))
$(foreach package, $(TEST_PACKAGES), $(call test-package,$(TEST_NAME),$(package),$(COV_PATH_UNIT),-tags=unit))
$(foreach package, $(TEST_PACKAGES), $(call test-package,$(TEST_NAME),$(package),$(COV_PATH_UNIT),$(ERRORS_FILE),-tags=unit))
$(call check-test-results,$(ERRORS_FILE))

# NOTE: We don't have prebuild-check as a dependency here because it would cause
# the recipe to be always executed.
$(COV_PATH_INTEGRATION): $(SOURCES)
$(eval TEST_NAME := integration)
$(eval ERRORS_FILE := $(TMP_PATH)/errors.$(TEST_NAME))
$(call log-info,"Running test: $(TEST_NAME)")
@mkdir -p $(COV_DIR)
@echo "mode: $(COVERAGE_MODE)" > $(COV_PATH_INTEGRATION)
-rm -f $(ERRORS_FILE)
$(eval TEST_PACKAGES:=$(shell go list ./... | grep -v vendor))
$(foreach package, $(TEST_PACKAGES), $(call test-package,$(TEST_NAME),$(package),$(COV_PATH_INTEGRATION),-tags=integration))
$(foreach package, $(TEST_PACKAGES), $(call test-package,$(TEST_NAME),$(package),$(COV_PATH_INTEGRATION),$(ERRORS_FILE),-tags=integration))
$(call check-test-results,$(ERRORS_FILE))

#-------------------------------------------------------------------------------
# Additional tools to build
Expand Down
14 changes: 5 additions & 9 deletions jenkins/linux/Dockerfile → Dockerfile.builder
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
FROM fedora:24
FROM centos:7
MAINTAINER "Konrad Kleine <kkleine@redhat.com>"
ENV LANG=en_US.utf8

# Some packages might seem weird but they are required by the
# RVM installer
RUN dnf install -y \
# Some packages might seem weird but they are required by the RVM installer.
RUN yum install -y \
findutils \
git \
golang \
Expand All @@ -14,16 +13,13 @@ RUN dnf install -y \
tar \
wget \
which \
&& dnf clean all
&& yum clean all

# Get glide for Go package management
RUN cd /tmp \
&& wget https://github.com/Masterminds/glide/releases/download/v0.11.0/glide-v0.11.0-linux-amd64.tar.gz \
&& wget https://github.com/Masterminds/glide/releases/download/v0.11.1/glide-v0.11.1-linux-amd64.tar.gz \
&& tar xvzf glide-v*.tar.gz \
&& mv linux-amd64/glide /usr/bin \
&& rm -rfv glide-v* linux-amd64

# Mount source and build folders to these locations to get persitency
VOLUME ["/source", "/build"]

ENTRYPOINT ["/bin/bash"]
16 changes: 16 additions & 0 deletions Dockerfile.deploy
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
FROM centos:7
MAINTAINER "Konrad Kleine <kkleine@redhat.com>"
ENV LANG=en_US.utf8

COPY bin/alm /usr/bin/alm

# This script waits for a port to be open before it continues to execute what's
# behind the two dashes "--".
ADD https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh /usr/local/bin/wait-for-it.sh
RUN chmod +x /usr/local/bin/wait-for-it.sh

# Wait until the postgres service ("db") from the docker-compose.yaml file is
# ready to accept connections then then start the almighty-core.
ENTRYPOINT [ "/usr/bin/alm" ]

EXPOSE 8080
24 changes: 18 additions & 6 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
PROJECT_NAME=almighty-core
CUR_DIR=$(shell pwd)
TMP_PATH=$(CUR_DIR)/tmp
INSTALL_PREFIX=$(CUR_DIR)/bin
Expand All @@ -18,6 +19,14 @@ GLIDE_BIN := $(shell command -v $(GLIDE_BIN_NAME) 2> /dev/null)
GO_BIN := $(shell command -v $(GO_BIN_NAME) 2> /dev/null)
HG_BIN := $(shell command -v $(HG_BIN_NAME) 2> /dev/null)
DOCKER_COMPOSE_BIN := $(shell command -v $(DOCKER_COMPOSE_BIN_NAME) 2> /dev/null)
DOCKER_BIN := $(shell command -v $(DOCKER_BIN_NAME) 2> /dev/null)

# This is a fix for a non-existing user in passwd file when running in a docker
# container and trying to clone repos of dependencies
GIT_COMMITTER_NAME ?= "user"
GIT_COMMITTER_EMAIL ?= "user@example.com"
export GIT_COMMITTER_NAME
export GIT_COMMITTER_EMAIL

# Used as target and binary output names... defined in includes
CLIENT_DIR=tool/alm-cli
Expand Down Expand Up @@ -139,11 +148,8 @@ clean-glide-cache:

.PHONY: deps
## Download build dependencies.
deps: prebuild-check $(VENDOR_DIR)

# Fetch dependencied everytime the glide.lock or glide.yaml files change
$(VENDOR_DIR): glide.lock glide.yaml
$(GLIDE_BIN) install
deps: prebuild-check
$(GLIDE_BIN) --verbose install

.PHONY: generate
## Generate GOA sources. Only necessary after clean of if changed `design` folder.
Expand All @@ -155,11 +161,17 @@ generate: prebuild-check $(DESIGNS) $(GOAGEN_BIN) $(GO_BINDATA_ASSETFS_BIN) $(GO

.PHONY: dev
dev: prebuild-check $(FRESH_BIN)
docker-compose up -d
docker-compose up -d db
$(FRESH_BIN)

include ./.make/test.mk

ifneq ($(OS),Windows_NT)
ifdef DOCKER_BIN
include ./.make/docker.mk
endif
endif

$(INSTALL_PREFIX):
# Build artifacts dir
mkdir -p $(INSTALL_PREFIX)
Expand Down
Loading

0 comments on commit 48a4c23

Please sign in to comment.