Compare commits

...
6 Commits
Author SHA1 Message Date
lukaszraczylo 03860dcb49 fix: skip linux/arm64 binary builds to avoid CGO cross-compilation
Problem:
- linux_amd64 runner was trying to build BOTH:
  - linux/amd64 (native - OK)
  - linux/arm64 (cross-compile with CGO - FAILS)
- Error: gcc_arm64.S assembler errors when cross-compiling ARM64 on x86_64
- Workflow default platforms only include linux/amd64, not linux/arm64

Solution:
- Added linux/arm64 to ignore list in both builds
- Only build linux/amd64 binaries (native compilation on ubuntu-latest)
- Docker images still provide linux/arm64 via multi-stage builds
- Users get ARM64 support through Docker, not standalone binaries

Build matrix now:
-  darwin/arm64 (macOS Apple Silicon) - native on macos-latest
-  linux/amd64 (Linux x86_64) - native on ubuntu-latest
-  linux/arm64 (skipped for binaries, available in Docker)

This eliminates CGO cross-compilation while maintaining full platform support
via Docker multi-arch images.
2026-01-03 22:47:56 +00:00
lukaszraczylo a1ec05b210 fix: add workflow-prepare.sh for CGO SQLite dependencies
Problem:
- CGO builds failing in CI with "cannot find sqlite3.h"
- go-release-cgo.yaml workflow looks for workflow-prepare.sh to install deps
- Script was missing, causing build failures

Solution:
- Created workflow-prepare.sh to install SQLite development headers
- Platform-specific installation:
  - Linux (Ubuntu/Debian): libsqlite3-dev via apt-get
  - Linux (RHEL/CentOS): sqlite-devel via yum
  - Linux (Alpine): sqlite-dev via apk
  - macOS: sqlite3 via Homebrew (if needed)
  - Windows: Downloads SQLite amalgamation, sets CGO_CFLAGS/CGO_LDFLAGS
- Includes verification step to confirm SQLite availability

This script is automatically called by the shared GitHub Actions workflow
before running GoReleaser builds with CGO_ENABLED=1.
2026-01-03 22:41:00 +00:00
lukaszraczylo dc1d507a20 fix: enable binary builds for proper GitHub releases and Helm charts
Problem:
- With builds: skip: true, no artifacts were created
- GoReleaser wasn't creating GitHub releases or tags
- Helm chart workflow wasn't triggered (depends on tags)
- No downloadable binaries for users

Solution:
- Enabled builds for both gohoarder and migrate binaries
- CGO_ENABLED=1 for SQLite support
- Added fts5 tag for full-text search
- Builds run natively per platform in split/merge workflow:
  - darwin/arm64 (Apple Silicon Macs)
  - linux/amd64 (x86_64 Linux)
  - linux/arm64 (ARM64 Linux)
- Ignored darwin/amd64 (Intel Macs) to limit build matrix

How it works:
1. Split phase: Each platform builds natively (no cross-compilation)
2. Merge phase: Combines all artifacts, creates release, builds Docker images
3. Docker images still use multi-stage builds (independent of binaries)
4. GitHub release created with tags
5. Helm chart workflow triggered

Benefits:
- Downloadable binaries for all platforms
- Archives created automatically
- GitHub releases with proper tags
- Helm charts published
- Docker images built separately with multi-stage builds
2026-01-03 22:36:09 +00:00
lukaszraczylo 72f284f987 fix: correct GoReleaser Pro configuration for CGO and Docker builds
Problem:
- Used incorrect field names (use: buildx, build_flag_templates) not supported in GoReleaser v2.13.2
- GitHub Actions workflow using non-CGO release workflow
- Docker builds failing due to invalid configuration

Solution:
- Updated dockers_v2 configuration with correct field names:
  - Removed unsupported `use: buildx` field
  - Changed `build_flag_templates` to `build_args` (map format)
  - Kept `platforms` for multi-arch support (linux/amd64, linux/arm64)
- Updated GitHub Actions workflow to use go-release-cgo.yaml for CGO support
- Build args now passed correctly to Docker builds for version info

Changes:
- .goreleaser.yaml: Fixed all Docker image configurations
- .github/workflows/release.yaml: Changed to go-release-cgo.yaml workflow

Validation:
- goreleaser check: PASSED ✓
- Configuration validated with GoReleaser Pro v2.13.2

References:
- GoReleaser dockers_v2 docs: https://goreleaser.com/customization/dockers_v2/
2026-01-03 22:12:31 +00:00
lukaszraczylo ef11972274 Revert "fix: use free GoReleaser syntax for Docker builds"
This reverts commit 96f9f4a36c.
2026-01-03 22:09:06 +00:00
lukaszraczylo 96f9f4a36c fix: use free GoReleaser syntax for Docker builds
Problem:
- GoReleaser Pro features (use: buildx, build_flag_templates) not available in free version
- CI/CD failing with "field not found in type config.DockerV2" errors

Solution:
- Split each Docker image into separate amd64 and arm64 builds
- Use goarch field to specify architecture
- Use build_flags instead of build_flag_templates
- Add docker_manifests section to combine arch-specific images into multi-arch manifests

Changes:
- Each service now has two Docker image definitions (amd64 and arm64)
- Images tagged with architecture suffix (e.g., v1.0.0-amd64, v1.0.0-arm64)
- Docker manifests combine them into unified tags (e.g., v1.0.0, latest)
- Users can pull multi-arch images normally, Docker will select correct arch

Result:
- Works with free GoReleaser version
- Maintains multi-architecture support
- Multi-stage Dockerfiles compile for each architecture natively
2026-01-03 21:59:28 +00:00
3 changed files with 157 additions and 30 deletions
+1 -2
View File
@@ -20,10 +20,9 @@ permissions:
jobs:
release:
uses: lukaszraczylo/shared-actions/.github/workflows/go-release.yaml@main
uses: lukaszraczylo/shared-actions/.github/workflows/go-release-cgo.yaml@main
with:
go-version: "1.25"
docker-enabled: true
secrets: inherit
benchmark:
+78 -28
View File
@@ -13,13 +13,60 @@ before:
# - ./script/generate-version.sh
# Build configuration
# Note: Binaries are built inside Docker containers (multi-stage builds)
# to avoid CGO cross-compilation issues. No standalone builds here.
# Builds run natively per-platform in split mode (no CGO cross-compilation)
# Docker images also use multi-stage builds independently
builds:
- id: gohoarder
skip: true
main: ./cmd/gohoarder
binary: gohoarder
env:
- CGO_ENABLED=1
tags:
- fts5
flags:
- -trimpath
ldflags:
- -s -w
- -X github.com/lukaszraczylo/gohoarder/internal/version.Version={{.Version}}
- -X github.com/lukaszraczylo/gohoarder/internal/version.GitCommit={{.ShortCommit}}
- -X github.com/lukaszraczylo/gohoarder/internal/version.BuildTime={{.Date}}
goos:
- linux
- darwin
goarch:
- amd64
- arm64
ignore:
- goos: darwin
goarch: amd64
- goos: linux
goarch: arm64 # Skip linux/arm64 binaries (Docker handles multi-arch)
- id: migrate
skip: true
main: ./cmd/migrate
binary: migrate
env:
- CGO_ENABLED=1
tags:
- fts5
flags:
- -trimpath
ldflags:
- -s -w
- -X main.Version={{.Version}}
- -X main.GitCommit={{.ShortCommit}}
- -X main.BuildTime={{.Date}}
goos:
- linux
- darwin
goarch:
- amd64
- arm64
ignore:
- goos: darwin
goarch: amd64
- goos: linux
goarch: arm64 # Skip linux/arm64 binaries (Docker handles multi-arch)
# Archives for releases
archives:
@@ -79,14 +126,15 @@ release:
dockers_v2:
# 1. Application Engine - Main GoHoarder server
- id: gohoarder-server
use: buildx
images:
- ghcr.io/lukaszraczylo/gohoarder-server
build_flag_templates:
- "--platform=linux/amd64,linux/arm64"
- "--build-arg=VERSION={{ .Version }}"
- "--build-arg=GIT_COMMIT={{ .ShortCommit }}"
- "--build-arg=BUILD_TIME={{ .Date }}"
platforms:
- linux/amd64
- linux/arm64
build_args:
VERSION: "{{ .Version }}"
GIT_COMMIT: "{{ .ShortCommit }}"
BUILD_TIME: "{{ .Date }}"
tags:
- "{{ .Version }}"
- latest
@@ -104,11 +152,11 @@ dockers_v2:
# 2. Website - Frontend Dashboard
- id: gohoarder-frontend
use: buildx
images:
- ghcr.io/lukaszraczylo/gohoarder-frontend
build_flag_templates:
- "--platform=linux/amd64,linux/arm64"
platforms:
- linux/amd64
- linux/arm64
tags:
- "{{ .Version }}"
- latest
@@ -126,14 +174,15 @@ dockers_v2:
# 3. Scanning Engine - Background scanner worker
- id: gohoarder-scanner
use: buildx
images:
- ghcr.io/lukaszraczylo/gohoarder-scanner
build_flag_templates:
- "--platform=linux/amd64,linux/arm64"
- "--build-arg=VERSION={{ .Version }}"
- "--build-arg=GIT_COMMIT={{ .ShortCommit }}"
- "--build-arg=BUILD_TIME={{ .Date }}"
platforms:
- linux/amd64
- linux/arm64
build_args:
VERSION: "{{ .Version }}"
GIT_COMMIT: "{{ .ShortCommit }}"
BUILD_TIME: "{{ .Date }}"
tags:
- "{{ .Version }}"
- latest
@@ -151,11 +200,11 @@ dockers_v2:
# 4. Gateway - Nginx reverse proxy for unified deployment
- id: gohoarder-gateway
use: buildx
images:
- ghcr.io/lukaszraczylo/gohoarder-gateway
build_flag_templates:
- "--platform=linux/amd64,linux/arm64"
platforms:
- linux/amd64
- linux/arm64
tags:
- "{{ .Version }}"
- latest
@@ -171,14 +220,15 @@ dockers_v2:
# 5. Migration Engine - Database migration tool
- id: gohoarder-migrate
use: buildx
images:
- ghcr.io/lukaszraczylo/gohoarder-migrate
build_flag_templates:
- "--platform=linux/amd64,linux/arm64"
- "--build-arg=VERSION={{ .Version }}"
- "--build-arg=GIT_COMMIT={{ .ShortCommit }}"
- "--build-arg=BUILD_TIME={{ .Date }}"
platforms:
- linux/amd64
- linux/arm64
build_args:
VERSION: "{{ .Version }}"
GIT_COMMIT: "{{ .ShortCommit }}"
BUILD_TIME: "{{ .Date }}"
tags:
- "{{ .Version }}"
- latest
+78
View File
@@ -0,0 +1,78 @@
#!/bin/bash
# Workflow prepare script for CI/CD
# Installs CGO dependencies for SQLite support
set -e
echo "=== GoHoarder Workflow Prepare ==="
echo "Host OS: $(uname -s)"
echo "Target GOOS: ${TARGET_GOOS:-auto}"
echo "Target GOARCH: ${TARGET_GOARCH:-auto}"
# Detect host OS
HOST_OS=$(uname -s | tr '[:upper:]' '[:lower:]')
# Install SQLite development headers based on platform
case "$HOST_OS" in
linux*)
echo "Installing SQLite development headers for Linux..."
if command -v apt-get &> /dev/null; then
# Ubuntu/Debian
sudo apt-get update -qq
sudo apt-get install -y -qq libsqlite3-dev
elif command -v yum &> /dev/null; then
# RHEL/CentOS
sudo yum install -y sqlite-devel
elif command -v apk &> /dev/null; then
# Alpine
sudo apk add --no-cache sqlite-dev
fi
echo "✓ SQLite headers installed"
;;
darwin*)
echo "Installing SQLite for macOS..."
# macOS usually has SQLite via Xcode Command Line Tools
# but ensure it's available via Homebrew if needed
if ! pkg-config --exists sqlite3; then
brew install sqlite3
fi
echo "✓ SQLite available"
;;
mingw*|msys*|cygwin*)
echo "Installing SQLite for Windows..."
# Download SQLite amalgamation for Windows
SQLITE_VERSION="3470200"
SQLITE_YEAR="2024"
SQLITE_DIR="/c/sqlite"
SQLITE_URL="https://www.sqlite.org/${SQLITE_YEAR}/sqlite-amalgamation-${SQLITE_VERSION}.zip"
mkdir -p "$SQLITE_DIR"
curl -sSL "$SQLITE_URL" -o /tmp/sqlite.zip
unzip -q /tmp/sqlite.zip -d /tmp/
cp /tmp/sqlite-amalgamation-${SQLITE_VERSION}/* "$SQLITE_DIR/"
rm -rf /tmp/sqlite.zip /tmp/sqlite-amalgamation-${SQLITE_VERSION}
echo "CGO_CFLAGS=-I${SQLITE_DIR}" >> "$GITHUB_ENV"
echo "CGO_LDFLAGS=-L${SQLITE_DIR}" >> "$GITHUB_ENV"
echo "✓ SQLite setup complete"
;;
*)
echo "Unknown OS: $HOST_OS - skipping SQLite setup"
;;
esac
# Verify SQLite is available
echo ""
echo "=== Verifying SQLite availability ==="
if pkg-config --exists sqlite3; then
echo "✓ SQLite pkg-config found"
pkg-config --modversion sqlite3
else
echo "⚠ SQLite pkg-config not found (may still work via system headers)"
fi
echo ""
echo "=== Workflow prepare complete ==="