- Makefile: Update build targets for native library integration - build.zig: Add SQLite linking and native hash library support - scripts/build_rsync.sh: Update rsync embedded binary build process - scripts/build_sqlite.sh: Add SQLite constants generation script - src/assets/README.md: Document embedded asset structure - src/utils/rsync_embedded_binary.zig: Update for new build layout
230 lines
7 KiB
YAML
230 lines
7 KiB
YAML
name: Mirror Release to GitHub
|
|
|
|
on:
|
|
push:
|
|
tags:
|
|
- 'v*'
|
|
workflow_dispatch:
|
|
|
|
env:
|
|
GO_VERSION: '1.25.0'
|
|
ZIG_VERSION: '0.15.2'
|
|
GH_MIRROR_REPO: ${{ vars.GH_MIRROR_REPO }}
|
|
|
|
jobs:
|
|
prepare_rsync:
|
|
name: Prepare rsync metadata
|
|
runs-on: self-hosted
|
|
outputs:
|
|
matrix: ${{ steps.manifest.outputs.matrix }}
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@v5
|
|
|
|
- name: Install jq
|
|
run: |
|
|
sudo apt-get update
|
|
sudo apt-get install -y jq
|
|
|
|
- name: Load rsync manifest
|
|
id: manifest
|
|
run: |
|
|
MANIFEST=.gitea/rsync_manifest.json
|
|
MATRIX=$(jq -c '
|
|
. as $cfg
|
|
| $cfg.platforms
|
|
| to_entries
|
|
| map({
|
|
platform: .key,
|
|
target: .value.target,
|
|
"rsync-url": ($cfg.base_url + "/" + $cfg.version + "/" + .value.asset),
|
|
"rsync-sha256": .value.sha256
|
|
})
|
|
' "$MANIFEST")
|
|
printf 'matrix={"include":%s}\n' "$MATRIX" >> "$GITHUB_OUTPUT"
|
|
|
|
build-cli:
|
|
name: Build CLI - ${{ matrix.platform }}
|
|
needs: prepare_rsync
|
|
runs-on: self-hosted
|
|
strategy:
|
|
matrix: ${{ fromJson(needs.prepare_rsync.outputs.matrix) }}
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@v5
|
|
|
|
- name: Set up Zig
|
|
uses: goto-bus-stop/setup-zig@v2
|
|
with:
|
|
version: ${{ env.ZIG_VERSION }}
|
|
|
|
- name: Download static rsync
|
|
run: |
|
|
mkdir -p cli/src/assets
|
|
TARGET="${{ matrix.target }}"
|
|
OS=""
|
|
ARCH=""
|
|
case "$TARGET" in
|
|
x86_64-linux-*) OS="linux"; ARCH="x86_64" ;;
|
|
aarch64-linux-*) OS="linux"; ARCH="arm64" ;;
|
|
x86_64-macos*) OS="darwin"; ARCH="x86_64" ;;
|
|
aarch64-macos*) OS="darwin"; ARCH="arm64" ;;
|
|
x86_64-windows*) OS="windows"; ARCH="x86_64" ;;
|
|
aarch64-windows*) OS="windows"; ARCH="arm64" ;;
|
|
*) echo "Unsupported Zig target: $TARGET"; exit 1 ;;
|
|
esac
|
|
|
|
RSYNC_OUT="cli/src/assets/rsync/rsync_release_${OS}_${ARCH}.bin"
|
|
|
|
wget -O "$RSYNC_OUT" ${{ matrix.rsync-url }} || \
|
|
curl -L -o "$RSYNC_OUT" ${{ matrix.rsync-url }}
|
|
|
|
echo "${{ matrix.rsync-sha256 }} $RSYNC_OUT" | sha256sum -c
|
|
chmod +x "$RSYNC_OUT"
|
|
ls -lh "$RSYNC_OUT"
|
|
|
|
- name: Download SQLite amalgamation
|
|
run: |
|
|
TARGET="${{ matrix.target }}"
|
|
OS=""
|
|
ARCH=""
|
|
case "$TARGET" in
|
|
x86_64-linux-*) OS="linux"; ARCH="x86_64" ;;
|
|
aarch64-linux-*) OS="linux"; ARCH="arm64" ;;
|
|
x86_64-macos*) OS="darwin"; ARCH="x86_64" ;;
|
|
aarch64-macos*) OS="darwin"; ARCH="arm64" ;;
|
|
x86_64-windows*) OS="windows"; ARCH="x86_64" ;;
|
|
aarch64-windows*) OS="windows"; ARCH="arm64" ;;
|
|
*) echo "Unsupported Zig target: $TARGET"; exit 1 ;;
|
|
esac
|
|
|
|
SQLITE_VERSION="3480000"
|
|
SQLITE_YEAR="2025"
|
|
SQLITE_URL="https://www.sqlite.org/${SQLITE_YEAR}/sqlite-amalgamation-${SQLITE_VERSION}.zip"
|
|
SQLITE_DIR="cli/src/assets/sqlite_${OS}_${ARCH}"
|
|
|
|
mkdir -p "$SQLITE_DIR"
|
|
|
|
echo "Fetching SQLite ${SQLITE_VERSION}..."
|
|
wget -O /tmp/sqlite.zip "$SQLITE_URL" || \
|
|
curl -L -o /tmp/sqlite.zip "$SQLITE_URL"
|
|
|
|
unzip -q /tmp/sqlite.zip -d /tmp/
|
|
mv /tmp/sqlite-amalgamation-${SQLITE_VERSION}/* "$SQLITE_DIR/"
|
|
|
|
ls -lh "$SQLITE_DIR"/sqlite3.c "$SQLITE_DIR"/sqlite3.h
|
|
|
|
- name: Build CLI
|
|
working-directory: cli
|
|
run: |
|
|
zig build --release=small -Dtarget=${{ matrix.target }}
|
|
ls -lh zig-out/bin/ml
|
|
|
|
- name: Strip binary (Linux only)
|
|
if: matrix.platform == 'linux-x86_64'
|
|
working-directory: cli
|
|
run: strip zig-out/bin/ml
|
|
|
|
- name: Package binary
|
|
run: |
|
|
mkdir -p dist
|
|
cp cli/zig-out/bin/ml dist/ml-${{ matrix.platform }}
|
|
cd dist
|
|
tar -czf ml-${{ matrix.platform }}.tar.gz ml-${{ matrix.platform }}
|
|
sha256sum ml-${{ matrix.platform }}.tar.gz > ml-${{ matrix.platform }}.tar.gz.sha256
|
|
|
|
- name: Upload build artifact
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: ml-${{ matrix.platform }}
|
|
path: |
|
|
dist/ml-${{ matrix.platform }}.tar.gz
|
|
dist/ml-${{ matrix.platform }}.tar.gz.sha256
|
|
|
|
build-go-backends:
|
|
name: Build Go Backends
|
|
runs-on: self-hosted
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@v5
|
|
|
|
- name: Set up Go
|
|
run: |
|
|
REQUIRED_GO="${GO_VERSION}"
|
|
if command -v go &> /dev/null && go version | grep -q "go${REQUIRED_GO}"; then
|
|
echo "Go ${REQUIRED_GO} already installed - skipping download"
|
|
else
|
|
echo "Installing Go ${REQUIRED_GO}..."
|
|
curl -sL "https://go.dev/dl/go${REQUIRED_GO}.linux-amd64.tar.gz" | sudo tar -C /usr/local -xzf -
|
|
export PATH="/usr/local/go/bin:$PATH"
|
|
echo "/usr/local/go/bin" >> $GITHUB_PATH
|
|
echo "Go ${REQUIRED_GO} installed"
|
|
fi
|
|
go version
|
|
|
|
- name: Build binaries
|
|
run: |
|
|
make cross-platform
|
|
ls -lh dist/
|
|
|
|
- name: Package binaries
|
|
run: |
|
|
cd dist
|
|
for binary in fetch_ml_*; do
|
|
if [[ -f "${binary}" ]]; then
|
|
tar -czf "${binary}.tar.gz" "${binary}"
|
|
sha256sum "${binary}.tar.gz" > "${binary}.tar.gz.sha256"
|
|
fi
|
|
done
|
|
|
|
- name: Upload build artifacts
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: go-backends
|
|
path: |
|
|
dist/*.tar.gz
|
|
dist/*.sha256
|
|
|
|
mirror-github-release:
|
|
name: Mirror release to GitHub
|
|
needs: [build-cli, build-go-backends]
|
|
runs-on: self-hosted
|
|
steps:
|
|
- name: Validate mirror configuration
|
|
env:
|
|
GH_TOKEN: ${{ secrets.GH_MIRROR_TOKEN }}
|
|
run: |
|
|
if [ -z "${GH_MIRROR_REPO}" ]; then
|
|
echo "Missing required variable GH_MIRROR_REPO (expected like 'jfraeysd/fetch_ml')"
|
|
exit 1
|
|
fi
|
|
if [ -z "${GH_TOKEN}" ]; then
|
|
echo "Missing required secret GH_MIRROR_TOKEN"
|
|
exit 1
|
|
fi
|
|
|
|
- name: Download all artifacts
|
|
uses: actions/download-artifact@v4
|
|
with:
|
|
path: artifacts
|
|
|
|
- name: Prepare release assets
|
|
run: |
|
|
mkdir -p release
|
|
cp artifacts/ml-*/ml-*.tar.gz* release/
|
|
cp artifacts/go-backends/*.tar.gz* release/
|
|
|
|
cd release
|
|
sha256sum *.tar.gz > checksums.txt
|
|
ls -lh
|
|
|
|
- name: Create GitHub Release
|
|
uses: softprops/action-gh-release@v2
|
|
with:
|
|
repository: ${{ env.GH_MIRROR_REPO }}
|
|
files: release/*
|
|
generate_release_notes: true
|
|
draft: false
|
|
prerelease: false
|
|
env:
|
|
GITHUB_TOKEN: ${{ secrets.GH_MIRROR_TOKEN }}
|