1
0
mirror of https://codeberg.org/crowci/crow.git synced 2025-04-18 04:44:01 +03:00
crow/Justfile
pat-s a42e00072d docs: add dev instructions (#150)
fix #149

Reviewed-on: https://codeberg.org/crowci/crow/pulls/150
Co-authored-by: pat-s <patrick.schratz@gmail.com>
Co-committed-by: pat-s <patrick.schratz@gmail.com>
2025-04-14 10:39:36 +00:00

269 lines
12 KiB
Makefile

### Variables
GO_PACKAGES := `go list ./... 2>/dev/null | grep -v /vendor/ || echo ""`
TARGETOS := `go env GOOS`
TARGETARCH := `go env GOARCH`
BIN_SUFFIX := if TARGETOS == "windows" { ".exe" } else { "" }
DIST_DIR := "dist"
# VERSION := env_var_or_default("VERSION", "dev")
CI_COMMIT_SHA := env_var_or_default("CI_COMMIT_SHA", `git rev-parse HEAD`)
TAGS := ""
STATIC_BUILD := "true"
GH_TOKEN_MKDOCS_MATERIAL := env_var_or_default("GH_TOKEN_MKDOCS_MATERIAL", "")
MKDOCS_MATERIAL_VERSION := env_var_or_default("MKDOCS_MATERIAL_VERSION", "latest")
CI := env_var_or_default("CI", "false")
# Set version based on CI environment
VERSION := if env_var_or_default("CI_COMMIT_TAG", "") != "" {
replace(env_var("CI_COMMIT_TAG"), "v", "")
} else {
if `echo $CI_COMMIT_BRANCH | cut -c -9` == "release/v" {
`echo $CI_COMMIT_BRANCH | cut -c 10-` + "-" + `echo $CI_COMMIT_SHA | cut -c -10`
}
else {
"dev-" + `echo "${CI_COMMIT_SHA:-$(git rev-parse HEAD)}" | cut -c -10 2>/dev/null || echo "unknown"`
}
}
VERSION_NUMBER := if env_var_or_default("CI_COMMIT_TAG", "") != "" {
replace(env_var("CI_COMMIT_TAG"), "v", "")
} else {
env_var_or_default("VERSION_NUMBER", "0.0.0")
}
# Conditional assignment for LDFLAGS if STATIC_BUILD is true
# FIXME: https://github.com/casey/just/issues/11
LDFLAGS := if STATIC_BUILD == "true" {
"-s -w -extldflags '-static' -X codeberg.org/crowci/crow/v3/version.Version=" + VERSION
} else {
"-X codeberg.org/crowci/crow/v3/version.Version=" + VERSION
}
# only used to compile server
CGO_ENABLED := "1"
HAS_GO := `hash go > /dev/null 2>&1 && echo "GO" || echo "NOGO"`
XGO_VERSION := if HAS_GO == "GO" { "go-1.24.x" } else { "" }
CGO_CFLAGS := if HAS_GO == "GO" { `go env CGO_CFLAGS` } else { "" }
### Recipes
## general
version:
@echo "{{VERSION}}"
fmt:
prettier -w .
gofmt -w .
gci write --skip-vendor --skip-generated -s standard -s default -s "prefix(codeberg.org/crowci/crow)" --custom-order .
test: test-agent test-server test-server-datastore test-cli test-lib
## Run all code generations
generate: generate-openapi
CGO_ENABLED=0 go generate ./...
generate-openapi: install-dev-deps
go run github.com/swaggo/swag/cmd/swag fmt
CGO_ENABLED=0 go generate cmd/server/openapi.go
mockery: install-dev-deps
mockery
install-dev-deps:
# @hash golangci-lint > /dev/null 2>&1 || go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
@hash gofumpt > /dev/null 2>&1 || go install mvdan.cc/gofumpt@latest
@hash addlicense > /dev/null 2>&1 || go install github.com/google/addlicense@latest
@hash mockery > /dev/null 2>&1 || go install github.com/vektra/mockery/v2@latest
@hash protoc-gen-go > /dev/null 2>&1 || go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
@hash protoc-gen-go-grpc > /dev/null 2>&1 || go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
## test
test-agent:
CGO_ENABLED=1 go test -race -cover -coverprofile agent-coverage.out -timeout 60s -tags 'test {{ TAGS }}' codeberg.org/crowci/crow/v3/cmd/agent codeberg.org/crowci/crow/v3/agent/...
test-server:
CGO_ENABLED=1 go test -race -cover -coverprofile server-coverage.out -timeout 60s -tags 'test {{ TAGS }}' codeberg.org/crowci/crow/v3/cmd/server `go list codeberg.org/crowci/crow/v3/server/... | grep -v '/store'`
test-cli:
CGO_ENABLED=1 go test -race -cover -coverprofile cli-coverage.out -timeout 60s -tags 'test {{ TAGS }}' codeberg.org/crowci/crow/v3/cmd/cli codeberg.org/crowci/crow/v3/cli/...
test-server-datastore:
CGO_ENABLED=1 go test -timeout 300s -tags 'test {{ TAGS }}' -run TestMigrate codeberg.org/crowci/crow/v3/server/store/...
go test -race -timeout 100s -tags 'test {{ TAGS }}' -skip TestMigrate codeberg.org/crowci/crow/v3/server/store/...
test-server-datastore-coverage:
CGO_ENABLED=1 go test -race -cover -coverprofile datastore-coverage.out -timeout 300s -tags 'test {{ TAGS }}' codeberg.org/crowci/crow/v3/server/store/...
# FIXME: feature of 1.38.0 [working-directory('web')]
test-ui:
cd web && pnpm install --frozen-lockfile
cd web && pnpm run lint
cd web && pnpm run format:check
cd web && pnpm run typecheck
cd web && pnpm run test
test-lib:
CGO_ENABLED=1 go test -race -cover -coverprofile coverage.out -timeout 60s -tags 'test {{ TAGS }}' `go list ./... | grep -v '/cmd\|/agent\|/cli\|/server'`
## docs
docs-venv:
test -d venv || python3 -m venv venv
fish -c 'if set -q GH_TOKEN_MKDOCS_MATERIAL; source venv/bin/activate.fish; and pip3 install -r docs/requirements-insiders.txt; else; source venv/bin/activate.fish; and pip3 install -r docs/requirements.txt; end'
docs-mike ARG:
fish -c 'source venv/bin/activate.fish && mike {{ ARG }}'
docs-serve:
fish -c 'source venv/bin/activate.fish && mkdocs --version && mkdocs serve -a localhost:5555'
docs-build:
fish -c 'source venv/bin/activate.fish && mkdocs --version && CI={{CI}} mkdocs build'
docs-deploy:
fish -c 'source venv/bin/activate.fish && mkdocs --version && mkdocs gh-deploy'
## git
cherry-pick COMMIT:
git fetch crow && git cherry-pick {{ COMMIT }}
## build
lint-backend: install-dev-deps
golangci-lint run
# FIXME: feature of 1.38.0 [working-directory('web')]
lint-frontend:
cd web/ && pnpm lint --quiet
# FIXME: feature of 1.38.0 [working-directory('web')]
build-ui:
cd web/ && pnpm install --frozen-lockfile
cd web/ && pnpm build
build-agent:
CGO_ENABLED=0 GOOS={{ TARGETOS }} GOARCH={{ TARGETARCH }} go build -tags '{{ TAGS }}' -ldflags '{{ LDFLAGS }}' -o {{ DIST_DIR }}/crow-agent{{ BIN_SUFFIX }} codeberg.org/crowci/crow/v3/cmd/agent
build-cli:
CGO_ENABLED=0 GOOS={{ TARGETOS }} GOARCH={{ TARGETARCH }} go build -tags '{{ TAGS }}' -ldflags '{{ LDFLAGS }}' -o {{ DIST_DIR }}/crow-cli{{ BIN_SUFFIX }} codeberg.org/crowci/crow/v3/cmd/cli
# build-server
# env PLATFORMS=linux/amd64 just build-server
build-server: build-ui vendor
just cross-compile-server
vendor:
go mod tidy
go mod vendor
# build for specific platform: env PLATFORMS='linux|arm64/v8' just cross-compile-server
# build for local platform: just cross-compile-server
cross-compile-server:
#!/usr/bin/env bash
set -euxo pipefail
PLATFORMS="${PLATFORMS:-{{ TARGETOS }}/{{ TARGETARCH }}}"
IFS=';' read -ra PLATFORMS_ARRAY <<< "${PLATFORMS}"
for platform in "${PLATFORMS_ARRAY[@]}"; do
IFS='|' read -ra PLATFORM_PARTS <<< "$platform"
TARGETOS="${PLATFORM_PARTS[0]}"
if [ -n "${PLATFORM_PARTS[1]:-}" ]; then
TARGETARCH_XGO="${PLATFORM_PARTS[1]//arm64\/v8/arm64}"
TARGETARCH_XGO="${TARGETARCH_XGO//arm\/v7/arm-7}"
TARGETARCH="${PLATFORM_PARTS[1]//arm64\/v8/arm64}"
TARGETARCH="${TARGETARCH//arm\/v7/arm}"
else
TARGETARCH_XGO=""
TARGETARCH=""
fi
env TARGETOS=$TARGETOS TARGETARCH=$TARGETARCH TARGETARCH_XGO=$TARGETARCH_XGO just release-server-xgo || exit 1
done
tree "{{ DIST_DIR }}"
check-xgo:
hash xgo > /dev/null 2>&1 || go install src.techknowlogick.com/xgo@latest
# this should not be called directly - use 'cross-compile-server' instead
release-server-xgo: check-xgo
@echo "------------------"
@echo "Building for:"
@echo "- os: ${TARGETOS}"
@echo "- arch (xgo): ${TARGETARCH}"
@echo "------------------"
CGO_CFLAGS="{{ CGO_CFLAGS }}" xgo -go {{ XGO_VERSION }} -dest {{ DIST_DIR }}/server/${TARGETOS}_${TARGETARCH} -tags 'netgo osusergo grpcnotrace {{ TAGS }}' -ldflags '-linkmode external {{ LDFLAGS }} -X codeberg.org/crowci/crow/v3/version.Version={{ VERSION }}' -targets ${TARGETOS}/${TARGETARCH} -out crow-server -pkg cmd/server .
# move binary into subfolder depending on target os and arch
if [ "${XGO_IN_XGO:-0}" -eq "1" ]; then \
echo "inside xgo image"; \
mkdir -p {{ DIST_DIR }}/server/${TARGETOS}_${TARGETARCH}; \
mv -vf /build/crow-server* {{ DIST_DIR }}/server/${TARGETOS}_${TARGETARCH}/crow-server{{ BIN_SUFFIX }}; \
else \
echo "outside xgo image"; \
[ -f "{{ DIST_DIR }}/server/${TARGETOS}_${TARGETARCH}/crow-server{{ BIN_SUFFIX }}" ] && rm -v {{ DIST_DIR }}/server/${TARGETOS}_${TARGETARCH}/crow-server{{ BIN_SUFFIX }}; \
mv -v {{ DIST_DIR }}/server/${TARGETOS}_${TARGETARCH}/crow-server* {{ DIST_DIR }}/server/${TARGETOS}_${TARGETARCH}/crow-server{{ BIN_SUFFIX }}; \
fi
# # Create checksums for all release files
release-checksums:
(cd {{ DIST_DIR }}/; sha256sum *.* > checksums.txt)
release-cli: ## Create cli binaries for release
# compile
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags '{{LDFLAGS}}' -o {{DIST_DIR}}/cli/linux_amd64/crow-cli codeberg.org/crowci/crow/v3/cmd/cli
GOOS=linux GOARCH=arm64 CGO_ENABLED=0 go build -ldflags '{{LDFLAGS}}' -o {{DIST_DIR}}/cli/linux_arm64/crow-cli codeberg.org/crowci/crow/v3/cmd/cli
GOOS=linux GOARCH=arm CGO_ENABLED=0 go build -ldflags '{{LDFLAGS}}' -o {{DIST_DIR}}/cli/linux_arm/crow-cli codeberg.org/crowci/crow/v3/cmd/cli
GOOS=windows GOARCH=amd64 CGO_ENABLED=0 go build -ldflags '{{LDFLAGS}}' -o {{DIST_DIR}}/cli/windows_amd64/crow-cli.exe codeberg.org/crowci/crow/v3/cmd/cli
GOOS=darwin GOARCH=amd64 CGO_ENABLED=0 go build -ldflags '{{LDFLAGS}}' -o {{DIST_DIR}}/cli/darwin_amd64/crow-cli codeberg.org/crowci/crow/v3/cmd/cli
GOOS=darwin GOARCH=arm64 CGO_ENABLED=0 go build -ldflags '{{LDFLAGS}}' -o {{DIST_DIR}}/cli/darwin_arm64/crow-cli codeberg.org/crowci/crow/v3/cmd/cli
# tar binary files
tar -cvzf {{DIST_DIR}}/crow-cli_linux_amd64.tar.gz -C {{DIST_DIR}}/cli/linux_amd64 crow-cli
tar -cvzf {{DIST_DIR}}/crow-cli_linux_arm64.tar.gz -C {{DIST_DIR}}/cli/linux_arm64 crow-cli
tar -cvzf {{DIST_DIR}}/crow-cli_linux_arm.tar.gz -C {{DIST_DIR}}/cli/linux_arm crow-cli
tar -cvzf {{DIST_DIR}}/crow-cli_darwin_amd64.tar.gz -C {{DIST_DIR}}/cli/darwin_amd64 crow-cli
tar -cvzf {{DIST_DIR}}/crow-cli_darwin_arm64.tar.gz -C {{DIST_DIR}}/cli/darwin_arm64 crow-cli
# zip binary files
rm -f {{DIST_DIR}}/crow-cli_windows_amd64.zip
zip -j {{DIST_DIR}}/crow-cli_windows_amd64.zip {{DIST_DIR}}/cli/windows_amd64/crow-cli.exe
## images
# platforms must be handed over via this syntax for the underlying cross-compile-server step which applies some string splitting on a list of items
# env PLATFORMS='linux|amd64;linux|arm64' just image-server
image-server TAG:
just build-ui
just cross-compile-server
echo $codeberg_bot_token | docker login codeberg.org -u crowci-bot --password-stdin
FIXED_PLATFORMS=$(echo $PLATFORMS | sed "s/|/\//g; s/;/,/g") && docker buildx build --platform $FIXED_PLATFORMS -t codeberg.org/crowci/crow-server:{{TAG}} -f docker/Dockerfile.server.multiarch.rootless --push .
# env PLATFORMS='linux|amd64;linux|arm64' just image-server-alpine dev
image-server-alpine TAG:
just build-ui
just cross-compile-server
echo $codeberg_bot_token | docker login codeberg.org -u crowci-bot --password-stdin
FIXED_PLATFORMS=$(echo $PLATFORMS | sed "s/|/\//g; s/;/,/g") && docker buildx build --platform $FIXED_PLATFORMS -t codeberg.org/crowci/crow-server:{{TAG}}-alpine -f docker/Dockerfile.server.alpine.multiarch.rootless --push .
# env PLATFORMS='linux/amd64,linux/arm64' just image-agent
image-agent TAG:
echo $codeberg_bot_token | docker login codeberg.org -u crowci-bot --password-stdin
docker buildx build --platform $PLATFORMS -t codeberg.org/crowci/crow-agent:{{TAG}} -f docker/Dockerfile.agent.multiarch --push .
# env PLATFORMS='linux/amd64,linux/arm64' just image-agent-alpine dev
image-agent-alpine TAG:
echo $codeberg_bot_token | docker login codeberg.org -u crowci-bot --password-stdin
docker buildx build --platform $PLATFORMS -t codeberg.org/crowci/crow-agent:{{TAG}}-alpine -f docker/Dockerfile.agent.alpine.multiarch --push .
# env PLATFORMS='linux/amd64,linux/arm64' just image-cli dev
image-cli TAG:
echo $codeberg_bot_token | docker login codeberg.org -u crowci-bot --password-stdin
docker buildx build --platform $PLATFORMS -t codeberg.org/crowci/crow-cli:{{TAG}} -f docker/Dockerfile.cli.multiarch.rootless --push .
# env PLATFORMS='linux/amd64,linux/arm64' just image-cli-alpine dev
image-cli-alpine TAG:
echo $codeberg_bot_token | docker login codeberg.org -u crowci-bot --password-stdin
docker buildx build --platform $PLATFORMS -t codeberg.org/crowci/crow-cli:{{TAG}}-alpine -f docker/Dockerfile.cli.alpine.multiarch.rootless --push .