name: roapi release on: push: paths: - '.github/workflows/roapi_release.yml' - 'columnq/**' - 'roapi/**' - 'Cargo.lock' branches: [ main ] tags: [ 'roapi-v*' ] env: # NOTE: the version is also defined in build.yml and Dockerfile RUST_TC_VER: "1.94.0" jobs: validate-release-tag: name: Validate git tag runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 if: "startsWith(github.ref, 'refs/tags/')" - name: compare git tag with cargo metadata if: "startsWith(github.ref, 'refs/tags/')" run: | PUSHED_TAG=${GITHUB_REF##*/} CURR_VER=$( grep version roapi/Cargo.toml | head -n 1 | awk '{print $3}' | tr -d '"' ) if [[ "${PUSHED_TAG}" != "roapi-v${CURR_VER}" ]]; then echo "Cargo metadata has version set to ${CURR_VER}, but got pushed tag ${PUSHED_TAG}." exit 1 fi - name: skip git tag validation if: "! startsWith(github.ref, 'refs/tags/')" run: echo "skip tag version validation on non-release branch run" macos: needs: validate-release-tag runs-on: macos-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: "3.10" - name: Install Rust toolchain uses: actions-rust-lang/setup-rust-toolchain@v1 with: toolchain: ${{ env.RUST_TC_VER }} target: aarch64-apple-darwin,x86_64-apple-darwin,wasm32-unknown-unknown - uses: taiki-e/install-action@v2 with: tool: trunk - name: Install maturin run: pip3 install 'maturin<2' - name: Build UI first run: | cd roapi-ui trunk build --release --locked - name: Build wheels - x86_64 run: | maturin build -m roapi/Cargo.toml -b bin --target x86_64-apple-darwin --release --out dist --features=database-sqlite,ui - name: Build wheels - universal2 env: DEVELOPER_DIR: /Applications/Xcode.app/Contents/Developer MACOSX_DEPLOYMENT_TARGET: '10.12' run: | # set SDKROOT for C dependencies export SDKROOT=$(xcrun --sdk macosx --show-sdk-path) maturin build -m roapi/Cargo.toml -b bin --release --target universal2-apple-darwin --out dist --features=database-sqlite,ui pip install roapi --no-index --find-links dist --force-reinstall - name: Upload wheels uses: actions/upload-artifact@v4 with: name: wheels-macos path: dist - name: Archive binary if: "startsWith(github.ref, 'refs/tags/')" run: tar czvf target/release/roapi.tar.gz -C target/release roapi - name: Upload binary to GitHub Release uses: svenstaro/upload-release-action@v2 if: "startsWith(github.ref, 'refs/tags/')" with: overwrite: true repo_token: ${{ secrets.GITHUB_TOKEN }} asset_name: roapi-apple-darwin.tar.gz file: target/release/roapi.tar.gz tag: ${{ github.ref }} windows: needs: validate-release-tag runs-on: windows-latest strategy: matrix: platform: [ { python-architecture: "x64", target: "x86_64-pc-windows-msvc", features: "database-sqlite" }, ] steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: "3.10" architecture: ${{ matrix.platform.python-architecture }} - name: Install Rust toolchain uses: actions-rust-lang/setup-rust-toolchain@v1 with: toolchain: ${{ env.RUST_TC_VER }} target: ${{ matrix.platform.target }},wasm32-unknown-unknown - uses: taiki-e/install-action@v2 with: tool: trunk - name: Install maturin run: pip3 install 'maturin<2' - name: Build UI first run: | cd roapi-ui trunk build --release --locked - name: Build wheels run: | maturin build -m roapi/Cargo.toml -b bin --release --out dist --target ${{ matrix.platform.target }} --features=${{ matrix.platform.features }},ui pip install roapi --no-index --find-links dist --force-reinstall roapi --help - name: Upload wheels uses: actions/upload-artifact@v4 with: name: wheels-windows path: dist - name: Archive binary if: "startsWith(github.ref, 'refs/tags/')" run: | tar czvf target/release/roapi.tar.gz -C target/${{ matrix.platform.target }}/release roapi.exe - name: Upload binary to GitHub Release uses: svenstaro/upload-release-action@v2 if: "startsWith(github.ref, 'refs/tags/')" with: overwrite: true repo_token: ${{ secrets.GITHUB_TOKEN }} asset_name: roapi-windows.tar.gz file: target/release/roapi.tar.gz tag: ${{ github.ref }} linux: needs: validate-release-tag runs-on: ubuntu-latest strategy: fail-fast: false matrix: platform: - manylinux: "2010" target: "x86_64-unknown-linux-musl" image_tag: "x86_64-musl" features: "rustls,database-sqlite" name_suffix: "" upload: "true" # - manylinux: "2010" # target: "x86_64-unknown-linux-musl" # image_tag: "x86_64-musl" # features: "native-tls" # name_suffix: "-openssl" # upload: "false" - manylinux: '2014' target: "aarch64-unknown-linux-musl" image_tag: "aarch64-musl" features: "rustls,database-sqlite" name_suffix: "" upload: "true" # - manylinux: '2014' # target: "aarch64-unknown-linux-musl" # image_tag: "aarch64-musl" # features: "native-tls" # name_suffix: "-openssl" # upload: "false" # - manylinux: '2014' # target: "armv7-unknown-linux-musleabihf" # image_tag: "armv7-musleabihf" # features: "rustls,database-sqlite" # name_suffix: "" # upload: "true" # - manylinux: '2014' # target: "armv7-unknown-linux-musleabihf" # image_tag: "armv7-musleabihf" # features: "native-tls" # name_suffix: "-openssl" # upload: "false" container: image: docker://messense/rust-musl-cross:${{ matrix.platform.image_tag }} env: RUSTUP_HOME: /root/.rustup CARGO_HOME: /root/.cargo steps: - uses: actions/checkout@v4 - name: Install Rust toolchain run: | rustup update ${{ env.RUST_TC_VER }} rustup target add \ --toolchain ${{ env.RUST_TC_VER }} \ ${{ matrix.platform.target }} rustup target add \ --toolchain ${{ env.RUST_TC_VER }} \ wasm32-unknown-unknown rustup default ${{ env.RUST_TC_VER }} - uses: taiki-e/install-action@v2 with: tool: trunk - name: Install build deps if: "contains(matrix.platform.name_suffix, 'openssl')" run: | apt-get update apt-get install -y libssl-dev - name: Build UI first run: | cd roapi-ui trunk build --release --locked - name: Build Wheels run: | sudo python3 -m pip install 'maturin<2' maturin build -m roapi/Cargo.toml -b bin --release -o dist \ --target ${{ matrix.platform.target }} --manylinux ${{ matrix.platform.manylinux }} \ --no-default-features --features=${{ matrix.platform.features }},ui - name: Upload wheels uses: actions/upload-artifact@v4 if: "matrix.platform.upload == 'true'" with: name: wheels-linux-${{ matrix.platform.manylinux }} path: dist - name: Archive binary if: "startsWith(github.ref, 'refs/tags/')" run: tar czvf target/release/roapi.tar.gz -C target/${{ matrix.platform.target }}/release roapi - name: Upload binary to GitHub Release uses: svenstaro/upload-release-action@v2 if: "startsWith(github.ref, 'refs/tags/')" with: overwrite: true repo_token: ${{ secrets.GITHUB_TOKEN }} asset_name: roapi-${{ matrix.platform.target }}${{ matrix.platform.name_suffix }}.tar.gz file: target/release/roapi.tar.gz tag: ${{ github.ref }} pypi_release: needs: [ validate-release-tag, linux, macos, windows ] name: PyPI Release runs-on: ubuntu-latest if: "startsWith(github.ref, 'refs/tags/')" steps: - uses: actions/download-artifact@v4 with: name: wheels-linux-2010 - uses: actions/download-artifact@v4 with: name: wheels-linux-2014 - uses: actions/download-artifact@v4 with: name: wheels-macos - uses: actions/download-artifact@v4 with: name: wheels-windows - uses: actions/setup-python@v5 with: python-version: "3.10" - name: Publish to PyPi env: TWINE_USERNAME: __token__ TWINE_PASSWORD: ${{ secrets.ROAPI_PYPI_TOKEN }} run: | pip install --upgrade twine twine upload --skip-existing * docker_release: if: "startsWith(github.ref, 'refs/tags/')" needs: validate-release-tag name: Docker Image Release runs-on: ubuntu-latest permissions: contents: read packages: write steps: - uses: actions/checkout@v4 # buildx setup required for build cache export - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Log in to the Container registry uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Extract metadata (tags, labels) for Docker id: meta uses: docker/metadata-action@v5 with: flavor: | latest=true tags: | type=match,pattern=roapi-(v.+),group=1 images: ghcr.io/${{ github.repository_owner }}/roapi - name: Build and push Docker image uses: docker/build-push-action@v6 with: context: . push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} cache-from: type=registry,ref=ghcr.io/${{ github.repository_owner }}/roapi:buildcache cache-to: type=registry,ref=ghcr.io/${{ github.repository_owner }}/roapi:buildcache,mode=max