Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Document Makefile and align .PHONY with available tasks #275

Merged
merged 6 commits into from
Jul 6, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 12 additions & 4 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -20,20 +20,28 @@ jobs:
- name: Install Golang
uses: actions/setup-go@v4.0.1
with:
go-version: '1.20'
go-version-file: go.mod
check-latest: true
cache: true

- uses: actions/setup-node@v3.6.0
with:
node-version: '18'


- name: Download modules
run: go mod download

- name: golangci-lint
uses: golangci/golangci-lint-action@v3.6.0
with:
version: v1.53
args: --timeout 7m

- name: Run make all
run: make all
- name: Build binaries
run: make binaries

- name: Build images
run: make images

- name: Print job result
run: |
Expand Down
18 changes: 13 additions & 5 deletions .github/workflows/master-build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,20 @@ jobs:
- name: Install Golang
uses: actions/setup-go@v4.0.1
with:
go-version: '1.20'
go-version-file: go.mod
check-latest: true
cache: true

- name: Download modules
run: go mod download

- uses: actions/setup-node@v3.6.0
with:
node-version: '18'

- name: Download modules
run: go mod download

- name: golangci-lint
uses: golangci/golangci-lint-action@v3.6.0
with:
Expand All @@ -52,16 +60,16 @@ jobs:

# build and push images tagged with GITHUB_SHA, version, and latest
- name: Build and push tornjak backend image
run: make container-backend-push
run: make release-backend

- name: Build and push tornjak frontend image
run: make container-frontend-push
run: make release-frontend

- name: Build and push tornjak image (frontend+backend)
run: make container-tornjak-push
run: make release-tornjak

- name: Build and push tornjak manager image
run: make container-manager-push
run: make release-manager

- name: Print job result
run: |
Expand Down
158 changes: 92 additions & 66 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
.PHONY: ui vendor build container-manager container-manager-push push container-frontend container-frontend-push container-backend container-backend-push

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ui build push targets didn't exist anymore, moved the existing ones with the respective target to make it easier to keep these in sync (more easy to detect during a review).

VERSION=$(shell cat version.txt)
GITHUB_SHA ?= "$(shell git rev-parse HEAD 2>/dev/null)"

Expand All @@ -12,93 +10,121 @@ CONTAINER_BACKEND_TAG ?= $(REPO)/tornjak-backend
CONTAINER_FRONTEND_TAG ?= $(REPO)/tornjak-frontend
CONTAINER_MANAGER_TAG ?= $(REPO)/tornjak-manager

## `make release-*` pushes to DEV tag as well as below corresponding RELEASE tag
## used by Github
BINARIES=tornjak-backend tornjak-manager
IMAGES=$(BINARIES) tornjak-frontend tornjak

GO_VERSION ?= 1.20

GO_FILES := $(shell find . -type f -name '*.go' -not -name '*_test.go' -not -path './vendor/*')

all: bin/tornjak-backend bin/tornjak-manager container-manager container-frontend container-backend container-tornjak
all: binaries images ## Builds both binaries and images (default task)

.PHONY: help
help: ## Display this help.
@awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m<target>\033[0m\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf " \033[36m%-25s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST)

PHONY: clean
clean: ## Cleanup local build outputs
rm -rf bin/
rm -rf tornjak-frontend/build
rm -rf frontend-local-build/

##@ Dependencies:

PHONY: download
download: ## Download go modules
@echo Downloading go modules…
@go mod download

PHONY: tidy
tidy: download ## Tidy go modules
@echo Tidying go modules…
@go mod tidy

PHONY: vendor
vendor: tidy ## Vendor go modules
@echo Vendoring go modules…
@go mod vendor

#### BEGIN LOCAL EXECUTABLE BUILDS ####
##@ Build:

# build binaries for Tornjak backend (bin/tornjak-backend)
bin/tornjak-backend: $(GO_FILES) vendor
PHONY: binaries
binaries: $(addprefix bin/,$(BINARIES)) ## Build bin/tornjak-backend and bin/tornjak-manager binaries

bin/tornjak-backend: tornjak-backend/cmd/agent $(GO_FILES) | vendor ## Build tornjak-backend binary
# Build hack because of flake of imported go module
docker run --rm -v "${PWD}":/usr/src/myapp -w /usr/src/myapp -e GOOS=linux -e GOARCH=amd64 golang:1.20 /bin/sh -c "go build --tags 'sqlite_json' tornjak-backend/cmd/agent/agent.go; go build --tags 'sqlite_json' -mod=vendor -ldflags '-s -w -linkmode external -extldflags "-static"' -o bin/tornjak-backend tornjak-backend/cmd/agent/agent.go"
docker run --rm -v "${PWD}":/usr/src/myapp -w /usr/src/myapp -e GOOS=linux -e GOARCH=amd64 golang:$(GO_VERSION) \
/bin/sh -c "go build --tags 'sqlite_json' -o agent ./$</main.go; go build --tags 'sqlite_json' -mod=vendor -ldflags '-s -w -linkmode external -extldflags "-static"' -o $@ ./$</main.go"

# build binary for Tornjak manager backend (bin/tornjak-manager)
bin/tornjak-manager: $(GO_FILES) vendor
bin/tornjak-manager: tornjak-backend/cmd/manager $(GO_FILES) | vendor ## Build bin/tornjak-manager binary
# Build hack because of flake of imported go module
docker run --rm -v "${PWD}":/usr/src/myapp -w /usr/src/myapp -e GOOS=linux -e GOARCH=amd64 golang:1.16 /bin/sh -c "go build --tags 'sqlite_json' -o tornjak-manager tornjak-backend/cmd/manager/manager.go; go build --tags 'sqlite_json' -mod=vendor -ldflags '-s -w -linkmode external -extldflags "-static"' -o bin/tornjak-manager tornjak-backend/cmd/manager/manager.go"
docker run --rm -v "${PWD}":/usr/src/myapp -w /usr/src/myapp -e GOOS=linux -e GOARCH=amd64 golang:$(GO_VERSION) \
/bin/sh -c "go build --tags 'sqlite_json' -o tornjak-manager ./$</main.go; go build --tags 'sqlite_json' -mod=vendor -ldflags '-s -w -linkmode external -extldflags "-static"' -o $@ ./$</main.go"

# build Tornjak frontend binaries
frontend-local-build:
frontend-local-build: ## Build tornjak-frontend
npm install --prefix tornjak-frontend
rm -rf tornjak-frontend/build
npm run build --prefix tornjak-frontend
rm -rf frontend-local-build
cp -r tornjak-frontend/build frontend-local-build

vendor:
go mod tidy
go mod vendor

#### END LOCAL EXECUTABLE BUILDS ####

##@ Container images:

#### BEGIN LOCAL CONTAINER IMAGE BUILD ####
## container-* creates an image for the component
.PHONY: images
images: $(addprefix image-,$(IMAGES)) ## Build all images

container-backend: bin/tornjak-backend
.PHONY: image-tornjak-backend
image-tornjak-backend: bin/tornjak-backend ## Build image for bin/tornjak-backend
docker build --no-cache -f Dockerfile.backend-container --build-arg version=$(VERSION) \
--build-arg github_sha=$(GITHUB_SHA) -t ${CONTAINER_BACKEND_TAG}:$(VERSION) .
--build-arg github_sha=$(GITHUB_SHA) -t $(CONTAINER_BACKEND_TAG):$(VERSION) .

container-manager: bin/tornjak-manager
.PHONY: image-tornjak-manager
image-tornjak-manager: bin/tornjak-manager ## Build image for bin/tornjak-manager
docker build --no-cache -f Dockerfile.tornjak-manager --build-arg version=$(VERSION) \
--build-arg github_sha=$(GITHUB_SHA) -t ${CONTAINER_MANAGER_TAG}:$(VERSION) .
--build-arg github_sha=$(GITHUB_SHA) -t $(CONTAINER_MANAGER_TAG):$(VERSION) .

container-frontend:
.PHONY: image-tornjak-frontend
image-tornjak-frontend: ## Build image for tornjak-frontend
docker build --no-cache -f Dockerfile.frontend-container --build-arg version=$(VERSION) \
--build-arg github_sha=$(GITHUB_SHA) -t ${CONTAINER_FRONTEND_TAG}:$(VERSION) .
--build-arg github_sha=$(GITHUB_SHA) -t $(CONTAINER_FRONTEND_TAG):$(VERSION) .

compose-frontend:
docker-compose -f docker-compose-frontend.yml up --build --force-recreate -d
docker tag tornjak-public_tornjak-frontend:latest ${CONTAINER_FRONTEND_TAG}:$(VERSION)

container-tornjak: bin/tornjak-backend
.PHONY: image-tornjak
image-tornjak: bin/tornjak-backend ## Build image for bin/tornjak-backend and tornjak-frontend bundled in single image
docker build --no-cache -f Dockerfile.tornjak-container --build-arg version=$(VERSION) \
--build-arg github_sha=$(GITHUB_SHA) -t ${CONTAINER_TORNJAK_TAG}:$(VERSION) .

#### END LOCAL CONTAINER IMAGE BUILD ####

#### BEGIN PUSH ONTAINER IMAGE ####
## container-*-push creates an image for the component and pushes to repo

container-backend-push: container-backend
docker push ${CONTAINER_BACKEND_TAG}:$(VERSION)
docker tag ${CONTAINER_BACKEND_TAG}:$(VERSION) ${CONTAINER_BACKEND_TAG}:$(GITHUB_SHA)
docker push ${CONTAINER_BACKEND_TAG}:$(GITHUB_SHA)

container-manager-push: container-manager
docker push ${CONTAINER_MANAGER_TAG}:$(VERSION)
docker tag ${CONTAINER_MANAGER_TAG}:$(VERSION) ${CONTAINER_MANAGER_TAG}:$(GITHUB_SHA)
docker push ${CONTAINER_MANAGER_TAG}:$(GITHUB_SHA)

container-frontend-push: container-frontend
docker push ${CONTAINER_FRONTEND_TAG}:$(VERSION)
docker tag ${CONTAINER_FRONTEND_TAG}:$(VERSION) ${CONTAINER_FRONTEND_TAG}:$(GITHUB_SHA)
docker push ${CONTAINER_FRONTEND_TAG}:$(GITHUB_SHA)
--build-arg github_sha=$(GITHUB_SHA) -t $(CONTAINER_TORNJAK_TAG):$(VERSION) .

container-tornjak-push: container-tornjak
docker push ${CONTAINER_TORNJAK_TAG}:$(VERSION)
docker tag ${CONTAINER_TORNJAK_TAG}:$(VERSION) ${CONTAINER_TORNJAK_TAG}:$(GITHUB_SHA)
docker push ${CONTAINER_TORNJAK_TAG}:$(GITHUB_SHA)

dev-push: container-backend-push container-manager-push container-frontend-push container-tornjak-push
#### END PUSH CONTAINER IMAGE ####

clean:
rm -rf bin/
rm -rf tornjak-frontend/build
rm -rf frontend-local-build/
##@ Run:

.PHONY: compose-frontend
compose-frontend: ## Run frontend using docker-compose
docker-compose -f docker-compose-frontend.yml up --build --force-recreate -d
docker tag tornjak-public_tornjak-frontend:latest $(CONTAINER_FRONTEND_TAG):$(VERSION)

##@ Release:

.PHONY: release-images
release-images: $(addprefix release-,$(IMAGES)) ## Release all images

.PHONY: release-tornjak-backend
release-tornjak-backend: image-tornjak-backend ## Release tornjak-backend image
docker push $(CONTAINER_BACKEND_TAG):$(VERSION)
docker tag $(CONTAINER_BACKEND_TAG):$(VERSION) $(CONTAINER_BACKEND_TAG):$(GITHUB_SHA)
docker push $(CONTAINER_BACKEND_TAG):$(GITHUB_SHA)

.PHONY: release-tornjak-manager
release-tornjak-manager: image-tornjak-manager ## Release tornjak-manager image
docker push $(CONTAINER_MANAGER_TAG):$(VERSION)
docker tag $(CONTAINER_MANAGER_TAG):$(VERSION) $(CONTAINER_MANAGER_TAG):$(GITHUB_SHA)
docker push $(CONTAINER_MANAGER_TAG):$(GITHUB_SHA)

.PHONY: release-tornjak-frontend
release-tornjak-frontend: image-tornjak-frontend ## Release tornjak-frontend image
docker push $(CONTAINER_FRONTEND_TAG):$(VERSION)
docker tag $(CONTAINER_FRONTEND_TAG):$(VERSION) $(CONTAINER_FRONTEND_TAG):$(GITHUB_SHA)
docker push $(CONTAINER_FRONTEND_TAG):$(GITHUB_SHA)

.PHONY: release-tornjak
release-tornjak: image-tornjak ## Release tornjak image (bundling frontend and backend)
docker push $(CONTAINER_TORNJAK_TAG):$(VERSION)
docker tag $(CONTAINER_TORNJAK_TAG):$(VERSION) $(CONTAINER_TORNJAK_TAG):$(GITHUB_SHA)
docker push $(CONTAINER_TORNJAK_TAG):$(GITHUB_SHA)
Loading