Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 51 additions & 0 deletions .github/workflows/prepare-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
name: Prepare Release
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this one maybe can be removed, probably better to do this part manually


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

217 changes: 217 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,217 @@
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-glibc-amd64:
name: Build linux-amd64-glibc
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive

- name: Build with Docker (Ubuntu GNU)
run: |
make docker

- name: Package artifacts
shell: bash
run: |
set -euo pipefail
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"
rm -rf "$ROOT"

- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: quark-${{ env.TAG }}-linux-amd64-glibc
path: |
dist/quark-${{ env.TAG }}-linux-amd64-glibc.tar.gz
dist/quark-${{ env.TAG }}-linux-amd64-glibc.tar.gz.sha256

build-glibc217-amd64:
name: Build linux-amd64-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: Package artifacts
shell: bash
run: |
set -euo pipefail
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"
rm -rf "$ROOT"

- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: quark-${{ env.TAG }}-linux-amd64-glibc217
path: |
dist/quark-${{ env.TAG }}-linux-amd64-glibc217.tar.gz
dist/quark-${{ env.TAG }}-linux-amd64-glibc217.tar.gz.sha256

build-glibc-arm64:
name: Build linux-arm64-glibc
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: Package artifacts
shell: bash
run: |
set -euo pipefail
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"
rm -rf "$ROOT"

- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: quark-${{ env.TAG }}-linux-arm64-glibc
path: |
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
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive

- name: Build with Docker (Alpine musl)
run: |
make alpine

- name: Package artifacts
shell: bash
run: |
set -euo pipefail
PKG="quark-${TAG}-linux-amd64-musl"
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"
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-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:
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
draft: true
prerelease: ${{ contains(env.TAG, '-rc') }}
files: |
dist/*.tar.gz
dist/*.tar.gz.sha256
dist/SHA256SUMS
64 changes: 64 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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 \
Expand Down