From 27b90c8ab2d3612c0089048344dbb7ca21834614 Mon Sep 17 00:00:00 2001 From: Michal Stanek Date: Wed, 10 Sep 2025 18:48:49 +0200 Subject: [PATCH 1/2] ci: add GitHub Actions release workflow (amd64/arm64; gnu, glibc217, musl); strip; tarballs; checksums; CHANGES body --- .github/workflows/release.yml | 327 ++++++++++++++++++++++++++++++++++ 1 file changed, 327 insertions(+) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..6f9a6cb9 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,327 @@ +name: Release + +on: + push: + tags: + - "v*" + workflow_dispatch: {} + +permissions: + contents: write + +concurrency: + group: release-${{ github.ref }} + cancel-in-progress: true + +env: + TAG: ${{ github.ref_name }} + +jobs: + build-gnu-amd64: + name: Build linux-amd64-gnu + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Build with Docker (Ubuntu GNU) + run: | + make docker + + - name: Strip binaries and libs + shell: bash + run: | + set -euo pipefail + # Executables + for f in quark-mon quark-btf quark-test quark-kube-talker; do + if [[ -f "$f" ]]; then strip --strip-unneeded "$f" || true; fi + done + # Static executables (may not exist on all targets) + for f in quark-mon-static quark-btf-static quark-test-static; do + if [[ -f "$f" ]]; then strip --strip-unneeded "$f" || true; fi + done + # Static libraries + for f in libquark.a libquark_big.a; do + if [[ -f "$f" ]]; then strip -g "$f" || true; fi + done + + - name: Package artifacts + shell: bash + run: | + set -euo pipefail + PKG="quark-${TAG}-linux-amd64-gnu" + ROOT="dist/${PKG}" + mkdir -p "$ROOT/bin" "$ROOT/bin-static" "$ROOT/lib" "$ROOT/include" "$ROOT/man" + # Binaries + install -m 0755 quark-mon quark-btf quark-test quark-kube-talker "$ROOT/bin/" + # Static binaries (if present) + for f in quark-mon-static quark-btf-static quark-test-static; do + [[ -f "$f" ]] && install -m 0755 "$f" "$ROOT/bin-static/" || true + done + # Libraries + install -m 0644 libquark.a libquark_big.a "$ROOT/lib/" + # Minimal SDK headers + install -m 0644 quark.h "$ROOT/include/" + # Man pages and docs + for f in *.3 *.7 *.8; do + [[ -f "$f" ]] && install -m 0644 "$f" "$ROOT/man/" || true + done + # Notices + install -m 0644 LICENSE.txt NOTICE.txt CHANGES "$ROOT/" + # Tarball + checksum + mkdir -p dist + tar -C "$ROOT" -czf "dist/${PKG}.tar.gz" . + sha256sum "dist/${PKG}.tar.gz" > "dist/${PKG}.tar.gz.sha256" + rm -rf "$ROOT" + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: quark-${{ env.TAG }}-linux-amd64-gnu + path: | + dist/quark-${{ env.TAG }}-linux-amd64-gnu.tar.gz + dist/quark-${{ env.TAG }}-linux-amd64-gnu.tar.gz.sha256 + + build-gnu-amd64-glibc217: + name: Build linux-amd64-gnu-glibc217 (CentOS 7) + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Build with Docker (CentOS 7) + run: | + make centos7 + + - name: Strip binaries and libs + shell: bash + run: | + set -euo pipefail + # Executables + for f in quark-mon quark-btf quark-test quark-kube-talker; do + if [[ -f "$f" ]]; then strip --strip-unneeded "$f" || true; fi + done + # Static executables (unlikely on this target, but try) + for f in quark-mon-static quark-btf-static quark-test-static; do + if [[ -f "$f" ]]; then strip --strip-unneeded "$f" || true; fi + done + # Static libraries + for f in libquark.a libquark_big.a; do + if [[ -f "$f" ]]; then strip -g "$f" || true; fi + done + + - name: Package artifacts + shell: bash + run: | + set -euo pipefail + PKG="quark-${TAG}-linux-amd64-gnu-glibc217" + ROOT="dist/${PKG}" + mkdir -p "$ROOT/bin" "$ROOT/bin-static" "$ROOT/lib" "$ROOT/include" "$ROOT/man" + # Binaries + install -m 0755 quark-mon quark-btf quark-test quark-kube-talker "$ROOT/bin/" + # Static binaries (if present) + for f in quark-mon-static quark-btf-static quark-test-static; do + [[ -f "$f" ]] && install -m 0755 "$f" "$ROOT/bin-static/" || true + done + # Libraries + install -m 0644 libquark.a libquark_big.a "$ROOT/lib/" + # Minimal SDK headers + install -m 0644 quark.h "$ROOT/include/" + # Man pages and docs + for f in *.3 *.7 *.8; do + [[ -f "$f" ]] && install -m 0644 "$f" "$ROOT/man/" || true + done + # Notices + install -m 0644 LICENSE.txt NOTICE.txt CHANGES "$ROOT/" + # Tarball + checksum + mkdir -p dist + tar -C "$ROOT" -czf "dist/${PKG}.tar.gz" . + sha256sum "dist/${PKG}.tar.gz" > "dist/${PKG}.tar.gz.sha256" + rm -rf "$ROOT" + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: quark-${{ env.TAG }}-linux-amd64-gnu-glibc217 + path: | + dist/quark-${{ env.TAG }}-linux-amd64-gnu-glibc217.tar.gz + dist/quark-${{ env.TAG }}-linux-amd64-gnu-glibc217.tar.gz.sha256 + + build-gnu-arm64: + name: Build linux-arm64-gnu + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Build with Docker (ARM64 cross-compile) + run: | + make docker-cross-arm64 + + - name: Strip binaries and libs (in Docker for aarch64) + shell: bash + run: | + set -euo pipefail + # Use builder image to run the appropriate aarch64 strip + docker run -q \ + -v "$PWD":"$PWD" \ + -w "$PWD" \ + -u "$(id -u):$(id -g)" \ + quark-builder \ + bash -lc ' + set -e + for f in quark-mon quark-btf quark-test quark-kube-talker; do + [[ -f "$f" ]] && aarch64-linux-gnu-strip --strip-unneeded "$f" || true; + done + for f in quark-mon-static quark-btf-static quark-test-static; do + [[ -f "$f" ]] && aarch64-linux-gnu-strip --strip-unneeded "$f" || true; + done + for f in libquark.a libquark_big.a; do + [[ -f "$f" ]] && aarch64-linux-gnu-strip -g "$f" || true; + done' + + - name: Package artifacts + shell: bash + run: | + set -euo pipefail + PKG="quark-${TAG}-linux-arm64-gnu" + ROOT="dist/${PKG}" + mkdir -p "$ROOT/bin" "$ROOT/bin-static" "$ROOT/lib" "$ROOT/include" "$ROOT/man" + # Binaries + install -m 0755 quark-mon quark-btf quark-test quark-kube-talker "$ROOT/bin/" + # Static binaries (if present) + for f in quark-mon-static quark-btf-static quark-test-static; do + [[ -f "$f" ]] && install -m 0755 "$f" "$ROOT/bin-static/" || true + done + # Libraries + install -m 0644 libquark.a libquark_big.a "$ROOT/lib/" + # Minimal SDK headers + install -m 0644 quark.h "$ROOT/include/" + # Man pages and docs + for f in *.3 *.7 *.8; do + [[ -f "$f" ]] && install -m 0644 "$f" "$ROOT/man/" || true + done + # Notices + install -m 0644 LICENSE.txt NOTICE.txt CHANGES "$ROOT/" + # Tarball + checksum + mkdir -p dist + tar -C "$ROOT" -czf "dist/${PKG}.tar.gz" . + sha256sum "dist/${PKG}.tar.gz" > "dist/${PKG}.tar.gz.sha256" + rm -rf "$ROOT" + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: quark-${{ env.TAG }}-linux-arm64-gnu + path: | + dist/quark-${{ env.TAG }}-linux-arm64-gnu.tar.gz + dist/quark-${{ env.TAG }}-linux-arm64-gnu.tar.gz.sha256 + + build-musl-amd64: + name: Build linux-amd64-musl + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Build with Docker (Alpine musl) + run: | + make alpine + + - name: Strip binaries and libs + shell: bash + run: | + set -euo pipefail + # Executables + for f in quark-mon quark-btf quark-test quark-kube-talker; do + if [[ -f "$f" ]]; then strip --strip-unneeded "$f" || true; fi + done + # Static executables (musl static expected here) + for f in quark-mon-static quark-btf-static quark-test-static; do + if [[ -f "$f" ]]; then strip --strip-unneeded "$f" || true; fi + done + # Static libraries + for f in libquark.a libquark_big.a; do + if [[ -f "$f" ]]; then strip -g "$f" || true; fi + done + + - name: Package artifacts + shell: bash + run: | + set -euo pipefail + PKG="quark-${TAG}-linux-amd64-musl" + ROOT="dist/${PKG}" + mkdir -p "$ROOT/bin" "$ROOT/bin-static" "$ROOT/lib" "$ROOT/include" "$ROOT/man" + # Binaries + install -m 0755 quark-mon quark-btf quark-test quark-kube-talker "$ROOT/bin/" + # Static binaries (if present) + for f in quark-mon-static quark-btf-static quark-test-static; do + [[ -f "$f" ]] && install -m 0755 "$f" "$ROOT/bin-static/" || true + done + # Libraries + install -m 0644 libquark.a libquark_big.a "$ROOT/lib/" + # Minimal SDK headers + install -m 0644 quark.h "$ROOT/include/" + # Man pages and docs + for f in *.3 *.7 *.8; do + [[ -f "$f" ]] && install -m 0644 "$f" "$ROOT/man/" || true + done + # Notices + install -m 0644 LICENSE.txt NOTICE.txt CHANGES "$ROOT/" + # Tarball + checksum + mkdir -p dist + tar -C "$ROOT" -czf "dist/${PKG}.tar.gz" . + sha256sum "dist/${PKG}.tar.gz" > "dist/${PKG}.tar.gz.sha256" + rm -rf "$ROOT" + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: quark-${{ env.TAG }}-linux-amd64-musl + path: | + dist/quark-${{ env.TAG }}-linux-amd64-musl.tar.gz + dist/quark-${{ env.TAG }}-linux-amd64-musl.tar.gz.sha256 + + publish: + name: Publish GitHub Release + runs-on: ubuntu-latest + needs: + - build-gnu-amd64 + - build-gnu-amd64-glibc217 + - build-gnu-arm64 + - build-musl-amd64 + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Download all build artifacts + uses: actions/download-artifact@v4 + with: + path: dist + merge-multiple: true + + - name: Generate combined SHA256SUMS + shell: bash + run: | + set -euo pipefail + cd dist + sha256sum *.tar.gz > SHA256SUMS + + - name: Create GitHub Release + uses: softprops/action-gh-release@v1 + with: + tag_name: ${{ env.TAG }} + body_path: CHANGES + files: | + dist/*.tar.gz + dist/*.tar.gz.sha256 + dist/SHA256SUMS + From bf558ef80e37d41f08e672f70812e29fea17669e Mon Sep 17 00:00:00 2001 From: Michal Stanek Date: Wed, 10 Sep 2025 20:00:49 +0200 Subject: [PATCH 2/2] build: add install and dist targets; ci: use make dist, draft releases, rename to glibc/glibc217, add version check and prepare-release workflow --- .github/workflows/prepare-release.yml | 51 ++++++ .github/workflows/release.yml | 232 +++++++------------------- Makefile | 64 +++++++ 3 files changed, 176 insertions(+), 171 deletions(-) create mode 100644 .github/workflows/prepare-release.yml diff --git a/.github/workflows/prepare-release.yml b/.github/workflows/prepare-release.yml new file mode 100644 index 00000000..16b0d42a --- /dev/null +++ b/.github/workflows/prepare-release.yml @@ -0,0 +1,51 @@ +name: Prepare Release + +on: + workflow_dispatch: + inputs: + version: + description: "Release version (e.g., 0.6)" + required: true + +permissions: + contents: write + pull-requests: write + +jobs: + bump-version: + name: Bump QUARK_VERSION and open PR + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: false + + - name: Create bump branch + id: prep + shell: bash + run: | + set -euo pipefail + VERSION="${{ inputs.version }}" + BRANCH="release/bump-v${VERSION}" + echo "branch=$BRANCH" >> "$GITHUB_OUTPUT" + git checkout -b "$BRANCH" + # Update QUARK_VERSION to exact VERSION (no trailing 'a') + perl -0777 -pe "s/(#define\s+QUARK_VERSION\s+")([^"]+)(")/\1${VERSION}\3/" -i quark.h + echo "Updated quark.h to QUARK_VERSION=${VERSION}" + git add quark.h + git commit -m "release: bump QUARK_VERSION to ${VERSION}" + + - name: Create Pull Request + uses: peter-evans/create-pull-request@v6 + with: + branch: ${{ steps.prep.outputs.branch }} + title: "release: bump QUARK_VERSION to ${{ inputs.version }}" + body: | + This PR bumps QUARK_VERSION to `${{ inputs.version }}` in quark.h. + + After merging, push the release tag `v${{ inputs.version }}` to trigger the release workflow. + commit-message: "release: bump QUARK_VERSION to ${{ inputs.version }}" + base: ${{ github.ref_name }} + labels: release + diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6f9a6cb9..0816d547 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -17,8 +17,8 @@ env: TAG: ${{ github.ref_name }} jobs: - build-gnu-amd64: - name: Build linux-amd64-gnu + build-glibc-amd64: + name: Build linux-amd64-glibc runs-on: ubuntu-latest steps: - name: Checkout @@ -30,47 +30,14 @@ jobs: run: | make docker - - name: Strip binaries and libs - shell: bash - run: | - set -euo pipefail - # Executables - for f in quark-mon quark-btf quark-test quark-kube-talker; do - if [[ -f "$f" ]]; then strip --strip-unneeded "$f" || true; fi - done - # Static executables (may not exist on all targets) - for f in quark-mon-static quark-btf-static quark-test-static; do - if [[ -f "$f" ]]; then strip --strip-unneeded "$f" || true; fi - done - # Static libraries - for f in libquark.a libquark_big.a; do - if [[ -f "$f" ]]; then strip -g "$f" || true; fi - done - - name: Package artifacts shell: bash run: | set -euo pipefail - PKG="quark-${TAG}-linux-amd64-gnu" - ROOT="dist/${PKG}" - mkdir -p "$ROOT/bin" "$ROOT/bin-static" "$ROOT/lib" "$ROOT/include" "$ROOT/man" - # Binaries - install -m 0755 quark-mon quark-btf quark-test quark-kube-talker "$ROOT/bin/" - # Static binaries (if present) - for f in quark-mon-static quark-btf-static quark-test-static; do - [[ -f "$f" ]] && install -m 0755 "$f" "$ROOT/bin-static/" || true - done - # Libraries - install -m 0644 libquark.a libquark_big.a "$ROOT/lib/" - # Minimal SDK headers - install -m 0644 quark.h "$ROOT/include/" - # Man pages and docs - for f in *.3 *.7 *.8; do - [[ -f "$f" ]] && install -m 0644 "$f" "$ROOT/man/" || true - done - # Notices - install -m 0644 LICENSE.txt NOTICE.txt CHANGES "$ROOT/" - # Tarball + checksum + PKG="quark-${TAG}-linux-amd64-glibc" + ROOT="stage/${PKG}" + mkdir -p "${ROOT}" + make dist DESTDIR="${ROOT}" mkdir -p dist tar -C "$ROOT" -czf "dist/${PKG}.tar.gz" . sha256sum "dist/${PKG}.tar.gz" > "dist/${PKG}.tar.gz.sha256" @@ -79,13 +46,13 @@ jobs: - name: Upload artifact uses: actions/upload-artifact@v4 with: - name: quark-${{ env.TAG }}-linux-amd64-gnu + name: quark-${{ env.TAG }}-linux-amd64-glibc path: | - dist/quark-${{ env.TAG }}-linux-amd64-gnu.tar.gz - dist/quark-${{ env.TAG }}-linux-amd64-gnu.tar.gz.sha256 + dist/quark-${{ env.TAG }}-linux-amd64-glibc.tar.gz + dist/quark-${{ env.TAG }}-linux-amd64-glibc.tar.gz.sha256 - build-gnu-amd64-glibc217: - name: Build linux-amd64-gnu-glibc217 (CentOS 7) + build-glibc217-amd64: + name: Build linux-amd64-glibc217 (CentOS 7) runs-on: ubuntu-latest steps: - name: Checkout @@ -97,47 +64,14 @@ jobs: run: | make centos7 - - name: Strip binaries and libs - shell: bash - run: | - set -euo pipefail - # Executables - for f in quark-mon quark-btf quark-test quark-kube-talker; do - if [[ -f "$f" ]]; then strip --strip-unneeded "$f" || true; fi - done - # Static executables (unlikely on this target, but try) - for f in quark-mon-static quark-btf-static quark-test-static; do - if [[ -f "$f" ]]; then strip --strip-unneeded "$f" || true; fi - done - # Static libraries - for f in libquark.a libquark_big.a; do - if [[ -f "$f" ]]; then strip -g "$f" || true; fi - done - - name: Package artifacts shell: bash run: | set -euo pipefail - PKG="quark-${TAG}-linux-amd64-gnu-glibc217" - ROOT="dist/${PKG}" - mkdir -p "$ROOT/bin" "$ROOT/bin-static" "$ROOT/lib" "$ROOT/include" "$ROOT/man" - # Binaries - install -m 0755 quark-mon quark-btf quark-test quark-kube-talker "$ROOT/bin/" - # Static binaries (if present) - for f in quark-mon-static quark-btf-static quark-test-static; do - [[ -f "$f" ]] && install -m 0755 "$f" "$ROOT/bin-static/" || true - done - # Libraries - install -m 0644 libquark.a libquark_big.a "$ROOT/lib/" - # Minimal SDK headers - install -m 0644 quark.h "$ROOT/include/" - # Man pages and docs - for f in *.3 *.7 *.8; do - [[ -f "$f" ]] && install -m 0644 "$f" "$ROOT/man/" || true - done - # Notices - install -m 0644 LICENSE.txt NOTICE.txt CHANGES "$ROOT/" - # Tarball + checksum + PKG="quark-${TAG}-linux-amd64-glibc217" + ROOT="stage/${PKG}" + mkdir -p "${ROOT}" + make dist DESTDIR="${ROOT}" mkdir -p dist tar -C "$ROOT" -czf "dist/${PKG}.tar.gz" . sha256sum "dist/${PKG}.tar.gz" > "dist/${PKG}.tar.gz.sha256" @@ -146,13 +80,13 @@ jobs: - name: Upload artifact uses: actions/upload-artifact@v4 with: - name: quark-${{ env.TAG }}-linux-amd64-gnu-glibc217 + name: quark-${{ env.TAG }}-linux-amd64-glibc217 path: | - dist/quark-${{ env.TAG }}-linux-amd64-gnu-glibc217.tar.gz - dist/quark-${{ env.TAG }}-linux-amd64-gnu-glibc217.tar.gz.sha256 + dist/quark-${{ env.TAG }}-linux-amd64-glibc217.tar.gz + dist/quark-${{ env.TAG }}-linux-amd64-glibc217.tar.gz.sha256 - build-gnu-arm64: - name: Build linux-arm64-gnu + build-glibc-arm64: + name: Build linux-arm64-glibc runs-on: ubuntu-latest steps: - name: Checkout @@ -164,52 +98,14 @@ jobs: run: | make docker-cross-arm64 - - name: Strip binaries and libs (in Docker for aarch64) - shell: bash - run: | - set -euo pipefail - # Use builder image to run the appropriate aarch64 strip - docker run -q \ - -v "$PWD":"$PWD" \ - -w "$PWD" \ - -u "$(id -u):$(id -g)" \ - quark-builder \ - bash -lc ' - set -e - for f in quark-mon quark-btf quark-test quark-kube-talker; do - [[ -f "$f" ]] && aarch64-linux-gnu-strip --strip-unneeded "$f" || true; - done - for f in quark-mon-static quark-btf-static quark-test-static; do - [[ -f "$f" ]] && aarch64-linux-gnu-strip --strip-unneeded "$f" || true; - done - for f in libquark.a libquark_big.a; do - [[ -f "$f" ]] && aarch64-linux-gnu-strip -g "$f" || true; - done' - - name: Package artifacts shell: bash run: | set -euo pipefail - PKG="quark-${TAG}-linux-arm64-gnu" - ROOT="dist/${PKG}" - mkdir -p "$ROOT/bin" "$ROOT/bin-static" "$ROOT/lib" "$ROOT/include" "$ROOT/man" - # Binaries - install -m 0755 quark-mon quark-btf quark-test quark-kube-talker "$ROOT/bin/" - # Static binaries (if present) - for f in quark-mon-static quark-btf-static quark-test-static; do - [[ -f "$f" ]] && install -m 0755 "$f" "$ROOT/bin-static/" || true - done - # Libraries - install -m 0644 libquark.a libquark_big.a "$ROOT/lib/" - # Minimal SDK headers - install -m 0644 quark.h "$ROOT/include/" - # Man pages and docs - for f in *.3 *.7 *.8; do - [[ -f "$f" ]] && install -m 0644 "$f" "$ROOT/man/" || true - done - # Notices - install -m 0644 LICENSE.txt NOTICE.txt CHANGES "$ROOT/" - # Tarball + checksum + PKG="quark-${TAG}-linux-arm64-glibc" + ROOT="stage/${PKG}" + mkdir -p "${ROOT}" + make dist DESTDIR="${ROOT}" mkdir -p dist tar -C "$ROOT" -czf "dist/${PKG}.tar.gz" . sha256sum "dist/${PKG}.tar.gz" > "dist/${PKG}.tar.gz.sha256" @@ -218,10 +114,10 @@ jobs: - name: Upload artifact uses: actions/upload-artifact@v4 with: - name: quark-${{ env.TAG }}-linux-arm64-gnu + name: quark-${{ env.TAG }}-linux-arm64-glibc path: | - dist/quark-${{ env.TAG }}-linux-arm64-gnu.tar.gz - dist/quark-${{ env.TAG }}-linux-arm64-gnu.tar.gz.sha256 + dist/quark-${{ env.TAG }}-linux-arm64-glibc.tar.gz + dist/quark-${{ env.TAG }}-linux-arm64-glibc.tar.gz.sha256 build-musl-amd64: name: Build linux-amd64-musl @@ -236,47 +132,14 @@ jobs: run: | make alpine - - name: Strip binaries and libs - shell: bash - run: | - set -euo pipefail - # Executables - for f in quark-mon quark-btf quark-test quark-kube-talker; do - if [[ -f "$f" ]]; then strip --strip-unneeded "$f" || true; fi - done - # Static executables (musl static expected here) - for f in quark-mon-static quark-btf-static quark-test-static; do - if [[ -f "$f" ]]; then strip --strip-unneeded "$f" || true; fi - done - # Static libraries - for f in libquark.a libquark_big.a; do - if [[ -f "$f" ]]; then strip -g "$f" || true; fi - done - - name: Package artifacts shell: bash run: | set -euo pipefail PKG="quark-${TAG}-linux-amd64-musl" - ROOT="dist/${PKG}" - mkdir -p "$ROOT/bin" "$ROOT/bin-static" "$ROOT/lib" "$ROOT/include" "$ROOT/man" - # Binaries - install -m 0755 quark-mon quark-btf quark-test quark-kube-talker "$ROOT/bin/" - # Static binaries (if present) - for f in quark-mon-static quark-btf-static quark-test-static; do - [[ -f "$f" ]] && install -m 0755 "$f" "$ROOT/bin-static/" || true - done - # Libraries - install -m 0644 libquark.a libquark_big.a "$ROOT/lib/" - # Minimal SDK headers - install -m 0644 quark.h "$ROOT/include/" - # Man pages and docs - for f in *.3 *.7 *.8; do - [[ -f "$f" ]] && install -m 0644 "$f" "$ROOT/man/" || true - done - # Notices - install -m 0644 LICENSE.txt NOTICE.txt CHANGES "$ROOT/" - # Tarball + checksum + ROOT="stage/${PKG}" + mkdir -p "${ROOT}" + make dist DESTDIR="${ROOT}" mkdir -p dist tar -C "$ROOT" -czf "dist/${PKG}.tar.gz" . sha256sum "dist/${PKG}.tar.gz" > "dist/${PKG}.tar.gz.sha256" @@ -294,14 +157,40 @@ jobs: name: Publish GitHub Release runs-on: ubuntu-latest needs: - - build-gnu-amd64 - - build-gnu-amd64-glibc217 - - build-gnu-arm64 + - build-glibc-amd64 + - build-glibc217-amd64 + - build-glibc-arm64 - build-musl-amd64 steps: - name: Checkout uses: actions/checkout@v4 + - name: Verify QUARK_VERSION vs tag + shell: bash + run: | + set -euo pipefail + TAG="${TAG}" + VER_TAG="${TAG#v}" + BASE_VER=$(echo "$VER_TAG" | sed -E 's/-rc[0-9]+$//') + HDR_VER=$(grep -E '^[[:space:]]*#define[[:space:]]+QUARK_VERSION' quark.h | sed -E 's/.*"([^"]+)".*/\1/') + if [[ "$VER_TAG" == *-rc* ]]; then + # For -rc tags, expect header to be BASE_VER with trailing 'a' + if [[ "$HDR_VER" != "${BASE_VER}a" ]]; then + echo "QUARK_VERSION ($HDR_VER) must be ${BASE_VER}a for RC tags ($TAG)" >&2 + exit 1 + fi + else + # For final releases, expect exact match and no trailing 'a' + if [[ "$HDR_VER" != "$BASE_VER" ]]; then + echo "QUARK_VERSION ($HDR_VER) must equal $BASE_VER for tag $TAG" >&2 + exit 1 + fi + if [[ "$HDR_VER" == *a ]]; then + echo "QUARK_VERSION ($HDR_VER) must not end with 'a' for final release" >&2 + exit 1 + fi + fi + - name: Download all build artifacts uses: actions/download-artifact@v4 with: @@ -320,8 +209,9 @@ jobs: with: tag_name: ${{ env.TAG }} body_path: CHANGES + draft: true + prerelease: ${{ contains(env.TAG, '-rc') }} files: | dist/*.tar.gz dist/*.tar.gz.sha256 dist/SHA256SUMS - diff --git a/Makefile b/Makefile index cd5422fe..0ae3e209 100644 --- a/Makefile +++ b/Makefile @@ -3,6 +3,8 @@ PWD= $(shell pwd) HTML2MARKDOWN?= html2markdown SUDO?= sudo GO?= go +INSTALL?= install +PREFIX?= /usr/local # Normalize ARCH ifeq ($(shell uname -m), x86_64) @@ -509,8 +511,70 @@ clean-docs: $(call msg,CLEAN,docs) $(Q)rm -f docs/*.html +# +# Installation and distribution packaging +# +# Standard install (FHS) uses PREFIX and DESTDIR. Default PREFIX=/usr/local. +# Binaries -> $(PREFIX)/bin +# Libraries -> $(PREFIX)/lib +# Header -> $(PREFIX)/include +# Manpages -> $(PREFIX)/share/man/man{3,7,8} +# +install: all + $(call msg,INSTALL,bin) + $(Q)$(INSTALL) -d $(DESTDIR)$(PREFIX)/bin + $(Q)$(INSTALL) -m 0755 quark-mon $(DESTDIR)$(PREFIX)/bin/ + $(Q)$(INSTALL) -m 0755 quark-btf $(DESTDIR)$(PREFIX)/bin/ + $(Q)$(INSTALL) -m 0755 quark-test $(DESTDIR)$(PREFIX)/bin/ + $(Q)$(INSTALL) -m 0755 quark-kube-talker $(DESTDIR)$(PREFIX)/bin/ + $(call msg,INSTALL,lib) + $(Q)$(INSTALL) -d $(DESTDIR)$(PREFIX)/lib + $(Q)$(INSTALL) -m 0644 $(LIBQUARK_STATIC) $(DESTDIR)$(PREFIX)/lib/ + $(Q)$(INSTALL) -m 0644 $(LIBQUARK_STATIC_BIG) $(DESTDIR)$(PREFIX)/lib/ + $(call msg,INSTALL,include) + $(Q)$(INSTALL) -d $(DESTDIR)$(PREFIX)/include + $(Q)$(INSTALL) -m 0644 quark.h $(DESTDIR)$(PREFIX)/include/ + $(call msg,INSTALL,man) + $(Q)$(INSTALL) -d $(DESTDIR)$(PREFIX)/share/man/man3 + $(Q)$(INSTALL) -d $(DESTDIR)$(PREFIX)/share/man/man7 + $(Q)$(INSTALL) -d $(DESTDIR)$(PREFIX)/share/man/man8 + $(Q)for f in *.3; do [ -f "$$f" ] && $(INSTALL) -m 0644 "$$f" $(DESTDIR)$(PREFIX)/share/man/man3/ || true; done + $(Q)for f in *.7; do [ -f "$$f" ] && $(INSTALL) -m 0644 "$$f" $(DESTDIR)$(PREFIX)/share/man/man7/ || true; done + $(Q)for f in *.8; do [ -f "$$f" ] && $(INSTALL) -m 0644 "$$f" $(DESTDIR)$(PREFIX)/share/man/man8/ || true; done + +# Flattened distribution staging (tarball-friendly) +# Uses DESTDIR as the staging root, creates top-level bin/, bin-static/, lib/, include/, man/ +dist: all + $(call msg,DIST,$(DESTDIR)) + $(Q)test -n "$(DESTDIR)" || (echo "DESTDIR is required for 'make dist'"; exit 1) + $(Q)$(INSTALL) -d $(DESTDIR)/bin $(DESTDIR)/lib $(DESTDIR)/include $(DESTDIR)/man + # Optional static bin dir if any static binaries exist + $(Q)mkdir -p $(DESTDIR)/bin-static + # Binaries + $(Q)$(INSTALL) -m 0755 quark-mon $(DESTDIR)/bin/ + $(Q)$(INSTALL) -m 0755 quark-btf $(DESTDIR)/bin/ + $(Q)$(INSTALL) -m 0755 quark-test $(DESTDIR)/bin/ + $(Q)$(INSTALL) -m 0755 quark-kube-talker $(DESTDIR)/bin/ + # Static binaries (if built) + $(Q)[ -f quark-mon-static ] && $(INSTALL) -m 0755 quark-mon-static $(DESTDIR)/bin-static/ || true + $(Q)[ -f quark-btf-static ] && $(INSTALL) -m 0755 quark-btf-static $(DESTDIR)/bin-static/ || true + $(Q)[ -f quark-test-static ] && $(INSTALL) -m 0755 quark-test-static $(DESTDIR)/bin-static/ || true + # Libraries + $(Q)$(INSTALL) -m 0644 $(LIBQUARK_STATIC) $(DESTDIR)/lib/ + $(Q)$(INSTALL) -m 0644 $(LIBQUARK_STATIC_BIG) $(DESTDIR)/lib/ + # Minimal SDK header + $(Q)$(INSTALL) -m 0644 quark.h $(DESTDIR)/include/ + # Manpages (flattened in man/) + $(Q)for f in *.3 *.7 *.8; do [ -f "$$f" ] && $(INSTALL) -m 0644 "$$f" $(DESTDIR)/man/ || true; done + # Notices + $(Q)$(INSTALL) -m 0644 LICENSE.txt $(DESTDIR)/ + $(Q)$(INSTALL) -m 0644 NOTICE.txt $(DESTDIR)/ + $(Q)$(INSTALL) -m 0644 CHANGES $(DESTDIR)/ + .PHONY: \ all \ + install \ + dist \ btfhub \ centos7 \ centos7-image \