Found by actually running ci.yml on the real Gitea instance: the go job failed at go vet with "wayland-client-core.h: No such file or directory" building go-gl/glfw (a Fyne dependency), which compiles in both its X11 and Wayland backends by default. libgl1-mesa-dev + xorg-dev alone aren't enough; added libwayland-dev and libxkbcommon-dev to both ci.yml and release.yml's linux packages list. I'd only verified cmd/gui's build on macOS and via the Windows mingw-w64 cross-compile - never on an actual Linux machine, so this gap wasn't visible until the real CI run hit it. sqlc, web and docker all passed on that same run (confirmed from the job logs, not just the status column). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
218 lines
6.6 KiB
YAML
218 lines
6.6 KiB
YAML
#
|
|
# .gitea/workflows/release.yml
|
|
#
|
|
# On a version tag (e.g. v1.2.3): builds every client, pushes the API's
|
|
# Docker image, uploads all build artifacts to the Gitea generic package
|
|
# registry, and creates a Gitea release with those same files attached.
|
|
#
|
|
name: Release
|
|
|
|
on:
|
|
push:
|
|
tags: ["v*.*.*"]
|
|
|
|
env:
|
|
PROJECT_NAME: Completed
|
|
REGISTRY: gitea.sanplex.xyz
|
|
REGISTRY_OWNER: sansan
|
|
|
|
jobs:
|
|
# cmd/api and cmd/tui are pure Go (no cgo), so they cross-compile cleanly
|
|
# from one Linux runner for every OS/arch below.
|
|
build-go:
|
|
runs-on: ubuntu-latest
|
|
strategy:
|
|
matrix:
|
|
include:
|
|
- goos: linux
|
|
goarch: amd64
|
|
- goos: linux
|
|
goarch: arm64
|
|
- goos: darwin
|
|
goarch: amd64
|
|
- goos: darwin
|
|
goarch: arm64
|
|
- goos: windows
|
|
goarch: amd64
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- uses: actions/setup-go@v5
|
|
with:
|
|
go-version-file: go.mod
|
|
|
|
- name: Build api and tui
|
|
env:
|
|
GOOS: ${{ matrix.goos }}
|
|
GOARCH: ${{ matrix.goarch }}
|
|
CGO_ENABLED: "0"
|
|
run: |
|
|
mkdir -p dist
|
|
ext=""
|
|
if [ "${{ matrix.goos }}" = "windows" ]; then ext=".exe"; fi
|
|
go build -o "dist/completed-api${ext}" ./cmd/api
|
|
go build -o "dist/completed-tui${ext}" ./cmd/tui
|
|
|
|
- name: Archive
|
|
run: |
|
|
cd dist
|
|
base="${PROJECT_NAME}_${{ matrix.goos }}_${{ matrix.goarch }}"
|
|
if [ "${{ matrix.goos }}" = "windows" ]; then
|
|
zip "../${base}.zip" completed-api.exe completed-tui.exe
|
|
else
|
|
tar czf "../${base}.tar.gz" completed-api completed-tui
|
|
fi
|
|
|
|
- uses: actions/upload-artifact@v4
|
|
with:
|
|
name: ${{ env.PROJECT_NAME }}_${{ matrix.goos }}_${{ matrix.goarch }}
|
|
path: ${{ env.PROJECT_NAME }}_${{ matrix.goos }}_${{ matrix.goarch }}.*
|
|
retention-days: 7
|
|
|
|
# cmd/gui (Fyne) uses cgo, so unlike build-go above it can't just cross-
|
|
# compile with CGO_ENABLED=0. Linux is native to this runner; Windows
|
|
# cross-compiles cleanly with the mingw-w64 toolchain (verified locally:
|
|
# a real PE32+ GUI-subsystem .exe, linking Fyne's OpenGL/glfw backend,
|
|
# with no changes needed beyond CC and the usual GOOS/GOARCH). macOS
|
|
# isn't included - cross-compiling cgo to Darwin from Linux has no
|
|
# equivalent well-supported toolchain, so that would need an actual
|
|
# macOS runner, which isn't registered for this repo.
|
|
build-gui:
|
|
runs-on: ubuntu-latest
|
|
strategy:
|
|
matrix:
|
|
include:
|
|
- goos: linux
|
|
goarch: amd64
|
|
packages: libgl1-mesa-dev xorg-dev libwayland-dev libxkbcommon-dev
|
|
- goos: windows
|
|
goarch: amd64
|
|
packages: gcc-mingw-w64-x86-64
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- uses: actions/setup-go@v5
|
|
with:
|
|
go-version-file: go.mod
|
|
|
|
- name: Install system dependencies
|
|
run: |
|
|
sudo apt-get update
|
|
sudo apt-get install -y ${{ matrix.packages }}
|
|
|
|
- name: Build gui
|
|
env:
|
|
GOOS: ${{ matrix.goos }}
|
|
GOARCH: ${{ matrix.goarch }}
|
|
CGO_ENABLED: "1"
|
|
run: |
|
|
mkdir -p dist
|
|
if [ "${{ matrix.goos }}" = "windows" ]; then
|
|
CC=x86_64-w64-mingw32-gcc go build -ldflags "-H=windowsgui" -o dist/completed-gui.exe ./cmd/gui
|
|
else
|
|
go build -o dist/completed-gui ./cmd/gui
|
|
fi
|
|
|
|
- name: Archive
|
|
run: |
|
|
cd dist
|
|
base="../${PROJECT_NAME}-gui_${{ matrix.goos }}_${{ matrix.goarch }}"
|
|
if [ "${{ matrix.goos }}" = "windows" ]; then
|
|
zip "${base}.zip" completed-gui.exe
|
|
else
|
|
tar czf "${base}.tar.gz" completed-gui
|
|
fi
|
|
|
|
- uses: actions/upload-artifact@v4
|
|
with:
|
|
name: ${{ env.PROJECT_NAME }}-gui_${{ matrix.goos }}_${{ matrix.goarch }}
|
|
path: ${{ env.PROJECT_NAME }}-gui_${{ matrix.goos }}_${{ matrix.goarch }}.*
|
|
retention-days: 7
|
|
|
|
build-web:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- uses: actions/setup-node@v4
|
|
with:
|
|
node-version: "22"
|
|
cache: npm
|
|
cache-dependency-path: web/package-lock.json
|
|
|
|
- name: Build
|
|
working-directory: web
|
|
run: |
|
|
npm ci
|
|
npm run build
|
|
|
|
- name: Archive
|
|
run: tar czf ${PROJECT_NAME}-web_dist.tar.gz -C web/dist/web/browser .
|
|
|
|
- uses: actions/upload-artifact@v4
|
|
with:
|
|
name: ${{ env.PROJECT_NAME }}-web_dist
|
|
path: ${{ env.PROJECT_NAME }}-web_dist.tar.gz
|
|
retention-days: 7
|
|
|
|
# Builds and pushes the API's image, which embeds the web build as its
|
|
# static UI (see the Dockerfile and cmd/api/main.go's registerWebUI).
|
|
build-docker:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: Set up Docker Buildx
|
|
uses: docker/setup-buildx-action@v3
|
|
with:
|
|
config-inline: |
|
|
[registry."${{ env.REGISTRY }}/${{ env.REGISTRY_OWNER }}"]
|
|
http = true
|
|
insecure = true
|
|
|
|
- name: Login to Gitea
|
|
uses: docker/login-action@v2
|
|
with:
|
|
registry: ${{ env.REGISTRY }}
|
|
username: ${{ github.repository_owner }}
|
|
password: ${{ secrets.TOKEN }}
|
|
|
|
- name: Build and push
|
|
uses: docker/build-push-action@v5
|
|
with:
|
|
context: .
|
|
file: ./Dockerfile
|
|
push: true
|
|
tags: |
|
|
${{ env.REGISTRY }}/${{ env.REGISTRY_OWNER }}/completed:${{ gitea.ref_name }}
|
|
${{ env.REGISTRY }}/${{ env.REGISTRY_OWNER }}/completed:latest
|
|
|
|
release:
|
|
needs: [build-go, build-gui, build-web]
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/download-artifact@v4
|
|
with:
|
|
path: artifacts
|
|
merge-multiple: true
|
|
|
|
- name: Upload to the Gitea generic package registry
|
|
env:
|
|
VERSION: ${{ gitea.ref_name }}
|
|
run: |
|
|
for f in artifacts/*; do
|
|
name="$(basename "$f")"
|
|
echo "Uploading $name"
|
|
curl --fail --user "${{ github.repository_owner }}:${{ secrets.TOKEN }}" \
|
|
--upload-file "$f" \
|
|
"https://${{ env.REGISTRY }}/api/packages/${{ env.REGISTRY_OWNER }}/generic/${{ env.PROJECT_NAME }}/${VERSION}/${name}"
|
|
done
|
|
|
|
- name: Create release
|
|
uses: akkuman/gitea-release-action@v1
|
|
env:
|
|
NODE_OPTIONS: "--experimental-fetch" # if nodejs < 18
|
|
with:
|
|
files: |-
|
|
artifacts/**
|