version: "3"
env:
PKGOS: linux
PKGARCH: amd64
PKGNAME: nano-web
RELEASEDIR: ./release
CGO_ENABLED: 0
vars:
VERSION:
sh: cat VERSION 2>/dev/null || echo "dev"
COMMIT:
sh: git rev-parse --short HEAD
BUILD_TIME:
sh: date -u +"%Y-%m-%dT%H:%M:%SZ"
LDFLAGS: -s -w -X main.version={{.VERSION}} -X main.commit={{.COMMIT}} -X main.buildTime={{.BUILD_TIME}}
PKGRELEASE: "{{.PKGNAME}}_{{.VERSION}}"
PKGDIR: "{{.RELEASEDIR}}/{{.PKGRELEASE}}-{{.PKGARCH}}"
tasks:
default:
desc: "Show available tasks"
cmd: task --list
dev:
desc: "๐ Run development server"
deps: [build]
cmd: ./{{.PKGNAME}} --dev --port 3000 --log-format console --log-level debug
run:
desc: "๐ Run with go run"
cmd: go run . --port 3000 --log-format console --log-level debug
build:
desc: "๐๏ธ Build binary"
sources:
- "*.go"
- "go.mod"
- "go.sum"
generates:
- "{{.PKGNAME}}"
cmd: go build -ldflags="{{.LDFLAGS}}" -o {{.PKGNAME}} ./
build-all:
desc: "๐ Build for all platforms"
deps: [clean-dist]
cmds:
- mkdir -p dist
- GOOS=linux GOARCH=amd64 go build -ldflags="{{.LDFLAGS}}" -o dist/{{.PKGNAME}}-linux-amd64 .
- GOOS=linux GOARCH=arm64 go build -ldflags="{{.LDFLAGS}}" -o dist/{{.PKGNAME}}-linux-arm64 .
- GOOS=darwin GOARCH=amd64 go build -ldflags="{{.LDFLAGS}}" -o dist/{{.PKGNAME}}-darwin-amd64 .
- GOOS=darwin GOARCH=arm64 go build -ldflags="{{.LDFLAGS}}" -o dist/{{.PKGNAME}}-darwin-arm64 .
- GOOS=windows GOARCH=amd64 go build -ldflags="{{.LDFLAGS}}" -o dist/{{.PKGNAME}}-windows-amd64.exe .
- GOOS=freebsd GOARCH=amd64 go build -ldflags="{{.LDFLAGS}}" -o dist/{{.PKGNAME}}-freebsd-amd64 .
test:
desc: "๐งช Run tests"
env:
CGO_ENABLED: 1
cmd: go test -v -race .
test-coverage:
desc: "๐ Run tests with coverage"
env:
CGO_ENABLED: 1
cmds:
- go test -v -race -coverprofile=coverage.out -covermode=atomic ./
- go tool cover -html=coverage.out -o coverage.html
- echo "Coverage report generated coverage.html"
bench:
desc: "๐ฅ Run benchmarks"
env:
CGO_ENABLED: 1
cmd: go test -bench=. -benchmem -count=3 .
lint:
desc: "๐ Run linter"
cmd: golangci-lint run ./...
fmt:
desc: "โจ Format code"
cmds:
- go fmt ./...
- goimports -w .
vet:
desc: "๐ Run go vet"
cmd: go vet ./...
check:
desc: "โ
Run all checks"
cmds:
- task: test
- task: lint
- task: vet
deps:
desc: "๐ฆ Download dependencies"
cmd: go mod download
deps-update:
desc: "โฌ๏ธ Update dependencies"
cmds:
- go get -u ./...
- go mod tidy
clean:
desc: "๐งน Clean build artifacts"
cmds:
- rm -f {{.PKGNAME}}
- rm -f coverage.out coverage.html
clean-dist:
desc: "๐๏ธ Clean dist directory"
cmd: rm -rf dist/
clean-all:
desc: "๐ฅ Clean everything"
deps: [clean, clean-dist, pkg-clean]
docker-build:
desc: "๐ณ Build Docker image"
cmd: docker build -t {{.PKGNAME}}:{{.VERSION}} -t {{.PKGNAME}}:latest .
docker-run:
desc: "๐ข Run Docker container"
deps: [docker-build]
cmd: docker run --rm -p 3000:3000 -e PORT=3000 {{.PKGNAME}}:latest
release-local:
desc: "๐ Create local release"
deps: [build-all]
cmds:
- mkdir -p {{.RELEASEDIR}}
- cd dist && for file in {{.PKGNAME}}-*; do tar -czf ../{{.RELEASEDIR}}/$file.tar.gz $file; done
- cd {{.RELEASEDIR}} && sha256sum *.tar.gz > checksums.txt
- echo "Local release created in release dir"
pkg-clean:
desc: "๐งน Clean package artifacts"
cmd: rm -rf {{.RELEASEDIR}}
pkg-build:
desc: "๐ฆ Build OPS package binary"
env:
GOOS: "{{.PKGOS}}"
GOARCH: "{{.PKGARCH}}"
cmd: |
mkdir -p {{.PKGDIR}}
go build -ldflags="{{.LDFLAGS}}" -o {{.PKGDIR}}/{{.PKGNAME}} .
pkg-create:
desc: "๐ Create OPS package structure"
deps: [pkg-clean]
cmds:
- mkdir -p {{.PKGDIR}}/sysroot/public
- |
cat > {{.PKGDIR}}/package.manifest << EOF
{
"Program":"{{.PKGRELEASE}}/{{.PKGNAME}}",
"Args" : ["{{.PKGNAME}}"],
"Version":"{{.VERSION}}"
}
EOF
- cp README.md {{.PKGDIR}}/
pkg-add:
desc: "โ Add OPS package"
deps: [pkg-create, pkg-build]
cmd: ops pkg add {{.PKGDIR}} --name {{.PKGRELEASE}}
pkg-bundle:
desc: "๐ฆ Bundle OPS package"
deps: [pkg-add]
cmds:
- cd {{.RELEASEDIR}} && tar czvf {{.PKGRELEASE}}-{{.PKGARCH}}.tar.gz {{.PKGRELEASE}}-{{.PKGARCH}}
- echo "Package bundle created"
pkg-push:
desc: "๐ค Push OPS package"
deps: [pkg-add]
cmd: ops pkg push {{.PKGRELEASE}}
pkg-load:
desc: "๐ Load and run OPS package"
deps: [pkg-add]
cmd: ops pkg load -l {{.PKGRELEASE}} -p 80
current-version:
desc: "๐ Show current version from file"
cmd: cat VERSION
publish:
desc: "๐ก Publish module to Go proxy"
vars:
VERSION: "{{.VERSION}}"
cmd: GOPROXY=proxy.golang.org go list -m github.com/radiosilence/nano-web@v{{.VERSION}}
publish-current:
desc: "๐ก Publish current version to Go proxy"
cmd: GOPROXY=proxy.golang.org go list -m github.com/radiosilence/nano-web@v{{.VERSION}}
version:
desc: "๐ Show version"
cmd: echo "Version {{.VERSION}} Commit {{.COMMIT}} Built {{.BUILD_TIME}}"
info:
desc: "โน๏ธ Show project info"
cmds:
- echo "Project {{.PKGNAME}}"
- echo "Version {{.VERSION}}"
- echo "Commit {{.COMMIT}}"
- echo "Build Time {{.BUILD_TIME}}"
- go version
- echo "Platform {{OS}}/{{ARCH}}"
update-changelog:
desc: "๐ Update CHANGELOG.md with current version"
cmd: ./scripts/update-changelog.sh {{.VERSION}}
release:
desc: "Create and push a semantic version release (usage: task release -- major|minor|patch)"
silent: true
cmds:
- |
CLI_ARGS="{{.CLI_ARGS}}"
VERSION_TYPE=$(echo "$CLI_ARGS" | awk '{print $1}')
VERSION_TYPE="${VERSION_TYPE:-patch}"
CURRENT_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
if [ -z "$CURRENT_TAG" ]; then
CURRENT_VERSION="0.0.0"
else
CURRENT_VERSION=$(echo "$CURRENT_TAG" | sed 's/^v//')
fi
echo "Current version: $CURRENT_VERSION"
IFS='.' read -r MAJOR MINOR PATCH <<< "$CURRENT_VERSION"
# Ensure components are numbers
MAJOR=${MAJOR:-0}
MINOR=${MINOR:-0}
PATCH=${PATCH:-0}
case "$VERSION_TYPE" in
major)
MAJOR=$((MAJOR + 1))
MINOR=0
PATCH=0
;;
minor)
MINOR=$((MINOR + 1))
PATCH=0
;;
patch)
PATCH=$((PATCH + 1))
;;
*)
echo "Usage: task release -- major|minor|patch"
exit 1
;;
esac
NEW_VERSION="$MAJOR.$MINOR.$PATCH"
NEW_TAG="v$NEW_VERSION"
echo "Creating release $NEW_TAG (was v$CURRENT_VERSION)"
# Update VERSION file
echo "$NEW_VERSION" > VERSION
# Update changelog
echo "๐ Updating changelog..."
./scripts/update-changelog.sh "$NEW_VERSION" "$CURRENT_VERSION"
# Commit version and changelog updates
git add VERSION CHANGELOG.md
git commit -m "Bump version to $NEW_VERSION"
# Create and push tag
git tag -a "$NEW_TAG" -m "Release $NEW_TAG"
git push origin main
git push origin "$NEW_TAG"
echo "Release $NEW_TAG created and pushed!"
echo "๐ก Publishing to Go module proxy..."
GOPROXY=proxy.golang.org go list -m github.com/radiosilence/nano-web@$NEW_TAG
echo "๐ฆ Version $NEW_VERSION is now live and published!"
echo "GitHub Actions will build the release and update Homebrew automatically."
ci:
desc: "๐ค Run CI pipeline"
cmds:
- task: deps
- task: check
- task: build-all
- echo "CI completed successfully"