Skip to content
Draft
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
276 changes: 227 additions & 49 deletions .github/workflows/armhf-release.yml
Original file line number Diff line number Diff line change
@@ -1,65 +1,243 @@
name: armhf release
name: ARM Cross-Platform Release

on:
push:
# Sequence of patterns matched against refs/tags
tags:
- 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10
- 'v*'

env:
BUILD_TYPE: Release
PACKAGE_NAME: bb-config

jobs:
armhf:
name: build-armhf
runs-on: ubuntu-latest

build-packages:
name: Build ${{ matrix.arch }} Package
runs-on: ubuntu-22.04
strategy:
matrix:
arch: [arm64, armhf]
include:
- arch: arm64
docker_platform: linux/arm64
deb_arch: arm64
cpu_flags: "-mcpu=cortex-a53 -mtune=cortex-a53"
- arch: armhf
docker_platform: linux/arm
deb_arch: armhf
cpu_flags: "-mcpu=cortex-a8 -mtune=cortex-a8"

steps:
- name: Checkout
uses: actions/checkout@v2
- name: Install Deps
uses: actions/checkout@v4

- name: Extract Version
id: version
run: |
sudo dpkg --add-architecture armhf
sudo apt install gcc-12-arm-linux-gnueabihf g++-12-arm-linux-gnueabihf libnm-dev:armhf libglib2.0-dev -y
- name: Build
id: armhf-artifact-download
VERSION=$(echo "${{ github.ref }}" | sed 's|refs/tags/||' | sed 's/^v//')
echo "VERSION=$VERSION" >> $GITHUB_ENV
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "Building ${{ env.PACKAGE_NAME }} version: $VERSION"

- name: Setup QEMU
uses: docker/setup-qemu-action@v3

- name: Setup Buildx
uses: docker/setup-buildx-action@v3

- name: Build with Docker
id: build_package
run: |
cd ${{ github.workspace }}
mkdir build
cd build
cmake .. -DCMAKE_CXX_COMPILER=$(which arm-linux-gnueabihf-g++-12) \
-DCMAKE_C_COMPILER=$(which arm-linux-gnueabihf-gcc-12) \
-DARMHF_DEB=ON \
-DARCHITECTURE="armhf" \
-DGIT_VERSION=$(echo ${{ github.ref }} | grep -o v'[0-9]\+\.[0-9]\+\.[0-9]\+')
make -j$(nproc)
make package
armhf__filename__=$(echo $(ls ${{steps.armhf-artifact-download.outputs.download-path}} | grep ..armhf.deb) | tr -d '\n')
name__=$(echo ${armhf__filename__%-*} | tr -d '\n')
version__=$(echo ${{ github.ref }} | grep -o v'[0-9]\+\.[0-9]\+\.[0-9]\+')
echo "name__=$name__" >> $GITHUB_ENV
echo "version__=$version__" >> $GITHUB_ENV
echo "armhf__filename__=$armhf__filename__" >> $GITHUB_ENV
- name: Create Release
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
echo "Building ${{ env.PACKAGE_NAME }} for ${{ matrix.arch }}"

# Create final package name
FINAL_FILENAME="${{ env.PACKAGE_NAME }}-v${{ env.VERSION }}-${{ matrix.arch }}.deb"
echo "Final package will be: $FINAL_FILENAME"
echo "final_filename=$FINAL_FILENAME" >> $GITHUB_OUTPUT

# Create a Dockerfile
cat > Dockerfile.build << 'DOCKERFILE'
FROM ubuntu:22.04

ARG VERSION
ARG CPU_FLAGS
ARG DEB_ARCH
ARG PACKAGE_NAME
ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update && apt-get install -y \
build-essential \
cmake \
pkg-config \
libnm-dev \
libglib2.0-dev \
debhelper \
dh-make \
git \
file \
&& rm -rf /var/lib/apt/lists/*

WORKDIR /build
COPY . .

RUN mkdir -p build && cd build && \
cmake .. \
-DCMAKE_C_FLAGS="$CPU_FLAGS -O2 -pipe" \
-DCMAKE_CXX_FLAGS="$CPU_FLAGS -O2 -pipe" \
-DARCHITECTURE="$DEB_ARCH" \
-DGIT_VERSION="$VERSION" && \
make -j$(nproc) && \
cpack -G DEB -D CPACK_DEBIAN_PACKAGE_ARCHITECTURE=$DEB_ARCH
DOCKERFILE

echo "Building Docker image..."
docker buildx build \
--platform ${{ matrix.docker_platform }} \
--tag ${{ matrix.arch }}-builder \
--build-arg VERSION="${{ env.VERSION }}" \
--build-arg CPU_FLAGS="${{ matrix.cpu_flags }}" \
--build-arg DEB_ARCH="${{ matrix.deb_arch }}" \
--build-arg PACKAGE_NAME="${{ env.PACKAGE_NAME }}" \
--load \
-f Dockerfile.build \
.

echo "Extracting package from container..."
docker create --name builder ${{ matrix.arch }}-builder
docker cp builder:/build/build/ ./build-output/
docker rm builder

# Find and rename the package
DEB_FILE=$(find build-output -name "*.deb" -type f | head -1)
if [ -n "$DEB_FILE" ]; then
# Get original package name and version
ORIG_NAME=$(basename "$DEB_FILE")

# Rename to final format
mv "$DEB_FILE" "$FINAL_FILENAME"
echo "Package renamed from $ORIG_NAME to $FINAL_FILENAME"
echo "Package created: $FINAL_FILENAME"
ls -la "$FINAL_FILENAME"
else
echo "ERROR: No .deb file found!"
find build-output -type f
exit 1
fi

- name: Verify Package
run: |
FINAL_FILENAME="${{ steps.build_package.outputs.final_filename }}"
echo "Verifying package: $FINAL_FILENAME"

if [ -f "$FINAL_FILENAME" ]; then
echo "Package info:"
dpkg-deb -I "$FINAL_FILENAME" || true
echo ""
echo "Package filename verified: $FINAL_FILENAME"
else
echo "ERROR: Package file '$FINAL_FILENAME' not found!"
exit 1
fi

- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.arch }}-package
path: ${{ steps.build_package.outputs.final_filename }}
retention-days: 5

create-release:
name: Create Release and Upload Assets
runs-on: ubuntu-22.04
needs: build-packages
if: success()

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Download All Artifacts
uses: actions/download-artifact@v4
with:
tag_name: ${{ env.version__ }}
release_name: Release ${{ env.version__ }}
draft: false
prerelease: false
- name: Upload Release Asset
id: upload-release-asset
uses: actions/upload-release-asset@v1
path: artifacts/
pattern: '*'
merge-multiple: true

- name: List Downloaded Files
run: |
echo "Downloaded artifacts:"
find artifacts/ -type f -name "*.deb" | while read file; do
echo "Found: $file"
dpkg-deb -I "$file" 2>/dev/null | grep -E "(Package|Version|Architecture)" || echo "Could not read package info"
done

- name: Extract Version
run: |
VERSION=$(echo "${{ github.ref }}" | sed 's|refs/tags/||' | sed 's/^v//')
echo "VERSION=$VERSION" >> $GITHUB_ENV
echo "PACKAGE_NAME=${{ env.PACKAGE_NAME }}" >> $GITHUB_ENV

- name: Find Package Files
id: find_packages
run: |
# Find all .deb files in artifacts
ARM64_PKG=$(find artifacts/ -name "*arm64*.deb" -o -path "*/arm64-package/*.deb" | head -1)
ARMHF_PKG=$(find artifacts/ -name "*armhf*.deb" -o -path "*/armhf-package/*.deb" | head -1)

if [ -n "$ARM64_PKG" ]; then
ARM64_BASENAME=$(basename "$ARM64_PKG")
echo "arm64_package=$ARM64_PKG" >> $GITHUB_OUTPUT
echo "arm64_basename=$ARM64_BASENAME" >> $GITHUB_OUTPUT
echo "Found ARM64 package: $ARM64_PKG"
else
echo "ERROR: ARM64 package not found!"
find artifacts/ -type f
exit 1
fi

if [ -n "$ARMHF_PKG" ]; then
ARMHF_BASENAME=$(basename "$ARMHF_PKG")
echo "armhf_package=$ARMHF_PKG" >> $GITHUB_OUTPUT
echo "armhf_basename=$ARMHF_BASENAME" >> $GITHUB_OUTPUT
echo "Found ARMHF package: $ARMHF_PKG"
else
echo "ERROR: ARMHF package not found!"
find artifacts/ -type f
exit 1
fi

- name: Create Release with Assets
uses: softprops/action-gh-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
# This pulls from the CREATE RELEASE step above, referencing it's ID to get its outputs object,
# which include a `upload_url`. See this blog post for more info:
# https://jasonet.co/posts/new-features-of-github-actions/#passing-data-to-future-steps
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ${{ github.workspace }}/build/${{ env.armhf__filename__ }}
asset_name: ${{ env.armhf__filename__ }}
asset_content_type: application/vnd.debian.binary-package
tag_name: ${{ github.ref_name }}
name: Release ${{ github.ref_name }}
draft: false
prerelease: false
body: |
ARM Cross-Platform Release v${{ env.VERSION }}

This release contains Debian packages for both ARM architectures:
- **ARM64** (64-bit): For PocketBeagle 2 and other ARMv8/AArch64 devices
- **ARMHF** (32-bit): For ARMv7 devices with hard-float ABI

### Installation
```bash
# ARM64 devices
sudo dpkg -i ${{ steps.find_packages.outputs.arm64_basename }}

# ARMHF devices
sudo dpkg -i ${{ steps.find_packages.outputs.armhf_basename }}
```

### Files
- `${{ steps.find_packages.outputs.arm64_basename }}` (ARM64/64-bit)
- `${{ steps.find_packages.outputs.armhf_basename }}` (ARMHF/32-bit)
files: |
${{ steps.find_packages.outputs.arm64_package }}
${{ steps.find_packages.outputs.armhf_package }}

- name: Verify Release Creation
run: |
echo "Release created successfully!"
echo "ARM64 package: ${{ steps.find_packages.outputs.arm64_basename }}"
echo "ARMHF package: ${{ steps.find_packages.outputs.armhf_basename }}"
25 changes: 11 additions & 14 deletions .github/workflows/pull_request_build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,18 @@ on:
- main

jobs:
armhf:
name: Test build
runs-on: ubuntu-latest
test-build:
name: Test Build
runs-on: ubuntu-22.04

steps:
- name: Checkout
uses: actions/checkout@v2
- name: Install Deps
uses: actions/checkout@v4

- name: Build with Docker
run: |
sudo apt install gcc-12 g++-12 libnm-dev libglib2.0-dev -y
- name: Build
run: |
cd ${{ github.workspace }}
mkdir build
cd build
cmake .. -DCMAKE_CXX_COMPILER=$(which g++-12) \
-DCMAKE_C_COMPILER=$(which gcc-12)
make -j$(nproc)
docker run --rm \
-v "$(pwd):/build" \
-w /build \
ubuntu:22.04 \
bash -c "apt-get update && apt-get install -y --no-install-recommends build-essential cmake pkg-config libnm-dev libglib2.0-dev git ca-certificates && rm -rf /var/lib/apt/lists/* && mkdir -p build && cd build && cmake .. && make -j\$(nproc)"
Loading