CI: add manual staging build
[openwrt/staging/aparcar.git] / .github / workflows / build-staging.yml
diff --git a/.github/workflows/build-staging.yml b/.github/workflows/build-staging.yml
new file mode 100644 (file)
index 0000000..47cf62d
--- /dev/null
@@ -0,0 +1,362 @@
+name: Build ApkWrt snapshot
+
+on:
+  workflow_dispatch:
+    inputs:
+      target:
+        description: "Targets to build (x86/64 ath79/genric mediatek/mt7622)"
+        required: false
+        default: "x86/64 ath79/generic mediatek/mt7622"
+      config:
+        description: "Extra lines to append to the config"
+        required: false
+        default: ""
+
+jobs:
+  determine_targets:
+    name: Set targets
+    runs-on: ubuntu-latest
+    outputs:
+      target: ${{ steps.find_targets.outputs.target }}
+
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v2
+
+      - name: Set targets
+        id: find_targets
+        run: |
+          if [ "${{ github.event.inputs.target }}" = "all" ]; then
+            export TARGETS="$(perl ./scripts/dump-target-info.pl targets 2>/dev/null | awk '{ print $1 }')"
+          else
+            if [ -n "${{ github.event.inputs.target }}" ]; then
+              export TARGETS="${{ github.event.inputs.target }}"
+            else
+              export TARGETS="x86/64 ath79/generic mediatek/mt7622"
+            fi
+          fi
+
+          JSON='['
+          FIRST=1
+          for TARGET in $TARGETS; do
+            [[ $FIRST -ne 1 ]] && JSON="$JSON"','
+            JSON="$JSON"'"'"${TARGET}"'"'
+            FIRST=0
+          done
+          JSON="$JSON"']'
+
+          echo -e "\n---- targets ----\n"
+          echo "$JSON"
+          echo -e "\n---- targets ----\n"
+
+          echo "::set-output name=target::$JSON"
+
+  build:
+    name: Build ${{ matrix.os }}/${{ matrix.target }}
+    needs: determine_targets
+    runs-on: ${{ matrix.os }}
+    strategy:
+      fail-fast: False
+      matrix:
+        os: [ubuntu-latest]
+        target: ${{fromJson(needs.determine_targets.outputs.target)}}
+
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v2
+        with:
+          fetch-depth: 0
+          path: openwrt
+
+      - name: Setup MacOS
+        if: ${{ matrix.os == 'macos-latest' }}
+        run: |
+          echo "WORKPATH=/Volumes/OpenWrt/openwrt/" >> "$GITHUB_ENV"
+          hdiutil create -size 20g -type SPARSE -fs "Case-sensitive HFS+" -volname OpenWrt OpenWrt.sparseimage
+          hdiutil attach OpenWrt.sparseimage
+          mv "$GITHUB_WORKSPACE/openwrt" /Volumes/OpenWrt/
+          cd "$WORKPATH"
+
+          brew install \
+            autoconf \
+            automake \
+            coreutils \
+            clang-12 \
+            diffutils \
+            findutils \
+            gawk \
+            gettext \
+            git-extras \
+            gmp \
+            gnu-getopt \
+            gnu-sed \
+            gnu-tar \
+            grep \
+            libidn2 \
+            libunistring \
+            m4 \
+            make \
+            mpfr \
+            ncurses \
+            openssl@1.1 \
+            pcre \
+            pkg-config \
+            quilt \
+            readline \
+            wget \
+            zstd
+
+            echo "/bin" >> "$GITHUB_PATH"
+            echo "/sbin/Library/Apple/usr/bin" >> "$GITHUB_PATH"
+            echo "/usr/bin" >> "$GITHUB_PATH"
+            echo "/usr/local/bin" >> "$GITHUB_PATH"
+            echo "/usr/local/opt/coreutils/bin" >> "$GITHUB_PATH"
+            echo "/usr/local/opt/findutils/libexec/gnubin" >> "$GITHUB_PATH"
+            echo "/usr/local/opt/gettext/bin" >> "$GITHUB_PATH"
+            echo "/usr/local/opt/gnu-getopt/bin" >> "$GITHUB_PATH"
+            echo "/usr/local/opt/make/libexec/gnubin" >> "$GITHUB_PATH"
+            echo "/usr/local/opt/make/libexec/gnubin" >> "$GITHUB_PATH"
+            echo "/usr/sbin" >> "$GITHUB_PATH"
+            pwd
+
+      - name: Setup Ubuntu
+        if: ${{ matrix.os == 'ubuntu-latest' }}
+        env:
+          DEBIAN_FRONTEND: noninteractive
+        run: |
+          sudo apt-get update
+          sudo apt-get -y install libncurses-dev qemu-utils clang-12 \
+            build-essential ccache ecj fastjar file g++ gawk \
+            gettext git java-propose-classpath libelf-dev libncurses5-dev \
+            libncursesw5-dev libssl-dev python python2.7-dev python3 unzip wget \
+            python3-distutils python3-setuptools python3-dev rsync subversion \
+            swig time xsltproc zlib1g-dev mkisofs
+          echo "WORKPATH=$GITHUB_WORKSPACE/openwrt/" >> "$GITHUB_ENV"
+          cd "$WORKPATH"
+          pwd
+
+      - name: Make prereq
+        run: |
+          cd "$WORKPATH"
+          pwd
+          make defconfig
+
+      - name: Initialization environment
+        run: |
+          TARGET=$(echo ${{ matrix.target }} | cut -d "/" -f 1)
+          SUBTARGET=$(echo ${{ matrix.target }} | cut -d "/" -f 2)
+          echo "TARGET=$TARGET" >> "$GITHUB_ENV"
+          echo "SUBTARGET=$SUBTARGET" >> "$GITHUB_ENV"
+
+      - name: Update & Install feeds
+        run: |
+          cd "$WORKPATH"
+          ./scripts/feeds update -a
+          ./scripts/feeds install -a -p base -d m
+          ./scripts/feeds install -a
+
+      - name: Set configuration
+        run: |
+          cd "$WORKPATH"
+          curl "https://downloads.openwrt.org/snapshots/targets/${{ env.TARGET }}/${{ env.SUBTARGET }}/config.buildinfo" > .config
+          for CONFIG in ${{ github.event.inputs.config }}; do
+            echo "CONFIG_$CONFIG" >> .config
+          done
+
+          echo "CONFIG_BPF_TOOLCHAIN_HOST=y" >> .config
+          echo "CONFIG_PACKAGE_uxc=m" >> .config
+          echo "CONFIG_PACKAGE_uvol=m" >> .config
+          echo "CONFIG_PACKAGE_strace=m" >> .config
+          echo "CONFIG_PACKAGE_tmate=m" >> .config
+          echo "CONFIG_PACKAGE_luci=m" >> .config
+          echo "CONFIG_PACKAGE_freeswitch=m" >> .config
+
+          echo -e "\n---- config input ----\n"
+          cat .config
+          echo -e "\n---- config input ----\n"
+
+          make defconfig
+
+          echo -e "\n---- config post-defconfig ----\n"
+          cat .config
+          echo -e "\n---- config post-defconfig ----\n"
+
+          echo "${{ secrets.PUBLIC_KEY_PEM }}" > public-key.pem
+          echo "${{ secrets.PRIVATE_KEY_PEM }}" > private-key.pem
+
+      - name: Build tools
+        run: |
+          cd "$WORKPATH"
+          make tools/install -j$(nproc) || \
+            make tools/install V=s
+
+      - name: Build toolchain
+        run: |
+          cd "$WORKPATH"
+          make toolchain/install -j$(nproc) || \
+            make toolchain/install V=s
+
+      - name: Build target
+        run: |
+          cd "$WORKPATH"
+          make target/compile -j$(nproc) IGNORE_ERRORS='n m' || \
+            make target/compile IGNORE_ERRORS='n m' V=s
+
+      - name: Build packages
+        run: |
+          cd "$WORKPATH"
+          make package/apk/host/compile -j$(nproc) || \
+            make package/apk/host/compile V=s
+
+          make package/compile -j$(nproc) IGNORE_ERRORS='n m' || \
+            make package/compile IGNORE_ERRORS='n m' V=s
+
+          make package/index V=s
+
+      - name: Determine Kernel version
+        run: |
+          cd "$WORKPATH"
+          export TOPDIR=$(pwd)
+          KERNEL_VERSION="$(make --no-print-directory -C target/linux \
+            val.LINUX_VERSION val.LINUX_RELEASE val.LINUX_VERMAGIC | \
+            tr '\n' '-' | head -c -1)"
+
+          echo "KERNEL_VERSION=$KERNEL_VERSION" >> "$GITHUB_ENV"
+
+      - name: Determine architecutre
+        run: |
+          cd "$WORKPATH"
+          echo "ARCH=$(make val.ARCH_PACKAGES)" >> "$GITHUB_ENV"
+
+      - name: Upload packages
+        uses: jakejarvis/s3-sync-action@master
+        with:
+          args: --acl public-read --follow-symlinks --delete
+        env:
+          AWS_S3_BUCKET: openwrt-ci
+          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
+          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
+          AWS_S3_ENDPOINT: https://s3.aparcar.org
+          SOURCE_DIR: openwrt/bin/packages/${{ env.ARCH }}/
+          DEST_DIR: apkwrt/packages/${{ env.ARCH }}/
+
+      - name: Prepare upload of kmods
+        continue-on-error: true
+        run: |
+          cd "$WORKPATH"
+
+          KMOD_DIR="bin/targets/${{ env.TARGET }}/${{ env.SUBTARGET }}/kmods/${{ env.KERNEL_VERSION }}/"
+          mkdir -p "$KMOD_DIR"
+          cp bin/targets/${{ env.TARGET }}/${{ env.SUBTARGET }}//packages/kmod-*.apk "$KMOD_DIR"
+          make package/index V=s PACKAGE_SUBDIRS="$KMOD_DIR"
+
+      - name: Upload kmods
+        continue-on-error: true
+        uses: jakejarvis/s3-sync-action@master
+        with:
+          args: --acl public-read --follow-symlinks --delete
+        env:
+          AWS_S3_BUCKET: openwrt-ci
+          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
+          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
+          AWS_S3_ENDPOINT: https://s3.aparcar.org
+          SOURCE_DIR: openwrt/bin/targets/${{ env.TARGET }}/${{ env.SUBTARGET }}/kmods/${{ env.KERNEL_VERSION }}/
+          DEST_DIR: apkwrt/targets/${{ env.TARGET }}/${{ env.SUBTARGET }}/kmods/${{ env.KERNEL_VERSION }}/
+
+      - name: Install packages
+        run: |
+          cd "$WORKPATH"
+          make package/install -j$(nproc) || \
+            make package/install V=s
+
+      - name: Build firmware
+        run: |
+          cd "$WORKPATH"
+          make target/install -j$(nproc) || \
+            make target/install V=s
+
+      - name: Buildinfo
+        run: |
+          cd "$WORKPATH"
+          make buildinfo V=s
+
+      - name: JSON overview
+        run: |
+          cd "$WORKPATH"
+          make json_overview_image_info V=s
+
+      - name: Checksum
+        run: |
+          cd "$WORKPATH"
+          make checksum V=s
+
+      - name: Clean build
+        run: |
+          cd "$WORKPATH"
+          rm -rf staging_dir/ build_dir
+
+      - name: Move everything back in place
+        if: ${{ matrix.os == 'macos-latest' }}
+        run: mv "$WORKPATH" "$GITHUB_WORKSPACE"
+
+      - name: Upload artifacts
+        if:  always()
+        uses: actions/upload-artifact@v2
+        with:
+          name: ${{ env.TARGET }}-${{ env.SUBTARGET }}-artifacts
+          path: openwrt/bin/
+
+      - name: Upload target
+        uses: jakejarvis/s3-sync-action@master
+        with:
+          args: --acl public-read --follow-symlinks --delete
+        env:
+          AWS_S3_BUCKET: openwrt-ci
+          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
+          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
+          AWS_S3_ENDPOINT: https://s3.asu.aparcar.org
+          SOURCE_DIR: openwrt/bin/targets/${{ env.TARGET }}/${{ env.SUBTARGET }}/
+          DEST_DIR: apkwrt/targets/${{ env.TARGET }}/${{ env.SUBTARGET }}/
+
+      - name: Login to GitHub Container Registry
+        uses: docker/login-action@v1
+        with:
+          registry: ghcr.io
+          username: ${{ github.repository_owner }}
+          password: ${{ secrets.GITHUB_TOKEN }}
+
+      - name: Prepare Docker SDK
+        run: |
+          cd "$WORKPATH"
+          rm -rf bin/packages # free some space
+          mkdir -p sdk/
+          tar xf bin/targets/${{ env.TARGET }}/${{ env.SUBTARGET }}/openwrt-sdk-*.tar.xz
+          mv openwrt-sdk-*/ sdk/
+
+      - name: Build and push SDK
+        uses: docker/build-push-action@v2
+        with:
+          context: "openwrt/sdk/"
+          file: "openwrt/.github/workflows/Dockerfile"
+          push: true
+          tags: |
+            ghcr.io/${{ github.repository_owner }}/sdk:${{ env.ARCH }}
+            ghcr.io/${{ github.repository_owner }}/sdk:${{ env.TARGET }}-${{ env.SUBTARGET }}
+
+      - name: Prepare Docker ImageBuilder
+        run: |
+          cd "$WORKPATH"
+          rm -rf sdk/ # free some space
+          mkdir -p imagebuilder/
+          tar xf bin/targets/${{ env.TARGET }}/${{ env.SUBTARGET }}/openwrt-imagebuilder-*.tar.xz
+          mv openwrt-imagebuilder-*/ imagebuilder/
+
+      - name: Build and push ImageBuilder
+        uses: docker/build-push-action@v2
+        with:
+          context: "openwrt/imagebuilder/"
+          file: "openwrt/.github/workflows/Dockerfile"
+          push: true
+          tags: |
+            ghcr.io/${{ github.repository_owner }}/imagebuilder:${{ env.ARCH }}
+            ghcr.io/${{ github.repository_owner }}/imagebuilder:${{ env.TARGET }}-${{ env.SUBTARGET }}