View on GitHub

Meta-Repository Workshop

Mono-repo eller mange repo? Prøv meta-repo! - JavaZone 2025

Oppgave 4: Automatisering med make og scripts

📋 Mål

I denne oppgaven skal du:

🛠 Steg-for-steg

Steg 1: Lag din første Makefile

Gå til rot-mappen til ditt meta-repo og opprett en Makefile:

# Gå til meta-repo mappen (todo-meta eller hva den heter)
cd todo-meta

# Lag en Makefile
touch Makefile

Åpne Makefile i din editor og legg til:

help:
	@echo "Tilgjengelige kommandoer:"
	@echo "  help    - Vis denne hjelpeteksten"
	@echo "  status  - Git status på alle repos"
	@echo "  pull    - Git pull på alle repos"

status:
	@echo "🔍 Sjekker git status..."
	meta git status

pull:
	@echo "⬇️  Oppdaterer alle repos..."
	meta exec "git pull"

Test det:

make
make status

Steg 2: Legg til .PHONY

Legg til .PHONY i filen:

.PHONY: help status pull

help:
	@echo "Tilgjengelige kommandoer:"
	@echo "  help    - Vis denne hjelpeteksten"
	@echo "  status  - Git status på alle repos"
	@echo "  pull    - Git pull på alle repos"

status:
	@echo "🔍 Sjekker git status..."
	meta git status

pull:
	@echo "⬇️  Oppdaterer alle repos..."
	meta exec "git pull"

Steg 3: Smart .PHONY automatisering

Erstatt den manuelle .PHONY-listen med denne smarte løsningen:

.PHONY: $(shell sed -n -e '/^$$/ { n ; /^[^ .\#][^ ]*:/ { s/:.*$$// ; p ; } ; }' $(MAKEFILE_LIST))

Steg 4: Automatisk help med dokumentasjon

Oppgrader til et help-system som bruker ## kommentarer ved å bytte ut med linjene i Makefile:

help: ## Vis denne hjelpeteksten
	@grep -hE '^\S+:.*##' $(MAKEFILE_LIST) | sed -e 's/:.*##\s*/ : /' | \
	while IFS=' : ' read -r cmd desc; do \
		printf "\033[36m%-20s\033[0m %s\n" "$$cmd" "$$desc"; \
	done

status: ## Git status på alle repos
	@echo "🔍 Sjekker git status..."
	meta git status

pull: ## Git pull på alle repos med rebase
	@echo "⬇️  Oppdaterer alle repos..."
	meta exec "git pull --rebase --autostash" --parallel

Test det nye help-systemet:

make help

Legg merket til at dersom du tar bort en # på en linje, så forsvinner den fra helpen:

help: # Vis denne hjelpeteksten

Prøv make help igjen for å se at “help” ikke lenger vises.

Steg 5: Legg til meta-repo kommandoer

Legg til dette på slutten av Makefile med de viktigste meta-repo operasjonene:

root_dir := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
meta_project := $(notdir $(patsubst %/,%,$(root_dir)))

build: ## Build all sub-projects with make build
	@meta exec "make build" --exclude "$(meta_project)"

test: ## Test all sub-projects with make test
	@meta exec "make test" --exclude "$(meta_project)"

list-local-commits: ## Shows local, unpushed, commits
	@meta exec "git log --oneline origin/HEAD..HEAD | cat"

Steg 6: Test meta-repo kommandoene

Prøv ut de forskjellige kommandoene:

make help
make pull
make list-local-commits

Denne kan nok hende at ikke virker hos deg - krever at du har det som trengs for å bygge Java og Node.js prosjektene.

make build
make test

Steg 7: Commit endringene

Commit den nye Makefile til meta-repoet:

git add Makefile
git commit -m"Legg til Makefile for meta-repo automatisering"

🎯 Ekstra-oppgaver for de med tid

Legg til disse kommandoene i din Makefile:

  1. Kodestatistikk: Vis cloc-statistikk for alle repos
  2. Branch info: Vis hvilken branch hvert repo er på
  3. Clean: Rydd opp git working directories 4Health check: Sjekk at alle services kan starte
Løsningsforslag
stats: ## Vis kodestatistikk med cloc
	@echo "📊 Genererer kodestatistikk..."
	meta exec "cloc . --vcs=git --quiet" --exclude "$(meta_project)"

branch-info: ## Vis hvilken branch hvert repo er på
	@echo "🌳 Viser branch-informasjon..."
	meta exec "echo \"\$$(basename \$$(pwd)): \$$(git branch --show-current)\"" --exclude "$(meta_project)"

clean: ## Rydd opp git working directories
	@echo "🧹 Rydder opp..."
	meta exec "git clean -fd" --exclude "$(meta_project)"

health: ## Kjør health check på alle services
	@echo "💚 Kjører health check..."
	meta exec "if [ -f docker-compose.yml ]; then docker-compose config -q && echo 'Docker compose OK'; fi" --exclude "$(meta_project)"

💡 Tips

← Tilbake til oversikt → Neste oppgave: Git-historikk analyse