This is an automated email from the ASF dual-hosted git repository.
hgruszecki pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iggy.git
The following commit(s) were added to refs/heads/master by this push:
new 00990631e feat(ci): add Linux edge binary builds with rolling GitHub
pre-release (#2447)
00990631e is described below
commit 00990631e06a3cecc10a0f191d1553dbec50950f
Author: Hubert Gruszecki <[email protected]>
AuthorDate: Fri Dec 5 17:32:27 2025 +0100
feat(ci): add Linux edge binary builds with rolling GitHub pre-release
(#2447)
Add reusable `_build_rust_binaries.yml` workflow for x86_64 GNU/musl.
Post-merge now builds `iggy-server`, `iggy`, `iggy-bench` tarballs.
Creates/updates 'edge' pre-release tag on every master push.
---
.github/workflows/_build_rust_binaries.yml | 227 +++++++++++++++++++++++++++++
.github/workflows/dependabot-licenses.yml | 65 ---------
.github/workflows/post-merge.yml | 78 +++++++++-
3 files changed, 303 insertions(+), 67 deletions(-)
diff --git a/.github/workflows/_build_rust_binaries.yml
b/.github/workflows/_build_rust_binaries.yml
new file mode 100644
index 000000000..195d00df7
--- /dev/null
+++ b/.github/workflows/_build_rust_binaries.yml
@@ -0,0 +1,227 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+# .github/workflows/_build_rust_binaries.yml
+name: _build_rust_binaries
+on:
+ workflow_call:
+ inputs:
+ version:
+ type: string
+ required: false
+ default: "edge"
+ description: "Version string for artifact naming (e.g., 'edge',
'0.6.253')"
+ upload_artifacts:
+ type: boolean
+ required: false
+ default: true
+ use_latest_ci:
+ type: boolean
+ required: false
+ default: false
+ description: "Use latest CI configuration and scripts from master
branch"
+ commit:
+ type: string
+ required: false
+ default: ""
+ description: "Specific commit to checkout for building binaries"
+ binaries:
+ type: string
+ required: false
+ default: "iggy-server,iggy,iggy-bench"
+ description: "Comma-separated list of binaries to build"
+ outputs:
+ artifact_name:
+ description: "Name of the uploaded artifact containing all binaries"
+ value: ${{ jobs.collect.outputs.artifact_name }}
+
+env:
+ IGGY_CI_BUILD: true
+
+jobs:
+ linux:
+ name: Linux ${{ matrix.target }}
+ runs-on: ${{ matrix.runner }}
+ timeout-minutes: 60
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ - target: x86_64-unknown-linux-gnu
+ runner: ubuntu-latest
+ libc: gnu
+ - target: x86_64-unknown-linux-musl
+ runner: ubuntu-latest
+ libc: musl
+ steps:
+ - name: Download latest copy script from master
+ if: inputs.use_latest_ci
+ shell: bash
+ run: |
+ set -euo pipefail
+ curl -sSL "https://raw.githubusercontent.com/${{ github.repository
}}/master/scripts/copy-latest-from-master.sh" \
+ -o /tmp/copy-latest-from-master.sh
+ chmod +x /tmp/copy-latest-from-master.sh
+
+ - uses: actions/checkout@v4
+ with:
+ ref: ${{ inputs.commit || github.sha }}
+
+ - name: Save and apply latest CI from master
+ if: inputs.use_latest_ci
+ shell: bash
+ run: |
+ set -euo pipefail
+ /tmp/copy-latest-from-master.sh save .github scripts
+ /tmp/copy-latest-from-master.sh apply
+
+ - name: Install musl-tools
+ if: matrix.libc == 'musl'
+ run: sudo apt-get update && sudo apt-get install -y musl-tools
+
+ - name: Setup Rust with cache
+ uses: ./.github/actions/utils/setup-rust-with-cache
+ with:
+ cache-targets: false
+
+ - name: Add Rust target
+ run: rustup target add ${{ matrix.target }}
+
+ - name: Build binaries
+ shell: bash
+ run: |
+ set -euo pipefail
+
+ binaries="${{ inputs.binaries }}"
+ bin_flags=()
+
+ IFS=',' read -ra bins <<< "$binaries"
+ for bin in "${bins[@]}"; do
+ name="$(echo "$bin" | xargs)"
+ [[ -z "$name" ]] && continue
+ bin_flags+=(--bin "$name")
+ done
+
+ cargo build --locked --release --target ${{ matrix.target }}
"${bin_flags[@]}"
+
+ - name: Package binaries
+ id: pkg
+ shell: bash
+ run: |
+ set -euo pipefail
+
+ target="${{ matrix.target }}"
+ version="${{ inputs.version }}"
+ outdir="dist/${target}"
+ mkdir -p "${outdir}"
+
+ binaries="${{ inputs.binaries }}"
+ IFS=',' read -ra bins <<< "$binaries"
+ for bin in "${bins[@]}"; do
+ bin_name="$(echo "$bin" | xargs)"
+ [[ -z "$bin_name" ]] && continue
+ cp "target/${target}/release/${bin_name}" "${outdir}/"
+ done
+
+ tarball="iggy-${target}-${version}.tar.gz"
+ tar czf "${tarball}" -C "${outdir}" .
+
+ echo "tarball=${tarball}" >> "$GITHUB_OUTPUT"
+ echo "Built: ${tarball}"
+ ls -lh "${tarball}"
+
+ - name: Upload artifact
+ if: inputs.upload_artifacts
+ uses: actions/upload-artifact@v4
+ with:
+ name: rust-binaries-${{ matrix.target }}
+ path: ${{ steps.pkg.outputs.tarball }}
+ retention-days: 7
+ if-no-files-found: error
+
+ collect:
+ name: Collect all binaries
+ needs: [linux]
+ if: inputs.upload_artifacts
+ runs-on: ubuntu-latest
+ outputs:
+ artifact_name: ${{ steps.output.outputs.artifact_name }}
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ ref: ${{ inputs.commit || github.sha }}
+
+ - name: Get server version
+ id: meta
+ run: |
+ chmod +x scripts/extract-version.sh
+ server_version=$(scripts/extract-version.sh rust-server)
+ echo "server_version=${server_version}" >> "$GITHUB_OUTPUT"
+
+ - name: Download all binaries
+ uses: actions/download-artifact@v4
+ with:
+ pattern: rust-binaries-*
+ merge-multiple: true
+ path: dist
+
+ - name: List binaries
+ shell: bash
+ run: |
+ set -euo pipefail
+ shopt -s nullglob
+
+ tarballs=(dist/*.tar.gz)
+ if ((${#tarballs[@]} == 0)); then
+ echo "⚠️ No tarballs found in dist/, skipping summary." >>
"$GITHUB_STEP_SUMMARY"
+ exit 0
+ fi
+
+ echo "## 📦 Built Rust Binaries" >> "$GITHUB_STEP_SUMMARY"
+ echo "" >> "$GITHUB_STEP_SUMMARY"
+ echo "| Target | Libc | File | Size |" >> "$GITHUB_STEP_SUMMARY"
+ echo "|--------|------|------|------|" >> "$GITHUB_STEP_SUMMARY"
+
+ for tarball in "${tarballs[@]}"; do
+ filename=$(basename "$tarball")
+ size=$(ls -lh "$tarball" | awk '{print $5}')
+
+ if [[ "$filename" == *"gnu"* ]]; then libc="glibc"
+ elif [[ "$filename" == *"musl"* ]]; then libc="musl (static)"
+ else libc="unknown"; fi
+
+ if [[ "$filename" == *"x86_64"* ]]; then target="x86_64"
+ elif [[ "$filename" == *"aarch64"* ]]; then target="aarch64"
+ else target="unknown"; fi
+
+ echo "| $target | $libc | \`$filename\` | $size |" >>
"$GITHUB_STEP_SUMMARY"
+ done
+
+ echo "" >> "$GITHUB_STEP_SUMMARY"
+ echo "**Server version:** ${{ steps.meta.outputs.server_version }}"
>> "$GITHUB_STEP_SUMMARY"
+ echo "" >> "$GITHUB_STEP_SUMMARY"
+ echo "**Binaries included:** ${{ inputs.binaries }}" >>
"$GITHUB_STEP_SUMMARY"
+
+ - name: Upload combined artifact
+ uses: actions/upload-artifact@v4
+ with:
+ name: rust-binaries-all
+ path: dist
+ retention-days: 30
+
+ - id: output
+ run: echo "artifact_name=rust-binaries-all" >> $GITHUB_OUTPUT
diff --git a/.github/workflows/dependabot-licenses.yml
b/.github/workflows/dependabot-licenses.yml
deleted file mode 100644
index 8b433feb4..000000000
--- a/.github/workflows/dependabot-licenses.yml
+++ /dev/null
@@ -1,65 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-name: Update licenses for Dependabot PRs
-
-on:
- pull_request_target:
- paths:
- - "Cargo.toml"
- - "Cargo.lock"
- - "**/Cargo.toml"
-
-permissions:
- contents: write
- pull-requests: write
-
-jobs:
- update-licenses:
- name: Update DEPENDENCIES.md
- runs-on: ubuntu-latest
- if: github.actor == 'dependabot[bot]'
- steps:
- - name: Checkout PR branch
- uses: actions/checkout@v4
- with:
- ref: ${{ github.event.pull_request.head.ref }}
- token: ${{ secrets.GITHUB_TOKEN }}
-
- - name: Setup Rust with cache
- uses: ./.github/actions/utils/setup-rust-with-cache
- with:
- cache-targets: false # Only cache registry and git deps, not target
dir (sccache handles that)
- show-stats: true
-
- - name: Install cargo-license
- run: cargo install cargo-license
-
- - name: Update DEPENDENCIES.md
- run: ./scripts/ci/licenses-list.sh --update
-
- - name: Commit changes
- run: |
- git config user.name "github-actions[bot]"
- git config user.email "github-actions[bot]@users.noreply.github.com"
- git add DEPENDENCIES.md
- if git diff --staged --quiet; then
- echo "No changes to commit"
- else
- git commit -m "chore(deps): update DEPENDENCIES.md"
- git push
- fi
diff --git a/.github/workflows/post-merge.yml b/.github/workflows/post-merge.yml
index 9b383edf6..0bdc2f508 100644
--- a/.github/workflows/post-merge.yml
+++ b/.github/workflows/post-merge.yml
@@ -83,7 +83,7 @@ jobs:
matrix: ${{ fromJson(needs.plan.outputs.matrix) }}
env:
DOCKERHUB_USER: ${{ secrets.DOCKERHUB_USER }}
- DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
+ DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
steps:
- uses: actions/checkout@v4
@@ -93,4 +93,78 @@ jobs:
libc: musl
component: ${{ matrix.component }}
version: edge
- dry_run: ${{ github.event.repository.fork }} # forks: always dry-run
+ dry_run: ${{ github.event.repository.fork }} # forks: always dry-run
+
+ build-rust-binaries:
+ name: Build Rust binaries
+ uses: ./.github/workflows/_build_rust_binaries.yml
+ with:
+ version: edge
+ upload_artifacts: true
+
+ create-prerelease:
+ name: Create edge pre-release
+ runs-on: ubuntu-latest
+ needs: build-rust-binaries
+ if: needs.build-rust-binaries.result == 'success' &&
!github.event.repository.fork
+ permissions:
+ contents: write
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Get server version
+ id: meta
+ run: |
+ chmod +x scripts/extract-version.sh
+ server_version=$(scripts/extract-version.sh rust-server)
+ echo "server_version=${server_version}" >> "$GITHUB_OUTPUT"
+
+ - name: Download edge artifacts
+ uses: actions/download-artifact@v4
+ with:
+ name: rust-binaries-all
+ path: ./artifacts
+
+ - name: Delete existing edge release
+ env:
+ GH_TOKEN: ${{ github.token }}
+ shell: bash
+ run: |
+ set -euo pipefail
+ if gh release view edge &>/dev/null; then
+ echo "Deleting existing edge release..."
+ if ! gh release delete edge --yes; then
+ echo "Release delete failed (likely already deleted by
concurrent run), continuing."
+ fi
+ else
+ echo "No existing edge release to delete"
+ fi
+
+ - name: Create edge pre-release
+ uses: softprops/action-gh-release@v2
+ with:
+ tag_name: edge
+ name: Edge (latest)
+ draft: false
+ prerelease: true
+ make_latest: false
+ files: artifacts/**/*.tar.gz
+ body: |
+ Rolling edge build of Apache Iggy binaries.
+
+ **This release is automatically updated on every push to master.**
+
+ ## Binaries included
+ - `iggy-server` - The server binary
+ - `iggy` - The command-line interface
+ - `iggy-bench` - The benchmarking tool
+
+ ## Downloads
+ - `iggy-x86_64-unknown-linux-gnu-edge.tar.gz` - Linux (glibc)
+ - `iggy-x86_64-unknown-linux-musl-edge.tar.gz` - Linux (musl,
static)
+
+ ## Build info
+ - Server version: ${{ steps.meta.outputs.server_version }}
+ - Commit: ${{ github.sha }}
+
+ ⚠️ **Not an official ASF release** - for development/testing only.