.PHONY: get-version get-current-sha get-project-name all setup run watch clean \
build build-watch build-release build-test build-test-watch \
test test-unit test-unit-debug test-int test-int-debug test-e2e test-e2e-debug \
check-tool-cargo check-tool-cargo-watch \
release-prep release-publish \
image image-publish image-release registry-login
all: build
PROJECT_NAME ?= kcup-rust
VERSION=$(shell perl -ne '/version\s+=\s+"([0-9|\.]+)"$$/ && print $$1 and last' Cargo.toml)
CURRENT_SHA ?= $(shell $(GIT) rev-parse --short HEAD)
BUILD_TARGET ?= x86_64-unknown-linux-musl
CARGO_BUILD_FLAGS ?= --target $(BUILD_TARGET)
GIT_REMOTE ?= origin
DOCKER ?= docker
CARGO ?= cargo
CARGO_WATCH ?= cargo-watch
SHA256SUM ?= sha256sum
SHA1SUM ?= sha1sum
GIT ?= git
RELEASES_DIR ?= releases
RELEASE_BINARY_NAME ?= kcup
CARGO_TARGET_DIR ?= target
RELEASE_BUILT_BIN_PATH = $(CARGO_TARGET_DIR)/$(BUILD_TARGET)/release/$(RELEASE_BINARY_NAME)
check-tool-docker:
ifeq (, $(shell which $(DOCKER)))
$(error "`docker` is not available please install docker (https://docker.com)")
endif
check-tool-cargo:
ifeq (, $(shell which $(CARGO)))
$(error "`cargo` is not available please install cargo (https://github.com/rust-lang/cargo/)")
endif
check-tool-cargo-watch:
ifeq (, $(shell which $(CARGO_WATCH)))
$(error "`cargo-watch` is not available please install cargo-watch (https://github.com/passcod/cargo-watch)")
endif
check-tool-sha256sum:
ifeq (, $(shell which $(SHA256SUM)))
$(error "`sha256sum` is not available please install sha256sum")
endif
check-tool-sha1sum:
ifeq (, $(shell which $(SHA1SUM)))
$(error "`sha1sum` is not available please install sha1sum")
endif
get-version:
@echo -e -n ${VERSION}
get-current-sha:
@echo -e -n ${CURRENT_SHA}
get-project-name:
@echo -e -n ${PROJECT_NAME}
setup:
@echo "[info] installing rust utilities..."
$(CARGO) install cargo-watch
fmt:
$(CARGO) fmt
clean: check-tool-cargo
$(CARGO) clean
build: check-tool-cargo
$(CARGO) build $(CARGO_BUILD_FLAGS)
build-release: check-tool-cargo check-tool-sha1sum check-tool-sha256sum
$(CARGO) build $(CARGO_BUILD_FLAGS) --release
cp $(RELEASE_BUILT_BIN_PATH) $(RELEASES_DIR)/$(RELEASE_BINARY_NAME)
release-prep: build-release check-tool-sha1sum check-tool-sha256sum
$(SHA256SUM) $(RELEASES_DIR)/${RELEASE_BINARY_NAME} > $(RELEASES_DIR)/${RELEASE_BINARY_NAME}.sha256sum
$(SHA1SUM) $(RELEASES_DIR)/${RELEASE_BINARY_NAME} > $(RELEASES_DIR)/${RELEASE_BINARY_NAME}.sha1sum
$(GIT) add .
$(GIT) commit -am "Release v$(VERSION)"
$(GIT) tag v$(VERSION) HEAD
release-publish:
$(GIT) push $(GIT_REMOTE) v$(VERSION)
build-test: check-tool-cargo
$(CARGO) test $(CARGO_BUILD_FLAGS) --no-run
install: check-tool-cargo
$(CARGO) install --path . $(RELEASE_BINARY_NAME)
run:
$(CARGO) run
test: test-unit test-int test-e2e
test-unit:
$(CARGO) test $(CARGO_BUILD_FLAGS)
test-unit-debug:
$(CARGO) test $(CARGO_BUILD_FLAGS) -- --nocapture
test-int:
$(CARGO) test $(CARGO_BUILD_FLAGS) -- --ignored _int
test-int-debug:
$(CARGO) test $(CARGO_BUILD_FLAGS) -- --ignored _int --nocapture
test-e2e: build-release
$(CARGO) test $(CARGO_BUILD_FLAGS) -- --ignored _e2e
test-e2e-debug: build-release
$(CARGO) test $(CARGO_BUILD_FLAGS) -- --ignored _e2e --nocapture
build-watch: check-tool-cargo check-tool-cargo-watch
$(CARGO_WATCH) -x "build $(CARGO_BUILD_FLAGS)" --watch src
build-test-watch: check-tool-cargo check-tool-cargo-watch
$(CARGO_WATCH) -x "test $(CARGO_BUILD_FLAGS)" --watch src --watch tests
REGISTRY_PATH = registry.gitlab.com/mrman/$(PROJECT_NAME)
IMAGE_NAME ?= cli
IMAGE_FULL_NAME=${REGISTRY_PATH}/${IMAGE_NAME}:v${VERSION}
IMAGE_FULL_NAME_SHA=${REGISTRY_PATH}/${IMAGE_NAME}:v${VERSION}-${CURRENT_SHA}
BUILDER_IMAGE_NAME ?= builder
BUILDER_FULL_NAME = ${REGISTRY_PATH}/${BUILDER_IMAGE_NAME}:v${VERSION}
registry-login:
cat infra/secrets/ci-deploy-token-password.secret | \
docker login -u $(shell cat infra/secrets/ci-deploy-token-username.secret) --password-stdin registry.gitlab.com
image:
docker build -f infra/docker/Dockerfile -t $(IMAGE_FULL_NAME_SHA) .
image-publish: check-tool-docker
$(DOCKER) push ${IMAGE_FULL_NAME_SHA}
image-release:
$(DOCKER) tag $(IMAGE_FULL_NAME_SHA) $(IMAGE_FULL_NAME)
$(DOCKER) push $(IMAGE_FULL_NAME)
builder-image:
docker build -f infra/docker/builder.Dockerfile -t $(BUILDER_FULL_NAME) .
builder-publish:
docker push $(BUILDER_FULL_NAME)