name: Publish to Ubuntu PPA
on:
workflow_dispatch:
inputs:
tag:
description: 'Version tag to publish (e.g. v0.1.0)'
required: true
series:
description: 'Comma-separated Ubuntu series to target'
required: false
default: 'resolute'
workflow_call:
inputs:
tag:
description: 'Version tag to publish (e.g. v0.1.0)'
required: false
type: string
series:
description: 'Comma-separated Ubuntu series to target'
required: false
type: string
default: 'resolute'
secrets:
PPA_GPG_PRIVATE_KEY:
required: true
PPA_GPG_KEY_ID:
required: true
PPA_GPG_PASSPHRASE:
required: true
permissions:
contents: read
jobs:
resolve:
name: resolve inputs
runs-on: ubuntu-latest
outputs:
version: ${{ steps.ver.outputs.version }}
series: ${{ steps.ver.outputs.series }}
steps:
- uses: actions/checkout@v7
with:
persist-credentials: false
ref: ${{ inputs.tag || github.ref_name }}
- name: Resolve version and series matrix
id: ver
env:
INPUT_TAG: ${{ inputs.tag }}
REF_NAME: ${{ github.ref_name }}
INPUT_SERIES: ${{ inputs.series }}
run: |
REF="${INPUT_TAG:-$REF_NAME}"
VERSION="${REF#v}"
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
CARGO_VERSION=$(grep -m1 '^version' Cargo.toml | grep -oP '"\K[0-9]+\.[0-9]+\.[0-9]+')
if [ "$VERSION" != "$CARGO_VERSION" ]; then
echo "::error::Tag version ($VERSION) does not match Cargo.toml version ($CARGO_VERSION)"
exit 1
fi
SERIES_CSV="${INPUT_SERIES:-resolute}"
SERIES_JSON=$(printf '%s' "$SERIES_CSV" | tr ',' '\n' | jq -R . | jq -sc .)
echo "series=$SERIES_JSON" >> "$GITHUB_OUTPUT"
publish:
name: build & upload (${{ matrix.series }})
needs: resolve
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
series: ${{ fromJson(needs.resolve.outputs.series) }}
env:
VERSION: ${{ needs.resolve.outputs.version }}
SERIES: ${{ matrix.series }}
BUILD_ID: ${{ github.run_number }}r${{ github.run_attempt }}
DEBEMAIL: info@openrtmp.org
DEBFULLNAME: OpenRTMP
steps:
- uses: actions/checkout@v7
with:
persist-credentials: false
ref: ${{ inputs.tag || github.ref_name }}
- name: Install packaging dependencies
run: |
sudo apt-get update
sudo apt-get install -y \
devscripts debhelper dput lintian \
build-essential libssl-dev pkg-config
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Vendor cargo dependencies for an offline build
run: |
mkdir -p .cargo
cargo vendor vendor > .cargo/config.toml
- name: Verify the raw vendored tree builds offline
run: cargo build --release --offline --all-features --verbose
- name: Archive the vendored tree for the Debian source package
run: |
tar --sort=name \
--mtime='@0' \
--owner=0 --group=0 --numeric-owner \
-cJf vendor.tar.xz -C vendor .
rm -rf vendor target debian/cargo_home
- name: Add changelog entry for ${{ matrix.series }}
run: |
dch --package librtmp2 \
--newversion "${VERSION}~${SERIES}${BUILD_ID}" \
--distribution "${SERIES}" \
--force-distribution \
--force-bad-version \
"Automated build of ${VERSION} for ${SERIES}."
- name: Build source package (unsigned)
run: dpkg-buildpackage -S -sa -us -uc -d
- name: Verify the generated source package builds offline
run: |
VERIFY_DIR=$(mktemp -d)
trap 'rm -rf "$VERIFY_DIR"' EXIT
DSC="../librtmp2_${VERSION}~${SERIES}${BUILD_ID}.dsc"
dpkg-source -x "$DSC" "$VERIFY_DIR/source"
make -C "$VERIFY_DIR/source" -f debian/rules override_dh_auto_build
- name: Lintian (non-blocking sanity check)
run: lintian --pedantic "../librtmp2_${VERSION}~${SERIES}${BUILD_ID}_source.changes" || true
- name: Import signing key
run: |
mkdir -p ~/.gnupg && chmod 700 ~/.gnupg
printf 'allow-loopback-pinentry\n' >> ~/.gnupg/gpg-agent.conf
printf 'pinentry-mode loopback\n' >> ~/.gnupg/gpg.conf
gpgconf --kill gpg-agent
printf '%s' "${{ secrets.PPA_GPG_PRIVATE_KEY }}" | gpg --batch --import
- name: Sign source package
env:
PPA_GPG_PASSPHRASE: ${{ secrets.PPA_GPG_PASSPHRASE }}
run: |
PASSFILE=$(mktemp)
chmod 600 "$PASSFILE"
trap 'shred -u "$PASSFILE" 2>/dev/null' EXIT
printf '%s' "$PPA_GPG_PASSPHRASE" > "$PASSFILE"
debsign -k"${{ secrets.PPA_GPG_KEY_ID }}" \
-p"gpg --batch --pinentry-mode loopback --passphrase-file $PASSFILE" \
"../librtmp2_${VERSION}~${SERIES}${BUILD_ID}_source.changes"
- name: Upload to PPA
run: |
dput "ppa:${{ vars.PPA_TARGET }}" \
"../librtmp2_${VERSION}~${SERIES}${BUILD_ID}_source.changes"