From 36467b50b07e7ea62ec211c9b0cb26821656eb98 Mon Sep 17 00:00:00 2001 From: Paul Spooren Date: Thu, 4 Mar 2021 21:50:15 -1000 Subject: [PATCH] CI: add GitHub testing of Pull Requests Perform formal checks and see if packages compile on multiple architectures. Signed-off-by: Paul Spooren --- .github/workflows/Dockerfile | 6 ++ .github/workflows/ci_helpers.sh | 26 +++++ .github/workflows/entrypoint.sh | 39 ++++++++ .github/workflows/formal.yml | 63 ++++++++++++ .github/workflows/multi-arch-test-build.yml | 102 ++++++++++++++++++++ 5 files changed, 236 insertions(+) create mode 100644 .github/workflows/Dockerfile create mode 100644 .github/workflows/ci_helpers.sh create mode 100755 .github/workflows/entrypoint.sh create mode 100644 .github/workflows/formal.yml create mode 100644 .github/workflows/multi-arch-test-build.yml diff --git a/.github/workflows/Dockerfile b/.github/workflows/Dockerfile new file mode 100644 index 0000000..aa269b7 --- /dev/null +++ b/.github/workflows/Dockerfile @@ -0,0 +1,6 @@ +ARG ARCH=x86-64 +FROM openwrtorg/rootfs:$ARCH + +ADD entrypoint.sh /entrypoint.sh + +CMD ["/entrypoint.sh"] diff --git a/.github/workflows/ci_helpers.sh b/.github/workflows/ci_helpers.sh new file mode 100644 index 0000000..60dcd4e --- /dev/null +++ b/.github/workflows/ci_helpers.sh @@ -0,0 +1,26 @@ +#!/bin/sh + +color_out() { + printf "\e[0;$1m$PKG_NAME: %s\e[0;0m\n" "$2" +} + +success() { + color_out 32 "$1" +} + +info() { + color_out 36 "$1" +} + +err() { + color_out 31 "$1" +} + +warn() { + color_out 33 "$1" +} + +err_die() { + err "$1" + exit 1 +} diff --git a/.github/workflows/entrypoint.sh b/.github/workflows/entrypoint.sh new file mode 100755 index 0000000..d7d4ecd --- /dev/null +++ b/.github/workflows/entrypoint.sh @@ -0,0 +1,39 @@ +#!/bin/sh + +mkdir -p /var/lock/ + +opkg update + +[ -n "$CI_HELPER" ] || CI_HELPER="/ci/.github/workflows/ci_helpers.sh" + +for PKG in /ci/*.ipk; do + tar -xzOf "$PKG" ./control.tar.gz | tar xzf - ./control + # package name including variant + PKG_NAME=$(sed -ne 's#^Package: \(.*\)$#\1#p' ./control) + # package version without release + PKG_VERSION=$(sed -ne 's#^Version: \(.*\)-[0-9]*$#\1#p' ./control) + # package source contianing test.sh script + PKG_SOURCE=$(sed -ne 's#^Source: .*/\(.*\)$#\1#p' ./control) + + echo "Testing package $PKG_NAME in version $PKG_VERSION from $PKG_SOURCE" + + opkg install "$PKG" + + export PKG_NAME PKG_VERSION CI_HELPER + + TEST_SCRIPT=$(find /ci/ -name "$PKG_SOURCE" -type d)/test.sh + + if [ -f "$TEST_SCRIPT" ]; then + echo "Use package specific test.sh" + if sh "$TEST_SCRIPT" "$PKG_NAME" "$PKG_VERSION"; then + echo "Test succesful" + else + echo "Test failed" + exit 1 + fi + else + echo "No test.sh script available" + fi + + opkg remove "$PKG_NAME" --force-removal-of-dependent-packages --force-remove +done diff --git a/.github/workflows/formal.yml b/.github/workflows/formal.yml new file mode 100644 index 0000000..2560917 --- /dev/null +++ b/.github/workflows/formal.yml @@ -0,0 +1,63 @@ +name: Test Formalities + +on: + pull_request: + +jobs: + build: + name: Test Formalities + runs-on: ubuntu-latest + strategy: + fail-fast: false + + steps: + - uses: actions/checkout@v2 + with: + ref: ${{ github.event.pull_request.head.sha }} + fetch-depth: 0 + + - name: Determine branch name + run: | + BRANCH="${GITHUB_BASE_REF#refs/heads/}" + echo "Building for $BRANCH" + echo "BRANCH=$BRANCH" >> $GITHUB_ENV + + - name: Test formalities + run: | + source .github/workflows/ci_helpers.sh + + RET=0 + for commit in $(git rev-list HEAD ^origin/$BRANCH); do + info "=== Checking commit '$commit'" + if git show --format='%P' -s $commit | grep -qF ' '; then + err "Pull request should not include merge commits" + RET=1 + fi + + author="$(git show -s --format=%aN $commit)" + if echo $author | grep -q '\S\+\s\+\S\+'; then + success "Author name ($author) seems ok" + else + err "Author name ($author) need to be your real name 'firstname lastname'" + RET=1 + fi + + subject="$(git show -s --format=%s $commit)" + if echo "$subject" | grep -q -e '^[0-9A-Za-z,+/_-]\+: ' -e '^Revert '; then + success "Commit subject line seems ok ($subject)" + else + err "Commit subject line MUST start with ': ' ($subject)" + RET=1 + fi + + body="$(git show -s --format=%b $commit)" + sob="$(git show -s --format='Signed-off-by: %aN <%aE>' $commit)" + if echo "$body" | grep -qF "$sob"; then + success "Signed-off-by match author" + else + err "Signed-off-by is missing or doesn't match author (should be '$sob')" + RET=1 + fi + done + + exit $RET diff --git a/.github/workflows/multi-arch-test-build.yml b/.github/workflows/multi-arch-test-build.yml new file mode 100644 index 0000000..cbd9663 --- /dev/null +++ b/.github/workflows/multi-arch-test-build.yml @@ -0,0 +1,102 @@ +name: Test Build + +on: + pull_request: + +jobs: + build: + name: Test ${{ matrix.arch }} + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + arch: + - arc_archs + - arm_cortex-a9_vfpv3-d16 + - mips_24kc + - powerpc_464fp + - powerpc_8540 + runtime_test: [false] + include: + - arch: aarch64_cortex-a53 + runtime_test: true + - arch: arm_cortex-a15_neon-vfpv4 + runtime_test: true + - arch: i386_pentium-mmx + runtime_test: true + - arch: x86_64 + runtime_test: true + + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: Determine branch name + run: | + BRANCH="${GITHUB_BASE_REF#refs/heads/}" + 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@.*/\(.*\)/@\1 @') + break + fi + done + done + + # fallback to test packages if nothing explicitly changes this is + # should run if other mechanics in packages.git changed + PACKAGES="${PACKAGES:-vim tmux bmon}" + + echo "Building $PACKAGES" + echo "PACKAGES=$PACKAGES" >> $GITHUB_ENV + + - name: Build + uses: openwrt/gh-action-sdk@v1 + env: + ARCH: ${{ matrix.arch }}-${{ env.BRANCH }} + FEEDNAME: packages_ci + + - name: Move created packages to project dir + run: cp bin/packages/${{ matrix.arch }}/packages_ci/*.ipk . || true + + - name: Store packages + uses: actions/upload-artifact@v2 + with: + name: ${{ matrix.arch}}-packages + path: "*.ipk" + + - name: Store logs + uses: actions/upload-artifact@v2 + with: + name: ${{ matrix.arch}}-logs + path: logs/ + + - name: Remove logs + run: sudo rm -rf logs/ || true + + - name: Register QEMU + if: ${{ matrix.runtime_test }} + run: | + sudo docker run --rm --privileged aptman/qus -s -- -p + + - name: Build Docker container + if: ${{ matrix.runtime_test }} + run: | + docker build -t test-container --build-arg ARCH .github/workflows/ + env: + ARCH: ${{ matrix.arch }} + + - name: Test via Docker container + if: ${{ matrix.runtime_test }} + run: | + docker run --rm -v $GITHUB_WORKSPACE:/ci test-container -- 2.30.2