blob: e566b5cf15a42f417c88af03fa4fabc400cc135b [file] [edit]
name: Build & Distribute (Linux)
on:
workflow_call:
inputs:
tag:
description: "Type a release tag or 'nightly' for a nightly build"
required: true
type: string
jobs:
build:
strategy:
matrix:
architecture: [amd64, arm64]
target:
- distro: ubuntu
codename: jammy # EOL: Apr 2027
- distro: ubuntu
codename: noble # EOL: Apr 2029
- distro: debian
codename: bookworm # EOL: Jun 2028
- distro: debian
codename: trixie # EOL: Jun 2030
name: Build for ${{ matrix.target.distro }} ${{ matrix.target.codename }} on ${{ matrix.architecture }}
runs-on: ${{ matrix.architecture == 'amd64' && 'ubuntu-24.04' || 'ubuntu-24.04-arm' }}
container:
image: ${{ format('{0}:{1}', matrix.target.distro, matrix.target.codename) }}
options: --user root --workdir /workspace
env:
DEBIAN_FRONTEND: noninteractive
CCACHE_DIR: ${{ github.workspace }}/ccache
steps:
- name: Print environment
run: |
echo "Building ${{ inputs.tag }}"
echo "Running on ${{ matrix.target.distro }} ${{ matrix.target.codename }} for ${{ matrix.architecture }}"
echo "CCACHE_DIR: $CCACHE_DIR"
- name: Update package list
run: apt update
- name: Install build tools
run: |
apt install -y --no-install-recommends \
build-essential pkg-config g++ git cmake yasm fakeroot dpkg-dev devscripts debhelper ccache
- name: Install GPAC build dependencies
run: |
apt install -y --no-install-recommends \
zlib1g-dev libfreetype6-dev libpng-dev libmad0-dev libfaad-dev libogg-dev libvorbis-dev libtheora-dev \
liba52-0.7.4-dev libavcodec-dev libavformat-dev libavutil-dev libswscale-dev libavdevice-dev libnghttp2-dev \
libopenjp2-7-dev libcaca-dev libxv-dev x11proto-video-dev libgl1-mesa-dev libglu1-mesa-dev x11proto-gl-dev \
libxvidcore-dev libssl-dev libjack-jackd2-dev libasound2-dev libpulse-dev libsdl2-dev dvb-apps mesa-utils \
libcurl4-openssl-dev
if [ "${{ matrix.target.distro }}" = "ubuntu" ]; then
apt install -y --no-install-recommends libjpeg62-dev
else
apt install -y --no-install-recommends libjpeg62-turbo-dev
fi
- name: Get GPAC source
uses: actions/checkout@v4
with:
repository: gpac/gpac
fetch-depth: 0
path: gpac_public
ref: ${{ inputs.tag == 'nightly' && 'master' || inputs.tag }}
- name: Get manual dependencies
uses: actions/checkout@v4
with:
repository: gpac/deps_unix
fetch-depth: 1
path: deps_unix
submodules: true
- name: Set up ccache
uses: actions/cache@v4
with:
path: ${{ env.CCACHE_DIR }}
key: ccache-${{ matrix.target.distro }}-${{ matrix.target.codename }}-${{ matrix.architecture }}-${{ inputs.tag }}
- name: Build manual dependencies
working-directory: deps_unix
run: ./build_all.sh linux
- name: Build GPAC
working-directory: gpac_public
run: make deb -j$(nproc)
- name: Upload artifacts
uses: actions/upload-artifact@v4
env:
DIST_TYPE: ${{ inputs.tag == 'nightly' && 'nightly-latest' || format('main-{0}', inputs.tag) }}
with:
name: linux-${{ env.DIST_TYPE }}-${{ matrix.target.distro }}-${{ matrix.target.codename }}@${{ matrix.architecture }}
path: gpac_public/*gpac*.deb
retention-days: 1
publish:
needs: build
runs-on: ubuntu-latest
env:
AWS_ACCESS_KEY_ID: ${{ secrets.DIST_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.DIST_SECRET_ACCESS_KEY }}
steps:
- name: Download artifacts
uses: actions/download-artifact@v4
with:
pattern: linux-${{ inputs.tag == 'nightly' && 'nightly-latest' || format('main-{0}', inputs.tag) }}-*-*@*
path: artifacts
- name: Import GPG key
id: import-gpg
uses: crazy-max/ghaction-import-gpg@e89d40939c28e39f97cf32126055eeae86ba74ec # v6
with:
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
passphrase: ${{ secrets.GPG_PASSPHRASE }}
trust_level: 5 # ultimate
- uses: ruby/setup-ruby@v1
with:
ruby-version: '3.4'
bundler-cache: true
- name: Install deb-s3
run: gem install deb-s3
- name: Publish the artifacts
shell: bash
run: |
set -euxo pipefail
shopt -s nullglob
for folder in artifacts/*; do
echo "Processing folder $folder"
for artifact in "$folder"/*; do
echo "Adding artifact $artifact to ${{ secrets.DIST_S3_BUCKET }} repository."
# Rename the artifact so that there is no conflict
if [[ $artifact == *.deb ]]; then
folder_name=$(basename "$(dirname "$artifact")")
# Extract the required parts from the folder name
if [[ $folder_name =~ linux-([^-]+)-[^-]+-([^-]+)-([^-]+)@([^-]+) ]]; then
component="${BASH_REMATCH[1]}"
distro="${BASH_REMATCH[2]}"
codename="${BASH_REMATCH[3]}"
arch="${BASH_REMATCH[4]}"
date=$(date +"%s%3N")
# Get the version from the artifact name
file_name=$(basename "$artifact")
identifier=$(echo "$file_name" | cut -d'-' -f1) # gpac or libgpac
# Create a new name for the artifact
new_name="${identifier}_${component}_${distro}_${codename}_${arch}_${date}.deb"
# Copy the artifact to a new file with the new name
cp "$artifact" "${{ runner.temp }}/$new_name"
# Upload the artifact with the new name
deb-s3 upload \
${{ runner.temp }}/$new_name \
--bucket ${{ secrets.DIST_S3_BUCKET }} \
--endpoint ${{ secrets.DIST_S3_ENDPOINT }} \
--sign "${{ steps.import-gpg.outputs.keyid }}" \
--prefix linux/$distro/ \
--component $component \
--codename $codename \
--arch $arch \
--origin https://dist.gpac.io \
--lock \
--preserve-versions
echo "Uploaded $new_name to ${{ secrets.DIST_S3_BUCKET }}/linux/$distro/"
else
echo "Invalid folder name format: $folder_name"
exit 1
fi
else
echo "Artifact must be a .deb file: $artifact"
exit 1
fi
done
done
- name: Upload the public key
run: |
gpg --armor --export "${{ steps.import-gpg.outputs.fingerprint }}" > gpg.asc
aws s3 cp gpg.asc s3://${{ secrets.DIST_S3_BUCKET }}/linux/gpg.asc --endpoint-url ${{ secrets.DIST_S3_ENDPOINT }}