Skip to content

fixed lint

fixed lint #14

name: Release Shared Library
on:
push:
branches: [main]
tags: ['v*']
paths:
- "java/**"
- "src/chrondb/lib/**"
- "bindings/**"
- "dev/chrondb/shared_library.clj"
workflow_dispatch:
jobs:
build-shared-lib:
runs-on: ${{ matrix.os }}
name: "Build shared library on ${{ matrix.os }}"
strategy:
matrix:
os: ["macos-14", "ubuntu-22.04"]
include:
- os: macos-14
arch: aarch64
- os: ubuntu-22.04
arch: x86_64
outputs:
version: ${{ steps.version.outputs.version }}
release_tag: ${{ steps.version.outputs.release_tag }}
prerelease: ${{ steps.version.outputs.prerelease }}
steps:
- uses: actions/checkout@v4
- name: Determine version
id: version
run: |
if [[ "$GITHUB_REF" == refs/tags/v* ]]; then
VERSION="${GITHUB_REF_NAME#v}"
RELEASE_TAG="${GITHUB_REF_NAME}"
PRERELEASE=false
else
VERSION="latest"
RELEASE_TAG="latest"
PRERELEASE=true
fi
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "release_tag=$RELEASE_TAG" >> $GITHUB_OUTPUT
echo "prerelease=$PRERELEASE" >> $GITHUB_OUTPUT
- uses: DeLaGuardo/setup-clojure@13.4
with:
cli: 1.12.3.1577
github-token: ${{ secrets.GITHUB_TOKEN }}
- uses: graalvm/setup-graalvm@v1
with:
java-version: "21"
distribution: "graalvm"
github-token: ${{ secrets.GITHUB_TOKEN }}
- name: Build shared library preparation
run: clojure -M:shared-lib
- name: Build native shared library
run: native-image @target/shared-image-args
- name: List output files
run: ls -la target/libchrondb* target/graal_isolate* || true
- uses: actions/upload-artifact@v4
with:
name: libchrondb-${{ runner.os }}-${{ matrix.arch }}
path: |
target/libchrondb.*
target/graal_isolate.h
target/graal_isolate_dynamic.h
target/libchrondb.h
target/libchrondb_dynamic.h
package-rust:
needs: build-shared-lib
runs-on: ${{ matrix.os }}
name: "Package Rust binding on ${{ matrix.os }}"
strategy:
matrix:
os: ["macos-14", "ubuntu-22.04"]
include:
- os: macos-14
arch: aarch64
- os: ubuntu-22.04
arch: x86_64
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
name: libchrondb-${{ runner.os }}-${{ matrix.arch }}
path: target/
- name: Determine platform and extension
id: platform
run: |
if [ "${{ runner.os }}" = "macOS" ]; then
echo "ext=dylib" >> $GITHUB_OUTPUT
echo "name=macos-${{ matrix.arch }}" >> $GITHUB_OUTPUT
else
echo "ext=so" >> $GITHUB_OUTPUT
echo "name=linux-${{ matrix.arch }}" >> $GITHUB_OUTPUT
fi
- name: Package Rust tarball
env:
VERSION: ${{ needs.build-shared-lib.outputs.version }}
run: |
PLATFORM="${{ steps.platform.outputs.name }}"
EXT="${{ steps.platform.outputs.ext }}"
PKG_DIR="chrondb-rust-${VERSION}-${PLATFORM}"
mkdir -p "${PKG_DIR}/lib"
mkdir -p "${PKG_DIR}/include"
mkdir -p "${PKG_DIR}/src"
cp target/libchrondb.${EXT} "${PKG_DIR}/lib/"
cp target/libchrondb.h "${PKG_DIR}/include/"
cp target/graal_isolate.h "${PKG_DIR}/include/"
cp target/libchrondb_dynamic.h "${PKG_DIR}/include/" || true
cp target/graal_isolate_dynamic.h "${PKG_DIR}/include/" || true
cp -r bindings/rust/src/* "${PKG_DIR}/src/"
cp bindings/rust/Cargo.toml "${PKG_DIR}/"
cp bindings/rust/build.rs "${PKG_DIR}/"
tar -czf "chrondb-rust-${VERSION}-${PLATFORM}.tar.gz" "${PKG_DIR}"
- uses: actions/upload-artifact@v4
with:
name: chrondb-rust-${{ steps.platform.outputs.name }}
path: chrondb-rust-*.tar.gz
package-python:
needs: build-shared-lib
runs-on: ${{ matrix.os }}
name: "Package Python wheel on ${{ matrix.os }}"
strategy:
matrix:
os: ["macos-14", "ubuntu-22.04"]
include:
- os: macos-14
arch: aarch64
wheel_tag: macosx_14_0_arm64
- os: ubuntu-22.04
arch: x86_64
wheel_tag: manylinux_2_35_x86_64
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
name: libchrondb-${{ runner.os }}-${{ matrix.arch }}
path: target/
- uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Install build tools
run: pip install build wheel
- name: Determine platform
id: platform
run: |
if [ "${{ runner.os }}" = "macOS" ]; then
echo "ext=dylib" >> $GITHUB_OUTPUT
echo "name=macos-${{ matrix.arch }}" >> $GITHUB_OUTPUT
else
echo "ext=so" >> $GITHUB_OUTPUT
echo "name=linux-${{ matrix.arch }}" >> $GITHUB_OUTPUT
fi
- name: Prepare wheel
env:
VERSION: ${{ needs.build-shared-lib.outputs.version }}
RUN_NUMBER: ${{ github.run_number }}
working-directory: bindings/python
run: |
EXT="${{ steps.platform.outputs.ext }}"
mkdir -p chrondb/lib
cp ../../target/libchrondb.${EXT} chrondb/lib/
if [ "$VERSION" != "latest" ]; then
sed -i.bak "s/version = \"0.1.0\"/version = \"${VERSION}\"/" pyproject.toml
else
sed -i.bak "s/version = \"0.1.0\"/version = \"0.0.0.dev${RUN_NUMBER}\"/" pyproject.toml
fi
rm -f pyproject.toml.bak
- name: Build wheel
working-directory: bindings/python
run: python -m build --wheel
- name: Retag wheel with platform
env:
VERSION: ${{ needs.build-shared-lib.outputs.version }}
RUN_NUMBER: ${{ github.run_number }}
working-directory: bindings/python
run: |
WHEEL_TAG="${{ matrix.wheel_tag }}"
cd dist
wheel tags --remove --platform-tag "${WHEEL_TAG}" *.whl
# For GitHub Release, also create a "latest" named copy
if [ "$VERSION" = "latest" ]; then
RETAGGED=$(ls *.whl)
cp "$RETAGGED" "chrondb-latest-py3-none-${WHEEL_TAG}.whl"
fi
- uses: actions/upload-artifact@v4
with:
name: chrondb-python-${{ steps.platform.outputs.name }}
path: bindings/python/dist/chrondb-*.whl
publish-python-pypi:
needs: [build-shared-lib, package-python]
runs-on: ubuntu-22.04
name: "Publish Python package to PyPI"
environment: tests
permissions:
id-token: write
steps:
- uses: actions/download-artifact@v4
with:
pattern: chrondb-python-*
path: dist/
merge-multiple: true
- uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Install twine
run: pip install twine
- name: Publish to PyPI
env:
TWINE_USERNAME: __token__
TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }}
run: |
# Remove "latest" named wheels (GitHub Release only, not valid for PyPI)
rm -f dist/chrondb-latest-*.whl
twine upload dist/*.whl
publish-rust-crate:
needs: [build-shared-lib, package-rust]
runs-on: ubuntu-22.04
name: "Publish Rust crate to crates.io"
environment: tests
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: Update crate version
working-directory: bindings/rust
env:
VERSION: ${{ needs.build-shared-lib.outputs.version }}
PRERELEASE: ${{ needs.build-shared-lib.outputs.prerelease }}
RUN_NUMBER: ${{ github.run_number }}
run: |
if [ "$PRERELEASE" = "true" ]; then
CRATE_VERSION="0.0.0-dev.${RUN_NUMBER}"
else
CRATE_VERSION="${VERSION}"
fi
sed -i "s/^version = \"0.1.0\"/version = \"${CRATE_VERSION}\"/" Cargo.toml
echo "Publishing version: ${CRATE_VERSION}"
- name: Publish to crates.io
working-directory: bindings/rust
env:
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
run: cargo publish --allow-dirty
create-release:
needs: [build-shared-lib, package-rust, package-python]
runs-on: ubuntu-22.04
name: "Create GitHub Release"
permissions:
contents: write
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
path: artifacts/
- name: Prepare release assets
env:
VERSION: ${{ needs.build-shared-lib.outputs.version }}
run: |
mkdir -p release-assets
# Package C library tarballs
for platform in linux-x86_64 macos-aarch64; do
if [ "$platform" = "linux-x86_64" ]; then
ARTIFACT_DIR="artifacts/libchrondb-Linux-x86_64"
LIB_FILE="libchrondb.so"
else
ARTIFACT_DIR="artifacts/libchrondb-macOS-aarch64"
LIB_FILE="libchrondb.dylib"
fi
if [ -d "$ARTIFACT_DIR" ]; then
PKG_DIR="libchrondb-${VERSION}-${platform}"
mkdir -p "${PKG_DIR}/lib"
mkdir -p "${PKG_DIR}/include"
cp "${ARTIFACT_DIR}/${LIB_FILE}" "${PKG_DIR}/lib/" || true
cp "${ARTIFACT_DIR}/libchrondb.h" "${PKG_DIR}/include/" || true
cp "${ARTIFACT_DIR}/graal_isolate.h" "${PKG_DIR}/include/" || true
cp "${ARTIFACT_DIR}/libchrondb_dynamic.h" "${PKG_DIR}/include/" || true
cp "${ARTIFACT_DIR}/graal_isolate_dynamic.h" "${PKG_DIR}/include/" || true
tar -czf "release-assets/libchrondb-${VERSION}-${platform}.tar.gz" "${PKG_DIR}"
fi
done
# Move Rust tarballs
cp artifacts/chrondb-rust-*/*.tar.gz release-assets/ || true
# Move Python wheels (use "latest" named for pre-releases, versioned for stable)
if [ "$VERSION" = "latest" ]; then
cp artifacts/chrondb-python-*/chrondb-latest-*.whl release-assets/ || true
else
cp artifacts/chrondb-python-*/chrondb-${VERSION}-*.whl release-assets/ || true
fi
echo "Release assets:"
ls -la release-assets/
- name: Delete existing latest release
if: needs.build-shared-lib.outputs.prerelease == 'true'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
gh release delete latest --yes || true
git push origin :refs/tags/latest || true
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ needs.build-shared-lib.outputs.release_tag }}
name: ${{ needs.build-shared-lib.outputs.release_tag == 'latest' && 'Latest (main)' || needs.build-shared-lib.outputs.release_tag }}
prerelease: ${{ needs.build-shared-lib.outputs.prerelease == 'true' }}
make_latest: ${{ needs.build-shared-lib.outputs.prerelease == 'false' }}
files: release-assets/*
generate_release_notes: ${{ needs.build-shared-lib.outputs.prerelease == 'false' }}
body: ${{ needs.build-shared-lib.outputs.prerelease == 'true' && 'Rolling release from main branch. Updated on every push.' || '' }}