MT#55283 GH: automate GitHub releases for mr* tags, build Debian packages for PRs + update to trixie

1) Add a release job

Automatically create a GitHub release with attached Debian packages,
whenever a tag starting with 'mr' is pushed.

Generate release notes grouped by author from git commits between the
previous mr* tag and the current tag, similar to the format used in
debian/changelog.

2) Automatically generate Debian packages for PRs

This is useful for contributors as well as developers, to test and
verify proposed changes.

3) Consolidate Debian package workflows

Merge debpkg.yml into package-build.yml using a matrix strategy for
building on multiple Debian distributions (trixie, sid), using
jtdor/build-deb-action instead of custom Docker actions.

Now our release job merges artifacts from all distros.

4) Update from bookworm to trixie

Bump Debian package builds from bookworm to trixie, while at it, given
that Debian trixie/v13 is the current stable Debian release.

5) Bump workflow actions from in package build workflow

Update from v4 to current version v6, see
https://github.com/actions/checkout

Closes #2063

Change-Id: Ic1bfb3a7f9fa7e263f8e8d3b115baa01633db1a1
(cherry picked from commit e9fc1b1057)
mr14.1
Michael Prokop 3 months ago committed by Richard Fuchs
parent 77cd57eb23
commit 3ba97731c6

@ -1,13 +0,0 @@
FROM debian:bookworm
COPY entrypoint.sh /entrypoint.sh
# avoid "debconf: (TERM is not set, so the dialog frontend is not usable.)"
ENV DEBIAN_FRONTEND noninteractive
# disable man-db to speed up builds
RUN echo 'man-db man-db/auto-update boolean false' | debconf-set-selections
RUN apt-get update && apt-get -y install build-essential
ENTRYPOINT ["/entrypoint.sh"]

@ -1,6 +0,0 @@
name: "Build Docker image based on Debian/bookworm"
description: "Build Docker image based on Debian/bookworm"
runs:
using: 'docker'
image: 'Dockerfile'

@ -1,16 +0,0 @@
#!/bin/bash
set -eu -o pipefail
echo "*** Starting execution of '$0' ***"
echo "** Installing build dependencies **"
apt-get -y build-dep -Ppkg.ngcp-rtpengine.nobcg729 .
echo "** Building Debian package **"
dpkg-buildpackage -Ppkg.ngcp-rtpengine.nobcg729
# We're inside /github/workspace/
echo "** Copying Debian package files to workspace **"
cp ../*.deb ../*.buildinfo ../workspace/
echo "*** Finished execution of '$0' ***"

@ -1,13 +0,0 @@
FROM debian:sid
COPY entrypoint.sh /entrypoint.sh
# avoid "debconf: (TERM is not set, so the dialog frontend is not usable.)"
ENV DEBIAN_FRONTEND noninteractive
# disable man-db to speed up builds
RUN echo 'man-db man-db/auto-update boolean false' | debconf-set-selections
RUN apt-get update && apt-get -y install build-essential
ENTRYPOINT ["/entrypoint.sh"]

@ -1,6 +0,0 @@
name: "Build Docker image based on Debian/sid"
description: "Build Docker image based on Debian/sid"
runs:
using: 'docker'
image: 'Dockerfile'

@ -1,16 +0,0 @@
#!/bin/bash
set -eu -o pipefail
echo "*** Starting execution of '$0' ***"
echo "** Installing build dependencies **"
apt-get -y build-dep -Ppkg.ngcp-rtpengine.nobcg729 .
echo "** Building Debian package **"
dpkg-buildpackage -Ppkg.ngcp-rtpengine.nobcg729
# We're inside /github/workspace/
echo "** Copying Debian package files to workspace **"
cp ../*.deb ../*.buildinfo ../workspace/
echo "*** Finished execution of '$0' ***"

@ -0,0 +1,90 @@
name: Debian package build
on:
pull_request:
push:
tags:
- 'mr*'
schedule:
- cron: '0 8 * * *'
permissions:
actions: read
contents: read
pull-requests: write
concurrency:
group: "${{ github.ref }}"
cancel-in-progress: true
jobs:
build-debian:
if: github.event_name != 'schedule' || github.repository == 'sipwise/rtpengine'
runs-on: ubuntu-latest
strategy:
matrix:
dist: [trixie, sid]
steps:
- uses: actions/checkout@v6
- name: Update changelog
run: |
set -ex
OLD_VERSION=$(dpkg-parsechangelog -SVersion)
SOURCE=$(dpkg-parsechangelog -SSource)
if [[ "${{ github.ref_type }}" == "tag" ]]; then
VERSION_SUFFIX="+gh"
else
VERSION_SUFFIX="+autobuild${GITHUB_RUN_NUMBER}"
fi
cat > debian/changelog <<EOT
${SOURCE} (${OLD_VERSION}${VERSION_SUFFIX}) UNRELEASED; urgency=medium
* Automated Build
-- Automated Build <builder@localhost> $(date -R)
EOT
- uses: jtdor/build-deb-action@v1
with:
docker-image: debian:${{ matrix.dist }}
buildpackage-opts: -Ppkg.ngcp-rtpengine.nobcg729
- name: Archive build result
uses: actions/upload-artifact@v6
with:
name: packages-${{ matrix.dist }}
if-no-files-found: error
retention-days: 14
path: |
debian/artifacts/*.deb
debian/artifacts/*.tar.*
debian/artifacts/*.changes
debian/artifacts/*.buildinfo
comment-pr:
if: github.event_name == 'pull_request'
needs: build-debian
runs-on: ubuntu-latest
steps:
- name: Comment PR with artifact links
continue-on-error: true
uses: actions/github-script@v8
with:
script: |
const runId = context.runId;
const repoOwner = context.repo.owner;
const repoName = context.repo.repo;
const artifacts = await github.rest.actions.listWorkflowRunArtifacts({
owner: repoOwner,
repo: repoName,
run_id: runId
});
const links = artifacts.data.artifacts
.filter(a => a.name.startsWith('packages-'))
.map(a => `- [${a.name}](https://github.com/${repoOwner}/${repoName}/actions/runs/${runId}/artifacts/${a.id})`)
.join('\n');
if (links) {
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: repoOwner,
repo: repoName,
body: `📦 Built Debian packages are ready!\n\n${links}`
});
}

@ -1,56 +0,0 @@
name: Debian Packaging
on:
push:
pull_request:
schedule:
- cron: '0 8 * * *'
jobs:
build-deb-bookworm:
if: github.event_name != 'schedule' || github.repository == 'sipwise/rtpengine'
runs-on: ubuntu-latest
name: Debian pipeline for bookworm
steps:
- name: Checkout source
uses: actions/checkout@v4
- name: Execute Docker debpkg action
uses: ./.github/actions/debpkg-bookworm
- name: Store Debian package artifacts
uses: actions/upload-artifact@v4
with:
name: Debian binary package files for bookworm
path: '*.deb'
- name: Store Debian package build info
uses: actions/upload-artifact@v4
with:
name: Debian buildinfo file for bookworm
path: '*.buildinfo'
build-deb-sid:
if: github.event_name != 'schedule' || github.repository == 'sipwise/rtpengine'
runs-on: ubuntu-latest
name: Debian pipeline for sid
steps:
- name: Checkout source
uses: actions/checkout@v4
- name: Execute Docker debpkg action
uses: ./.github/actions/debpkg-sid
- name: Store Debian package artifacts
uses: actions/upload-artifact@v4
with:
name: Debian binary package files for sid
path: '*.deb'
- name: Store Debian package build info
uses: actions/upload-artifact@v4
with:
name: Debian buildinfo file for sid
path: '*.buildinfo'

@ -0,0 +1,69 @@
name: Release
on:
workflow_run:
workflows: [Debian package build]
types: [completed]
permissions:
contents: write
jobs:
release:
# Only run for successful tag pushes starting with 'mr'
# (package-build.yml only triggers 'push' events for tags, not branches)
if: >-
github.event.workflow_run.conclusion == 'success' &&
github.event.workflow_run.event == 'push' &&
startsWith(github.event.workflow_run.head_branch, 'mr')
runs-on: ubuntu-latest
steps:
- name: Checkout source
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Download all build artifacts
uses: actions/download-artifact@v6
with:
path: packages
pattern: packages-*
merge-multiple: true
run-id: ${{ github.event.workflow_run.id }}
github-token: ${{ secrets.GITHUB_TOKEN }}
- name: Generate changelog
run: |
CURRENT_TAG="${{ github.event.workflow_run.head_branch }}"
PREVIOUS_TAG=$(git tag --list 'mr*' --sort=-version:refname | grep -A1 "^${CURRENT_TAG}$" | tail -1)
if [ "$PREVIOUS_TAG" = "$CURRENT_TAG" ] || [ -z "$PREVIOUS_TAG" ]; then
RANGE="$CURRENT_TAG"
else
RANGE="${PREVIOUS_TAG}..${CURRENT_TAG}"
fi
echo "Generating changelog for range: $RANGE"
echo "## Changes in ${CURRENT_TAG}" > release_notes.md
echo "" >> release_notes.md
if [ "$RANGE" != "$CURRENT_TAG" ]; then
echo "Changes since ${PREVIOUS_TAG}:" >> release_notes.md
echo "" >> release_notes.md
fi
git log --format='%aN' "$RANGE" | sort -u | while IFS= read -r author; do
echo "### $author" >> release_notes.md
echo "" >> release_notes.md
git log --format='* [%h] %s' --author="$author" "$RANGE" >> release_notes.md
echo "" >> release_notes.md
done
cat release_notes.md
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ github.event.workflow_run.head_branch }}
name: Release ${{ github.event.workflow_run.head_branch }}
body_path: release_notes.md
files: |
packages/*.deb
packages/*.tar.*
Loading…
Cancel
Save