Skip to content

Test and Build

Test and Build #384

name: Test and Build
on:
workflow_dispatch:
inputs:
pr_number:
description: 'The pull request number to build'
required: true
type: 'string'
permissions:
contents: read
statuses: write # To set commit statuses
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
jobs:
build:
name: Test ${{ matrix.arch }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- arch: aarch64_generic
target: armsr-armv8
runtime_test: true
- arch: arm_cortex-a15_neon-vfpv4
target: armsr-armv7
runtime_test: true
- arch: arm_cortex-a9_vfpv3-d16
target: mvebu-cortexa9
runtime_test: false
- arch: i386_pentium-mmx
target: x86-geode
runtime_test: true
- arch: mips_24kc
target: ath79-generic
runtime_test: true
- arch: mipsel_24kc
target: mt7621
runtime_test: false
- arch: powerpc_464fp
target: apm821xx-nand
runtime_test: false
- arch: powerpc_8548
target: mpc85xx-p1010
runtime_test: false
# Workaround: riscv64_riscv64 was renamed to riscv64_generic
- arch: ${{ (github.base_ref == 'openwrt-24.10' || github.base_ref == 'openwrt-23.05') && 'riscv64_riscv64' || 'riscv64_generic' }}
target: sifiveu-generic
runtime_test: false
- arch: x86_64
target: x86-64
runtime_test: true
steps:
- name: Extract PR Data
id: get_pr_data
uses: actions/github-script@v8
with:
script: |
const prNumber = ${{ github.event.inputs.pr_number }};
if (!prNumber) {
core.setFailed('Pull request number not found in the event payload.');
return;
}
const { data: pr } = await github.rest.pulls.get({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: prNumber,
});
core.setOutput('head_sha', pr.head.sha);
core.setOutput('head_ref', pr.head.ref);
core.setOutput('base_ref', pr.base.ref);
core.setOutput('pr_number', prNumber);
- name: Set latest commit status as pending
uses: myrotvorets/set-commit-status-action@master
with:
sha: ${{ steps.get_pr_data.outputs.head_sha }}
context: ${{ github.workflow }}/${{ matrix.arch }}
status: pending
- uses: actions/checkout@v6
with:
ref: ${{ steps.get_pr_data.outputs.base_ref }}
fetch-depth: 0
- name: Determine branch name
run: |
BRANCH="${GITHUB_BASE_REF#refs/heads/}"
case "$BRANCH" in
main|master|openwrt-[0-9]*\.[0-9]*)
;;
*)
BRANCH="master"
;;
esac
echo "Building for $BRANCH"
echo "BRANCH=$BRANCH" >> $GITHUB_ENV
- name: Determine changed packages
run: |
# only detect packages with changes
PKG_ROOTS=$(find . -name Makefile | \
grep -v ".*/src/Makefile" | \
sed -e 's@./\(.*\)/Makefile@\1/@')
CHANGES=$(git diff --diff-filter=d --name-only origin/$BRANCH...)
for ROOT in $PKG_ROOTS; do
for CHANGE in $CHANGES; do
if [[ "$CHANGE" == "$ROOT"* ]]; then
PACKAGES+=$(echo "$ROOT" | sed -e 's@\(.*/\)*\(.*\)/@\2 @')
break
fi
done
done
# fallback to test packages if nothing explicitly changes this is
# should run if other mechanics in packages.git changed
REPOSITORY_NAME=${GITHUB_REPOSITORY#*/}
if [ "$REPOSITORY_NAME" = "routing" ]; then
PACKAGES="${PACKAGES:-bird2 cjdns olsrd}"
elif [ "$REPOSITORY_NAME" = "telephony" ]; then
PACKAGES="${PACKAGES:-asterisk siproxd freeswitch}"
else
PACKAGES="${PACKAGES:-vim attendedsysupgrade-common bmon}"
fi
echo "Building $PACKAGES"
echo "PACKAGES=$PACKAGES" >> $GITHUB_ENV
- name: Build
uses: openwrt/gh-action-sdk@v10
env:
ARCH: ${{ matrix.arch }}-${{ env.BRANCH }}
FEEDNAME: packages_ci
INDEX: 1
V: s
- name: Move created packages to project dir
if: always()
run: cp -v bin/packages/${{ matrix.arch }}/packages_ci/* . || true
- name: Collect metadata
if: always()
run: |
MERGE_ID=$(git rev-parse --short HEAD)
echo "MERGE_ID=$MERGE_ID" >> $GITHUB_ENV
echo "BASE_ID=$(git rev-parse --short HEAD^1)" >> $GITHUB_ENV
echo "HEAD_ID=$(git rev-parse --short HEAD^2)" >> $GITHUB_ENV
PRNUMBER=${GITHUB_REF_NAME%/merge}
echo "PRNUMBER=$PRNUMBER" >> $GITHUB_ENV
echo "ARCHIVE_NAME=${{matrix.arch}}-PR$PRNUMBER-$MERGE_ID" >> $GITHUB_ENV
- name: Generate metadata
if: always()
run: |
cat << _EOF_ > PKG-INFO
Metadata-Version: 2.1
Name: ${{env.ARCHIVE_NAME}}
Version: $BRANCH
Author: $GITHUB_ACTOR
Home-page: $GITHUB_SERVER_URL/$GITHUB_REPOSITORY/pull/$PRNUMBER
Download-URL: $GITHUB_SERVER_URL/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID
Summary: $PACKAGES
Platform: ${{ matrix.arch }}
Packages for OpenWrt $BRANCH running on ${{matrix.arch}}, built from PR $PRNUMBER
at commit $HEAD_ID, against $BRANCH at commit $BASE_ID, with merge SHA $MERGE_ID.
Modified packages:
_EOF_
for p in $PACKAGES
do
echo " "$p >> PKG-INFO
done
echo >> PKG-INFO
echo Full file listing: >> PKG-INFO
ls -al *.ipk >> PKG-INFO || true
ls -al *.apk >> PKG-INFO || true
cat PKG-INFO
- name: Store packages
if: always()
uses: actions/upload-artifact@v5
with:
name: ${{env.ARCHIVE_NAME}}-packages
path: |
Packages
Packages.*
*.ipk
packages.adb
*.apk
PKG-INFO
- name: Store logs
if: always()
uses: actions/upload-artifact@v5
with:
name: ${{env.ARCHIVE_NAME}}-logs
path: |
logs/
PKG-INFO
- name: Remove logs
if: always()
run: sudo rm -rf logs/ || true
- name: Check if any packages were built
run: |
if [ -n "$(find . -maxdepth 1 -type f -name '*.apk' -print -quit)" ]; then
echo "Found *.apk files"
HAVE_PKGS=true
PKG_MANAGER=apk
elif [ -n "$(find . -maxdepth 1 -type f -name '*.ipk' -print -quit)" ]; then
echo "Found *.ipk files"
HAVE_PKGS=true
PKG_MANAGER=opkg
else
echo "No *.apk or *.ipk files found"
HAVE_PKGS=false
fi
echo "HAVE_PKGS=$HAVE_PKGS" >> $GITHUB_ENV
echo "PKG_MANAGER=$PKG_MANAGER" >> $GITHUB_ENV
- name: Register QEMU
if: ${{ matrix.runtime_test && fromJSON(env.HAVE_PKGS) }}
run: |
sudo apt-get update
sudo apt-get install -y qemu-user-static binfmt-support
sudo update-binfmts --import
- name: Checkout
if: ${{ matrix.runtime_test && fromJSON(env.HAVE_PKGS) }}
uses: actions/checkout@v6
with:
repository: openwrt/actions-shared-workflows
path: dockerfiles_feeds
sparse-checkout: |
.github/scripts/ci_helpers.sh
.github/dockerfiles_feeds/Dockerfile
.github/dockerfiles_feeds/entrypoint.sh
sparse-checkout-cone-mode: false
- name: Build Docker container
if: ${{ matrix.runtime_test && fromJSON(env.HAVE_PKGS) }}
run: |
docker build --platform linux/${{ matrix.arch }} -t test-container \
--build-arg ARCH dockerfiles_feeds/.github/dockerfiles_feeds/
env:
ARCH: ${{ matrix.arch }}-${{ env.BRANCH }}
- name: Test via Docker container
if: ${{ matrix.runtime_test && fromJSON(env.HAVE_PKGS) }}
run: |
docker run --platform linux/${{ matrix.arch }} --rm -v $GITHUB_WORKSPACE:/ci \
-v $GITHUB_WORKSPACE/dockerfiles_feeds:/dockerfiles_feeds \
-e CI_HELPER=/dockerfiles_feeds/scripts/ci_helpers.sh \
-e PKG_MANAGER=${{ env.PKG_MANAGER }} \
test-container
- name: Set final commit status
uses: myrotvorets/set-commit-status-action@master
with:
sha: ${{ steps.get_pr_data.outputs.head_sha }}
context: ${{ github.workflow }}/${{ matrix.arch }}
status: ${{ job.status }}