Skip to content

Publish portable x86-64 and AArch64 Linux builds #183

Publish portable x86-64 and AArch64 Linux builds

Publish portable x86-64 and AArch64 Linux builds #183

Workflow file for this run

name: 'Build Binary'
on:
push:
branches: ['main']
tags: ['*']
pull_request:
branches: ['*']
jobs:
generate-metadata:
name: 'Generate FFI metadata'
runs-on: ubuntu-24.04
env:
ASTREIN_VERSION: '1.1.0'
ASTREIN_SHA256: 'd5964319ea5a3742e4d7223ee5963d6aa3b24c8f67ef75c61d591c635f413497'
outputs:
package_version: ${{ steps.version.outputs.PACKAGE_VERSION }}
is_valid_package_version: ${{ steps.check-tag.outputs.IS_VALID_PACKAGE_VERSION }}
steps:
- name: 'Checkout repository'
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: 'Setup GCC'
uses: egor-tensin/setup-gcc@v2
with:
version: '16'
platform: 'x64'
- name: 'Download ASTrein'
run: |
curl --fail --location \
--output "${RUNNER_TEMP}/astrein-linux-x86_64.tar.gz" \
"https://github.com/Katze719/ASTrein/releases/download/v${ASTREIN_VERSION}/astrein-linux-x86_64.tar.gz"
echo "${ASTREIN_SHA256} ${RUNNER_TEMP}/astrein-linux-x86_64.tar.gz" \
| sha256sum --check -
mkdir -p "${RUNNER_TEMP}/astrein"
tar -xzf "${RUNNER_TEMP}/astrein-linux-x86_64.tar.gz" \
-C "${RUNNER_TEMP}/astrein" \
--strip-components=1
"${RUNNER_TEMP}/astrein/bin/astrein" --version
- name: 'Setup CMake'
uses: jwlawson/actions-setup-cmake@v2
with:
cmake-version: '3.31.x'
- name: 'Configure CMake'
run: |
cmake --preset linux-gcc-release \
-DCMAKE_C_COMPILER=gcc-16 \
-DCMAKE_CXX_COMPILER=g++-16 \
-DCPP_BINDINGS_LINUX_ENABLE_FFI_JSON_EXPORT=ON \
-DCPP_BINDINGS_LINUX_ASTREIN_EXECUTABLE="${RUNNER_TEMP}/astrein/bin/astrein"
- name: 'Generate metadata'
run: |
cmake --build --preset linux-gcc-release \
--target cpp_bindings_linux_ffi_json
- name: 'Set package version'
id: version
run: |
. build/env.sh
echo "PACKAGE_VERSION=${PACKAGE_VERSION}" >> "${GITHUB_OUTPUT}"
- name: 'Check package version'
id: check-tag
env:
PACKAGE_VERSION: ${{ steps.version.outputs.PACKAGE_VERSION }}
run: |
if [[ "${PACKAGE_VERSION}" =~ ^(0|[1-9][[:digit:]]*)\.(0|[1-9][[:digit:]]*)\.(0|[1-9][[:digit:]]*)(-(alpha|rc|beta|experimental)\.[1-9][[:digit:]]*)?$ ]]; then
echo "Version \"${PACKAGE_VERSION}\" is a valid package version."
echo "IS_VALID_PACKAGE_VERSION=true" >> "${GITHUB_OUTPUT}"
else
echo "Version \"${PACKAGE_VERSION}\" is not a valid package version."
echo "IS_VALID_PACKAGE_VERSION=false" >> "${GITHUB_OUTPUT}"
fi
- name: 'Upload FFI metadata'
uses: actions/upload-artifact@v4
with:
if-no-files-found: error
name: cpp-bindings-linux-ffi
path: build/cpp_bindings_linux.ffi.json
build-binary:
name: 'Build ${{ matrix.target }}'
runs-on: ${{ matrix.runner }}
container:
image: ${{ matrix.image }}
strategy:
fail-fast: false
matrix:
include:
- target: linux-x86_64-gnu
runner: ubuntu-24.04
image: quay.io/pypa/manylinux_2_28_x86_64@sha256:4dc41da7df20400310c80d162a2fe2d2c2f3d9734d8dec20f6b9843711618deb
artifact: libcpp_bindings_linux-linux-x86_64-gnu
- target: linux-aarch64-gnu
runner: ubuntu-24.04-arm
image: quay.io/pypa/manylinux_2_28_aarch64@sha256:29a6ceb78de5b00494e6e7456a72782a4cb54238de102e7491d15fe47789b4d1
artifact: libcpp_bindings_linux-linux-aarch64-gnu
steps:
- name: 'Checkout repository'
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: 'Configure portable release'
run: |
cmake -S . -B build -G "Unix Makefiles" \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_C_COMPILER=gcc \
-DCMAKE_CXX_COMPILER=g++ \
-DCPP_BINDINGS_LINUX_PORTABLE_CPU_BASELINE=ON \
-DCPP_BINDINGS_LINUX_STATIC_CXX_RUNTIME=ON
- name: 'Build and test'
run: |
cmake --build build \
--target cpp_bindings_linux cpp_bindings_linux_tests \
--parallel 4
ctest --test-dir build \
--output-on-failure \
--output-junit test-report.xml
- name: 'Stage and verify binary'
run: |
mkdir -p "dist/${{ matrix.target }}"
cp -L build/libcpp_bindings_linux.so \
"dist/${{ matrix.target }}/libcpp_bindings_linux.so"
./scripts/verify_release_binary.sh \
"dist/${{ matrix.target }}/libcpp_bindings_linux.so" \
"${{ matrix.target }}"
- name: 'Upload test report'
if: always()
uses: actions/upload-artifact@v4
with:
if-no-files-found: warn
name: test-report-${{ matrix.target }}
path: build/test-report.xml
- name: 'Upload binary'
uses: actions/upload-artifact@v4
with:
if-no-files-found: error
name: ${{ matrix.artifact }}
path: dist/${{ matrix.target }}/libcpp_bindings_linux.so
test-unit-cpp:
name: 'Run: Test Unit C++'
needs: ['build-binary']
uses: './.github/workflows/test_unit_cpp.yml'
with:
artifact-name: libcpp_bindings_linux-linux-x86_64-gnu
permissions:
contents: read
checks: write
create-release:
name: 'Create GitHub release'
needs: ['generate-metadata', 'build-binary', 'test-unit-cpp']
if: github.ref_type == 'tag' && needs.generate-metadata.outputs.is_valid_package_version == 'true'
runs-on: ubuntu-24.04
permissions:
contents: write
steps:
- name: 'Download x86-64 binary'
uses: actions/download-artifact@v4
with:
name: libcpp_bindings_linux-linux-x86_64-gnu
path: release/x86_64
- name: 'Download AArch64 binary'
uses: actions/download-artifact@v4
with:
name: libcpp_bindings_linux-linux-aarch64-gnu
path: release/aarch64
- name: 'Download FFI metadata'
uses: actions/download-artifact@v4
with:
name: cpp-bindings-linux-ffi
path: release/ffi
- name: 'Name release assets'
run: |
mv release/x86_64/libcpp_bindings_linux.so \
release/libcpp_bindings_linux-linux-x86_64-gnu.so
mv release/aarch64/libcpp_bindings_linux.so \
release/libcpp_bindings_linux-linux-aarch64-gnu.so
mv release/ffi/cpp_bindings_linux.ffi.json \
release/cpp_bindings_linux.ffi.json
- name: 'Create GitHub release'
uses: softprops/action-gh-release@v2
with:
name: 'v${{ needs.generate-metadata.outputs.package_version }}'
tag_name: ${{ github.ref_name }}
generate_release_notes: true
files: |
release/libcpp_bindings_linux-linux-x86_64-gnu.so
release/libcpp_bindings_linux-linux-aarch64-gnu.so
release/cpp_bindings_linux.ffi.json
publish-jsr:
name: 'Run: Publish JSR'
needs: ['generate-metadata', 'build-binary', 'test-unit-cpp']
uses: './.github/workflows/publish_jsr.yml'
with:
publish: ${{ needs.generate-metadata.outputs.is_valid_package_version == 'true' }}
version: ${{ needs.generate-metadata.outputs.package_version }}
x86-64-artifact-name: libcpp_bindings_linux-linux-x86_64-gnu
aarch64-artifact-name: libcpp_bindings_linux-linux-aarch64-gnu
ffi-artifact-name: cpp-bindings-linux-ffi
permissions:
contents: read
id-token: write