Skip to content
Merged
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
57 changes: 57 additions & 0 deletions .github/workflows/build-check.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
name: Build Check

on:
push:
branches: [main]
pull_request:
branches: [main]

jobs:
build:
name: Build ${{ matrix.arch }}
runs-on: ubuntu-latest
strategy:
matrix:
arch: [arm64, amd64]
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
submodules: recursive

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

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

- name: Build srtla for ${{ matrix.arch }}
run: |
PLATFORM="linux/${{ matrix.arch }}"

docker buildx build \
--platform "$PLATFORM" \
--load \
-t srtla-builder:${{ matrix.arch }} \
-f - . <<'DOCKERFILE'
FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y \
build-essential \
cmake \
git \
libspdlog-dev \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /build
COPY . .
RUN cmake -B build -DCMAKE_BUILD_TYPE=Release && cmake --build build -j$(nproc)
DOCKERFILE

- name: Verify binaries were built
run: |
docker run --rm srtla-builder:${{ matrix.arch }} ls -la /build/build/srtla_send /build/build/srtla_rec

- name: Build Summary
run: |
echo "## ✅ Build Check Passed" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**Architecture:** ${{ matrix.arch }}" >> $GITHUB_STEP_SUMMARY
278 changes: 278 additions & 0 deletions .github/workflows/publish-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,278 @@
name: Publish Release

on:
workflow_dispatch:
inputs:
release_type:
description: "Release type"
required: true
type: choice
options:
- stable
- beta
default: stable

jobs:
calculate-version:
name: Calculate Version
runs-on: ubuntu-latest
outputs:
version: ${{ steps.calver.outputs.version }}
channel: ${{ steps.calver.outputs.channel }}
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Calculate CalVer version
id: calver
env:
RELEASE_TYPE: ${{ github.event.inputs.release_type || 'beta' }}
run: |
YEAR=$(date -u +"%Y")
MONTH=$(date -u +"%-m")
IS_BETA=$([[ "$RELEASE_TYPE" == "beta" ]] && echo "true" || echo "false")

PREFIX="v${YEAR}.${MONTH}"

if [ "$IS_BETA" == "true" ]; then
LATEST_BETA=$(git tag -l "${PREFIX}.*-beta.*" | sed -E "s/.*-beta\.([0-9]+)/\1/" | sort -n | tail -1)
if [ -z "$LATEST_BETA" ]; then
BETA_NUM=1
else
BETA_NUM=$((LATEST_BETA + 1))
fi
LATEST_STABLE=$(git tag -l "${PREFIX}.*" | grep -v beta | sed "s/${PREFIX}\.//" | sort -n | tail -1)
PATCH=${LATEST_STABLE:-0}
NEXT_PATCH=$((PATCH + 1))
VERSION="${YEAR}.${MONTH}.${NEXT_PATCH}-beta.${BETA_NUM}"
CHANNEL="beta"
else
LATEST_PATCH=$(git tag -l "${PREFIX}.*" | grep -v beta | sed "s/${PREFIX}\.//" | sort -n | tail -1)
if [ -z "$LATEST_PATCH" ]; then
PATCH=0
else
PATCH=$((LATEST_PATCH + 1))
fi
VERSION="${YEAR}.${MONTH}.${PATCH}"
CHANNEL="stable"
fi

echo "version=${VERSION}" >> $GITHUB_OUTPUT
echo "channel=${CHANNEL}" >> $GITHUB_OUTPUT
echo "Version: ${VERSION} (Channel: ${CHANNEL})"

build-deb:
name: Build Debian Package (${{ matrix.arch }})
needs: calculate-version
runs-on: ubuntu-latest
strategy:
matrix:
arch: [arm64, amd64]
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
submodules: recursive

- name: Set up QEMU
if: matrix.arch == 'arm64'
uses: docker/setup-qemu-action@v3

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Build in Docker (${{ matrix.arch }})
run: |
mkdir -p build-output

cat > Dockerfile.build << 'DOCKERFILE'
FROM debian:bookworm

RUN apt-get update && apt-get install -y \
build-essential \
cmake \
pkg-config \
libspdlog-dev \
&& rm -rf /var/lib/apt/lists/*

WORKDIR /src
COPY . .

RUN cmake -B build -DCMAKE_BUILD_TYPE=Release -DSRTLA_BUILD_TESTS=OFF \
-DCMAKE_INSTALL_PREFIX=/usr
RUN cmake --build build -j$(nproc)
RUN DESTDIR=/output cmake --install build
DOCKERFILE

docker buildx build \
--platform linux/${{ matrix.arch }} \
--output type=local,dest=build-output \
-f Dockerfile.build \
.

- name: Install FPM
run: |
sudo apt-get update
sudo apt-get install -y ruby-dev gcc g++
sudo gem install fpm

- name: Create packages
env:
VERSION: ${{ needs.calculate-version.outputs.version }}
ARCH: ${{ matrix.arch }}
run: |
mkdir -p dist

# Create .deb package
fpm -s dir -t deb \
-n srtla \
-v "${VERSION}" \
-a "${ARCH}" \
--description "SRTLA - SRT Link Aggregation sender and receiver" \
--maintainer "CERALIVE <contact@ceralive.com>" \
--url "https://github.com/CERALIVE/srtla" \
--license "AGPL-3.0" \
--depends "srt" \
--depends "libspdlog1" \
-p "dist/srtla_${VERSION}_${ARCH}.deb" \
build-output/usr/=/usr/

# Create .tar.gz archive
mkdir -p tarball/srtla-${VERSION}
cp -r build-output/usr/* tarball/srtla-${VERSION}/
cd tarball
tar -czvf ../dist/srtla_${VERSION}_${ARCH}.tar.gz srtla-${VERSION}
cd ..

# Create checksums
cd dist
sha256sum srtla_${VERSION}_${ARCH}.deb > srtla_${VERSION}_${ARCH}.deb.sha256
sha256sum srtla_${VERSION}_${ARCH}.tar.gz > srtla_${VERSION}_${ARCH}.tar.gz.sha256

- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: srtla-${{ matrix.arch }}
path: |
dist/*.deb
dist/*.tar.gz
dist/*.sha256

sign-and-publish:
name: Sign and Publish to R2
needs: [calculate-version, build-deb]
runs-on: ubuntu-latest
steps:
- name: Download all artifacts
uses: actions/download-artifact@v4
with:
path: artifacts

- name: Prepare dist directory
run: |
mkdir -p dist/arm64 dist/amd64 dist/release
mv artifacts/srtla-arm64/*.deb dist/arm64/
mv artifacts/srtla-amd64/*.deb dist/amd64/
cp artifacts/srtla-arm64/*.tar.gz dist/release/
cp artifacts/srtla-amd64/*.tar.gz dist/release/
cp artifacts/srtla-arm64/*.sha256 dist/release/
cp artifacts/srtla-amd64/*.sha256 dist/release/

- name: Import GPG key
run: |
echo "${{ secrets.DEB_SIGNING_KEY_B64 }}" | base64 -d | gpg --batch --import

- name: Install apt-utils
run: sudo apt-get update && sudo apt-get install -y apt-utils

- name: Generate and sign repo metadata (arm64)
run: |
cd dist/arm64
dpkg-scanpackages . > Packages
gzip -k Packages
apt-ftparchive release . > Release
gpg --batch --yes -abs -o Release.gpg Release
gpg --batch --yes --clearsign -o InRelease Release

- name: Generate and sign repo metadata (amd64)
run: |
cd dist/amd64
dpkg-scanpackages . > Packages
gzip -k Packages
apt-ftparchive release . > Release
gpg --batch --yes -abs -o Release.gpg Release
gpg --batch --yes --clearsign -o InRelease Release

- name: Install AWS CLI
run: |
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip -q awscliv2.zip
sudo ./aws/install

- name: Upload to R2
env:
R2_ACCESS_KEY_ID: ${{ secrets.R2_ACCESS_KEY_ID }}
R2_SECRET_ACCESS_KEY: ${{ secrets.R2_SECRET_ACCESS_KEY }}
R2_ENDPOINT: ${{ secrets.R2_ENDPOINT }}
R2_BUCKET: ${{ secrets.R2_BUCKET }}
CHANNEL: ${{ needs.calculate-version.outputs.channel }}
run: |
aws configure set aws_access_key_id "$R2_ACCESS_KEY_ID"
aws configure set aws_secret_access_key "$R2_SECRET_ACCESS_KEY"

aws s3 sync dist/arm64/ "s3://$R2_BUCKET/dists/$CHANNEL/binary-arm64/" \
--endpoint-url "$R2_ENDPOINT"
aws s3 sync dist/amd64/ "s3://$R2_BUCKET/dists/$CHANNEL/binary-amd64/" \
--endpoint-url "$R2_ENDPOINT"

- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
tag_name: v${{ needs.calculate-version.outputs.version }}
name: srtla v${{ needs.calculate-version.outputs.version }}
prerelease: ${{ needs.calculate-version.outputs.channel == 'beta' }}
files: |
dist/arm64/*.deb
dist/amd64/*.deb
dist/release/*.tar.gz
dist/release/*.sha256
body: |
## srtla v${{ needs.calculate-version.outputs.version }}

SRTLA (SRT Link Aggregation) - Bond multiple network connections for reliable streaming.

### Dependency Chain
```
srt
└── srtla (this package)
├── Depends: srt, libspdlog1
└── Used by: ceracoder → ceralive-device
```

### Debian Packages
| Architecture | Package |
|--------------|---------|
| ARM64 | `srtla_${{ needs.calculate-version.outputs.version }}_arm64.deb` |
| AMD64 | `srtla_${{ needs.calculate-version.outputs.version }}_amd64.deb` |

### Binary Archives
| Architecture | Archive |
|--------------|---------|
| ARM64 | `srtla_${{ needs.calculate-version.outputs.version }}_arm64.tar.gz` |
| AMD64 | `srtla_${{ needs.calculate-version.outputs.version }}_amd64.tar.gz` |

### Installation

**Debian/Ubuntu:**
```bash
sudo dpkg -i srtla_${{ needs.calculate-version.outputs.version }}_<arch>.deb
```

**Manual:**
```bash
tar -xzf srtla_${{ needs.calculate-version.outputs.version }}_<arch>.tar.gz
sudo cp -r srtla-${{ needs.calculate-version.outputs.version }}/* /usr/
```