mirror of
https://codeberg.org/crowci/crow.git
synced 2025-04-18 04:44:01 +03:00
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>
269 lines
12 KiB
Makefile
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 .
|