diff --git a/.github/workflows/pr-build-check.yml b/.github/workflows/pr-build-check.yml index 99fd848..795e5f9 100644 --- a/.github/workflows/pr-build-check.yml +++ b/.github/workflows/pr-build-check.yml @@ -5,38 +5,44 @@ on: branches: [master] jobs: - build-arm: - name: Build ARM (musl static) + build: + name: Build ${{ matrix.target }} (musl static) runs-on: ubuntu-latest - env: - ARCHIVE: toolchain.hisilicon-hi3516cv100 - PLATFORM: arm-openipc-linux-musleabi_sdk-buildroot - TOOLCHAIN: arm-openipc-linux-musleabi + strategy: + fail-fast: false + matrix: + include: + - target: arm32 + toolchain_url: https://github.com/OpenIPC/firmware/releases/download/toolchain/toolchain.hisilicon-hi3516cv100.tgz + toolchain_dir: arm-openipc-linux-musleabi_sdk-buildroot + cc: arm-openipc-linux-musleabi-gcc + - target: mips32 + toolchain_url: https://github.com/OpenIPC/firmware/releases/download/toolchain/toolchain.ingenic-t31.tgz + toolchain_dir: mipsel-openipc-linux-musl_sdk-buildroot + cc: mipsel-openipc-linux-musl-gcc + - target: arm64 + # Bootlin's prebuilt aarch64 musl cross toolchain. Switch + # to an OpenIPC-hosted tarball once one is published. + toolchain_url: https://toolchains.bootlin.com/downloads/releases/toolchains/aarch64/tarballs/aarch64--musl--stable-2025.08-1.tar.xz + toolchain_dir: aarch64--musl--stable-2025.08-1 + cc: aarch64-buildroot-linux-musl-gcc steps: - uses: actions/checkout@v4 - - name: Download toolchain and build + - name: Fetch toolchain run: | - wget -qO- https://github.com/OpenIPC/firmware/releases/download/toolchain/$ARCHIVE.tgz | \ - tar xfz - -C /opt - export PATH=/opt/$PLATFORM/bin:$PATH - cmake -H. -Bbuild -DCMAKE_C_COMPILER=${TOOLCHAIN}-gcc -DCMAKE_BUILD_TYPE=Release - cmake --build build - - build-mips: - name: Build MIPS (musl static) - runs-on: ubuntu-latest - env: - ARCHIVE: toolchain.ingenic-t31 - PLATFORM: mipsel-openipc-linux-musl_sdk-buildroot - TOOLCHAIN: mipsel-openipc-linux-musl - steps: - - uses: actions/checkout@v4 - - name: Download toolchain and build + # Download to file (with retries) before extracting — piping + # wget -> tar makes transient stream truncations look like + # corrupt archives; the wget retry only helps with discrete + # files. + wget --tries=3 --timeout=60 -O /tmp/toolchain.tar "${{ matrix.toolchain_url }}" + # `tar xf` autodetects gzip/bzip2/xz so the matrix entries + # can mix archive formats freely. + tar xf /tmp/toolchain.tar -C /opt + rm /tmp/toolchain.tar + - name: Build run: | - wget -qO- https://github.com/OpenIPC/firmware/releases/download/toolchain/$ARCHIVE.tgz | \ - tar xfz - -C /opt - export PATH=/opt/$PLATFORM/bin:$PATH - cmake -H. -Bbuild -DCMAKE_C_COMPILER=${TOOLCHAIN}-gcc -DCMAKE_BUILD_TYPE=Release + export PATH=/opt/${{ matrix.toolchain_dir }}/bin:$PATH + cmake -H. -Bbuild -DCMAKE_C_COMPILER=${{ matrix.cc }} -DCMAKE_BUILD_TYPE=Release cmake --build build test-extraction-pipeline: diff --git a/.github/workflows/release-arm32.yml b/.github/workflows/release-arm32.yml deleted file mode 100644 index 36ef533..0000000 --- a/.github/workflows/release-arm32.yml +++ /dev/null @@ -1,140 +0,0 @@ -name: ipctool-arm32 - -on: - push: - branches: - - master - tags: - - 'v*' - workflow_dispatch: - - -jobs: - build-musl-static: - runs-on: ubuntu-latest - - env: - ARCHIVE: toolchain.hisilicon-hi3516cv100 - PLATFORM: arm-openipc-linux-musleabi_sdk-buildroot - TOOLCHAIN: arm-openipc-linux-musleabi - VERSION: 4.2.3 - - steps: - - uses: pozetroninc/github-action-get-latest-release@master - id: ct-ng-release - with: - owner: widgetii - repo: ct-ng-builds - - - uses: actions/checkout@v2 - with: - fetch-depth: 0 - - - name: Build sources - id: build - run: | - HEAD_TAG=$(git tag --points-at HEAD) - GIT_HASH=$(git rev-parse --short $GITHUB_SHA) - BRANCH_NAME=$(echo $GITHUB_REF | cut -d'/' -f 3) - if [ -z "$HEAD_TAG" ]; then - TAG_NAME="latest" - RELEASE_NAME="Development Build" - PRERELEASE=true - else - TAG_NAME=${{ github.ref }} - RELEASE_NAME="Release ${{ github.ref }}" - PRERELEASE=false - fi - echo "GIT_HASH=$GIT_HASH" >> $GITHUB_ENV - echo "TAG_NAME=$TAG_NAME" >> $GITHUB_ENV - echo "RELEASE_NAME=$RELEASE_NAME" >> $GITHUB_ENV - echo "PRERELEASE=$PRERELEASE" >> $GITHUB_ENV - echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV - - wget -q https://github.com/upx/upx/releases/download/v$VERSION/upx-$VERSION-amd64_linux.tar.xz - tar -xf upx-$VERSION-amd64_linux.tar.xz --strip-components 1 - - REL="${{ steps.ct-ng-release.outputs.release }}" - echo "Got release $REL" - wget -qO- https://github.com/OpenIPC/firmware/releases/download/toolchain/$ARCHIVE.tgz | \ - tar xfz - -C /opt - export PATH=/opt/$PLATFORM/bin:$PATH - sudo apt-get install -y cmake - cmake -H. -Bbuild -DCMAKE_C_COMPILER=${TOOLCHAIN}-gcc -DCMAKE_BUILD_TYPE=Release - cmake --build build - ./upx build/ipcinfo - ./upx build/ipctool - cp build/ipctool ipctool-$GIT_HASH - continue-on-error: true - - - name: Send warning message to telegram channel - env: - TG_TOKEN: ${{ secrets.TELEGRAM_TOKEN_BOT_OPENIPC }} - TG_CHANNEL: ${{ secrets.TELEGRAM_CHANNEL_OPENIPC_DEV }} - if: steps.ct-ng-release.outcome != 'success' || steps.build.outcome != 'success' - run: | - TG_OPTIONS="-s --connect-timeout 5 --max-time 15" - TG_NOTIFY="Warning, ipctool build error..." - TG_HEADER=$(echo -e "\r\n$TG_NOTIFY \r\n\r\nCommit: $GIT_HASH \r\nBranch: $BRANCH_NAME \r\nTag: $TAG_NAME \r\n\r\n\xE2\x9A\xA0 GitHub Actions") - curl $TG_OPTIONS -H "Content-Type: multipart/form-data" -X POST https://api.telegram.org/bot$TG_TOKEN/sendMessage \ - -F chat_id=$TG_CHANNEL -F text="$TG_HEADER" - - - name: Create release - uses: actions/create-release@v1 - continue-on-error: true - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - tag_name: ${{ env.TAG_NAME }} - release_name: ${{ env.RELEASE_NAME }} - draft: false - prerelease: ${{ env.PRERELEASE }} - - - name: Upload binaries to release - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - file: "build/ipctool" - asset_name: "ipctool" - tag: ${{ env.TAG_NAME }} - overwrite: true - - - name: Upload ipcinfo to release - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - file: "build/ipcinfo" - asset_name: "ipcinfo" - tag: ${{ env.TAG_NAME }} - overwrite: true - - - name: Publish file on S3 for HTTP access (to test dev versions) - if: env.HEAD_TAG == '' - uses: tpaschalis/s3-sync-action@master - with: - args: --acl public-read - env: - FILE: ./ipctool-${{ env.GIT_HASH }} - AWS_REGION: 'eu-north-1' - AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }} - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - -# - name: Trigger CI tests -# if: env.HEAD_TAG == '' -# uses: peter-evans/repository-dispatch@v1 -# with: -# token: ${{ secrets.REPO_ACCESS_TOKEN }} -# repository: OpenIPC/ipctool -# event-type: ci-tests -# client-payload: '{"sha": "${{ env.GIT_HASH }}"}' - - - name: Send binary file to telegram channel - env: - TG_TOKEN: ${{ secrets.TELEGRAM_TOKEN_BOT_OPENIPC }} - TG_CHANNEL: ${{ secrets.TELEGRAM_CHANNEL_OPENIPC_DEV }} - run: | - TG_OPTIONS="-s --connect-timeout 5 --max-time 15" - TG_HEADER=$(echo -e "\r\nCommit: $GIT_HASH \r\nBranch: $BRANCH_NAME \r\nTag: $TAG_NAME \r\n\r\n\xE2\x9C\x85 GitHub Actions") - curl $TG_OPTIONS -H "Content-Type: multipart/form-data" -X POST https://api.telegram.org/bot$TG_TOKEN/sendDocument \ - -F chat_id=$TG_CHANNEL -F document="@build/ipctool" -F caption="$TG_HEADER" diff --git a/.github/workflows/release-mips32.yml b/.github/workflows/release-mips32.yml deleted file mode 100644 index 81f125f..0000000 --- a/.github/workflows/release-mips32.yml +++ /dev/null @@ -1,140 +0,0 @@ -name: ipctool-mips32 - -on: - push: - branches: - - master - tags: - - 'v*' - workflow_dispatch: - - -jobs: - build-musl-static: - runs-on: ubuntu-latest - - env: - ARCHIVE: toolchain.ingenic-t31 - PLATFORM: mipsel-openipc-linux-musl_sdk-buildroot - TOOLCHAIN: mipsel-openipc-linux-musl - VERSION: 4.2.3 - - steps: - - uses: pozetroninc/github-action-get-latest-release@master - id: ct-ng-release - with: - owner: widgetii - repo: ct-ng-builds - - - uses: actions/checkout@v2 - with: - fetch-depth: 0 - - - name: Build sources - id: build - run: | - HEAD_TAG=$(git tag --points-at HEAD) - GIT_HASH=$(git rev-parse --short $GITHUB_SHA) - BRANCH_NAME=$(echo $GITHUB_REF | cut -d'/' -f 3) - if [ -z "$HEAD_TAG" ]; then - TAG_NAME="latest" - RELEASE_NAME="Development Build" - PRERELEASE=true - else - TAG_NAME=${{ github.ref }} - RELEASE_NAME="Release ${{ github.ref }}" - PRERELEASE=false - fi - echo "GIT_HASH=$GIT_HASH" >> $GITHUB_ENV - echo "TAG_NAME=$TAG_NAME" >> $GITHUB_ENV - echo "RELEASE_NAME=$RELEASE_NAME" >> $GITHUB_ENV - echo "PRERELEASE=$PRERELEASE" >> $GITHUB_ENV - echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV - - wget -q https://github.com/upx/upx/releases/download/v$VERSION/upx-$VERSION-amd64_linux.tar.xz - tar -xf upx-$VERSION-amd64_linux.tar.xz --strip-components 1 - - REL="${{ steps.ct-ng-release.outputs.release }}" - echo "Got release $REL" - wget -qO- https://github.com/OpenIPC/firmware/releases/download/toolchain/$ARCHIVE.tgz | \ - tar xfz - -C /opt - export PATH=/opt/$PLATFORM/bin:$PATH - sudo apt-get install -y cmake - cmake -H. -Bbuild -DCMAKE_C_COMPILER=${TOOLCHAIN}-gcc -DCMAKE_BUILD_TYPE=Release - cmake --build build - ./upx build/ipcinfo - ./upx build/ipctool - cp build/ipctool ipctool-$GIT_HASH - continue-on-error: true - - - name: Send warning message to telegram channel - env: - TG_TOKEN: ${{ secrets.TELEGRAM_TOKEN_BOT_OPENIPC }} - TG_CHANNEL: ${{ secrets.TELEGRAM_CHANNEL_OPENIPC_DEV }} - if: steps.ct-ng-release.outcome != 'success' || steps.build.outcome != 'success' - run: | - TG_OPTIONS="-s --connect-timeout 5 --max-time 15" - TG_NOTIFY="Warning, ipctool-mips32 build error..." - TG_HEADER=$(echo -e "\r\n$TG_NOTIFY \r\n\r\nCommit: $GIT_HASH \r\nBranch: $BRANCH_NAME \r\nTag: $TAG_NAME \r\n\r\n\xE2\x9A\xA0 GitHub Actions") - curl $TG_OPTIONS -H "Content-Type: multipart/form-data" -X POST https://api.telegram.org/bot$TG_TOKEN/sendMessage \ - -F chat_id=$TG_CHANNEL -F text="$TG_HEADER" - - - name: Create release - uses: actions/create-release@v1 - continue-on-error: true - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - tag_name: ${{ env.TAG_NAME }} - release_name: ${{ env.RELEASE_NAME }} - draft: false - prerelease: ${{ env.PRERELEASE }} - - - name: Upload binaries to release - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - file: "build/ipctool" - asset_name: "ipctool-mips32" - tag: ${{ env.TAG_NAME }} - overwrite: true - - - name: Upload ipcinfo to release - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - file: "build/ipcinfo" - asset_name: "ipcinfo-mips32" - tag: ${{ env.TAG_NAME }} - overwrite: true - -# - name: Publish file on S3 for HTTP access (to test dev versions) -# if: env.HEAD_TAG == '' -# uses: tpaschalis/s3-sync-action@master -# with: -# args: --acl public-read -# env: -# FILE: ./ipctool-${{ env.GIT_HASH }} -# AWS_REGION: 'eu-north-1' -# AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }} -# AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} -# AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - -# - name: Trigger CI tests -# if: env.HEAD_TAG == '' -# uses: peter-evans/repository-dispatch@v1 -# with: -# token: ${{ secrets.REPO_ACCESS_TOKEN }} -# repository: OpenIPC/ipctool -# event-type: ci-tests -# client-payload: '{"sha": "${{ env.GIT_HASH }}"}' - -# - name: Send binary file to telegram channel -# env: -# TG_TOKEN: ${{ secrets.TELEGRAM_TOKEN_BOT_OPENIPC }} -# TG_CHANNEL: ${{ secrets.TELEGRAM_CHANNEL_OPENIPC_DEV }} -# run: | -# TG_OPTIONS="-s --connect-timeout 5 --max-time 15" -# TG_HEADER=$(echo -e "\r\nCommit: $GIT_HASH \r\nBranch: $BRANCH_NAME \r\nTag: $TAG_NAME \r\n\r\n\xE2\x9C\x85 GitHub Actions") -# curl $TG_OPTIONS -H "Content-Type: multipart/form-data" -X POST https://api.telegram.org/bot$TG_TOKEN/sendDocument \ -# -F chat_id=$TG_CHANNEL -F document="@build/ipctool" -F caption="$TG_HEADER" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..679e294 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,165 @@ +name: ipctool-release + +on: + push: + branches: + - master + tags: + - 'v*' + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + include: + - target: arm32 + # OpenIPC's Hi3516CV100 toolchain — the canonical 32-bit ARM + # musleabi static build used for all V1..V5 HiSilicon and the + # rest of the 32-bit-ARM camera world. + toolchain_url: https://github.com/OpenIPC/firmware/releases/download/toolchain/toolchain.hisilicon-hi3516cv100.tgz + toolchain_dir: arm-openipc-linux-musleabi_sdk-buildroot + cc: arm-openipc-linux-musleabi-gcc + asset_suffix: "" + publish_s3: true + - target: mips32 + toolchain_url: https://github.com/OpenIPC/firmware/releases/download/toolchain/toolchain.ingenic-t31.tgz + toolchain_dir: mipsel-openipc-linux-musl_sdk-buildroot + cc: mipsel-openipc-linux-musl-gcc + asset_suffix: "-mips32" + publish_s3: false + - target: arm64 + # Bootlin's prebuilt aarch64 musl cross toolchain. Switch + # to an OpenIPC-hosted tarball once one is published. + toolchain_url: https://toolchains.bootlin.com/downloads/releases/toolchains/aarch64/tarballs/aarch64--musl--stable-2025.08-1.tar.xz + toolchain_dir: aarch64--musl--stable-2025.08-1 + cc: aarch64-buildroot-linux-musl-gcc + asset_suffix: "-arm64" + publish_s3: false + + env: + UPX_VERSION: 4.2.3 + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Compute release vars + run: | + HEAD_TAG=$(git tag --points-at HEAD) + GIT_HASH=$(git rev-parse --short $GITHUB_SHA) + BRANCH_NAME=$(echo $GITHUB_REF | cut -d'/' -f 3) + if [ -z "$HEAD_TAG" ]; then + TAG_NAME="latest" + RELEASE_NAME="Development Build" + PRERELEASE=true + else + TAG_NAME=${GITHUB_REF} + RELEASE_NAME="Release ${GITHUB_REF}" + PRERELEASE=false + fi + echo "HEAD_TAG=$HEAD_TAG" >> $GITHUB_ENV + echo "GIT_HASH=$GIT_HASH" >> $GITHUB_ENV + echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV + echo "TAG_NAME=$TAG_NAME" >> $GITHUB_ENV + echo "RELEASE_NAME=$RELEASE_NAME" >> $GITHUB_ENV + echo "PRERELEASE=$PRERELEASE" >> $GITHUB_ENV + + - name: Fetch toolchain + run: | + # Download to file (with retries) before extracting — piping + # wget -> tar makes transient stream truncations look like + # corrupt archives; the wget retry only helps with discrete + # files. + wget --tries=3 --timeout=60 -O /tmp/toolchain.tar "${{ matrix.toolchain_url }}" + # `tar xf` autodetects gzip/bzip2/xz so the matrix entries + # can mix archive formats freely. + tar xf /tmp/toolchain.tar -C /opt + rm /tmp/toolchain.tar + + - name: Build sources + id: build + run: | + wget -q https://github.com/upx/upx/releases/download/v$UPX_VERSION/upx-$UPX_VERSION-amd64_linux.tar.xz + tar -xf upx-$UPX_VERSION-amd64_linux.tar.xz --strip-components 1 + + export PATH=/opt/${{ matrix.toolchain_dir }}/bin:$PATH + sudo apt-get install -y cmake + + cmake -H. -Bbuild -DCMAKE_C_COMPILER=${{ matrix.cc }} -DCMAKE_BUILD_TYPE=Release + cmake --build build + ./upx build/ipcinfo + ./upx build/ipctool + cp build/ipctool ipctool-$GIT_HASH + continue-on-error: true + + - name: Send warning to Telegram on build failure + env: + TG_TOKEN: ${{ secrets.TELEGRAM_TOKEN_BOT_OPENIPC }} + TG_CHANNEL: ${{ secrets.TELEGRAM_CHANNEL_OPENIPC_DEV }} + if: steps.build.outcome != 'success' + run: | + TG_OPTIONS="-s --connect-timeout 5 --max-time 15" + TG_NOTIFY="Warning, ipctool-${{ matrix.target }} build error..." + TG_HEADER=$(echo -e "\r\n$TG_NOTIFY \r\n\r\nCommit: $GIT_HASH \r\nBranch: $BRANCH_NAME \r\nTag: $TAG_NAME \r\n\r\n\xE2\x9A\xA0 GitHub Actions") + curl $TG_OPTIONS -H "Content-Type: multipart/form-data" -X POST https://api.telegram.org/bot$TG_TOKEN/sendMessage \ + -F chat_id=$TG_CHANNEL -F text="$TG_HEADER" + + - name: Create release + if: steps.build.outcome == 'success' + uses: actions/create-release@v1 + continue-on-error: true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ env.TAG_NAME }} + release_name: ${{ env.RELEASE_NAME }} + draft: false + prerelease: ${{ env.PRERELEASE }} + + - name: Upload ipctool to release + if: steps.build.outcome == 'success' + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: build/ipctool + asset_name: ipctool${{ matrix.asset_suffix }} + tag: ${{ env.TAG_NAME }} + overwrite: true + + - name: Upload ipcinfo to release + if: steps.build.outcome == 'success' + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: build/ipcinfo + asset_name: ipcinfo${{ matrix.asset_suffix }} + tag: ${{ env.TAG_NAME }} + overwrite: true + + - name: Publish dev build on S3 + if: matrix.publish_s3 && steps.build.outcome == 'success' && env.HEAD_TAG == '' + uses: tpaschalis/s3-sync-action@master + with: + args: --acl public-read + env: + FILE: ./ipctool-${{ env.GIT_HASH }} + AWS_REGION: 'eu-north-1' + AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }} + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + + - name: Send binary to Telegram + if: steps.build.outcome == 'success' + env: + TG_TOKEN: ${{ secrets.TELEGRAM_TOKEN_BOT_OPENIPC }} + TG_CHANNEL: ${{ secrets.TELEGRAM_CHANNEL_OPENIPC_DEV }} + run: | + TG_OPTIONS="-s --connect-timeout 5 --max-time 15" + TG_HEADER=$(echo -e "\r\nTarget: ${{ matrix.target }} \r\nCommit: $GIT_HASH \r\nBranch: $BRANCH_NAME \r\nTag: $TAG_NAME \r\n\r\n\xE2\x9C\x85 GitHub Actions") + curl $TG_OPTIONS -H "Content-Type: multipart/form-data" -X POST https://api.telegram.org/bot$TG_TOKEN/sendDocument \ + -F chat_id=$TG_CHANNEL -F document="@build/ipctool" -F caption="$TG_HEADER"