diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c13ccae66b..aea5e1acf2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,13 +7,45 @@ on: - cron: '30 22 * * *' workflow_dispatch: -env: - TAG_NAME: latest - jobs: + preflight: + name: Preflight + runs-on: ubuntu-latest + outputs: + should_build: ${{ steps.gate.outputs.should_build }} + head_sha: ${{ steps.gate.outputs.head_sha }} + short_sha: ${{ steps.gate.outputs.short_sha }} + build_id: ${{ steps.gate.outputs.build_id }} + steps: + - uses: actions/checkout@v4 + - id: gate + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + HEAD=$(git rev-parse HEAD) + SHORT=$(git rev-parse --short HEAD) + BUILD_ID="nightly-$(date -u +%Y%m%d)-${SHORT}" + PREV=$(gh release view nightly --json body -q .body 2>/dev/null \ + | sed -n 's/^sha=//p' | head -1 || true) + if [ "${{ github.event_name }}" = "schedule" ] && [ "$PREV" = "$HEAD" ]; then + echo "Skip: HEAD ($HEAD) already published as the latest nightly." + echo "should_build=false" >> "$GITHUB_OUTPUT" + else + echo "Build: $BUILD_ID (event=${{ github.event_name }}, prev=$PREV)" + echo "should_build=true" >> "$GITHUB_OUTPUT" + fi + echo "head_sha=$HEAD" >> "$GITHUB_OUTPUT" + echo "short_sha=$SHORT" >> "$GITHUB_OUTPUT" + echo "build_id=$BUILD_ID" >> "$GITHUB_OUTPUT" + buildroot: name: Firmware + needs: preflight + if: needs.preflight.outputs.should_build == 'true' runs-on: ubuntu-latest + env: + BUILD_ID: ${{ needs.preflight.outputs.build_id }} + BUILD_SHA: ${{ needs.preflight.outputs.head_sha }} strategy: fail-fast: false @@ -244,11 +276,38 @@ jobs: - name: Verify kernel modules run: sh .github/scripts/check_target_modules.sh - - name: Upload firmware + - name: Upload firmware (dated) + if: github.event_name != 'pull_request' + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ needs.preflight.outputs.build_id }} + prerelease: true + body: | + sha=${{ needs.preflight.outputs.head_sha }} + short=${{ needs.preflight.outputs.short_sha }} + built_at=${{ github.run_started_at }} + files: | + ${{env.NORFW}} + ${{env.NANDFW}} + + - name: Upload firmware (rolling nightly) + if: github.event_name != 'pull_request' + uses: softprops/action-gh-release@v2 + with: + tag_name: nightly + body: | + sha=${{ needs.preflight.outputs.head_sha }} + short=${{ needs.preflight.outputs.short_sha }} + built_at=${{ github.run_started_at }} + files: | + ${{env.NORFW}} + ${{env.NANDFW}} + + - name: Upload firmware (latest — legacy alias) if: github.event_name != 'pull_request' uses: softprops/action-gh-release@v2 with: - tag_name: ${{env.TAG_NAME}} + tag_name: latest files: | ${{env.NORFW}} ${{env.NANDFW}} @@ -256,7 +315,7 @@ jobs: - name: Send binary if: github.event_name != 'pull_request' && env.NORFW run: | - TG_MSG="Commit: ${GIT_HASH}\nBranch: ${GIT_BRANCH}\nTag: ${TAG_NAME}\nTime: ${TIME}\n\n" + TG_MSG="Build: ${BUILD_ID}\nCommit: ${GIT_HASH}\nBranch: ${GIT_BRANCH}\nTime: ${TIME}\n\n" TG_ICON="\xE2\x9C\x85 GitHub Actions" TG_HEADER=$(echo -e ${TG_MSG}${TG_ICON}) TG_TOKEN=${{secrets.TELEGRAM_TOKEN_BOT_OPENIPC}} diff --git a/general/scripts/rootfs_script.sh b/general/scripts/rootfs_script.sh index f7c3869dbe..147cb97f10 100755 --- a/general/scripts/rootfs_script.sh +++ b/general/scripts/rootfs_script.sh @@ -5,6 +5,8 @@ FILE=${TARGET_DIR}/usr/lib/os-release echo OPENIPC_VERSION=${DATE:0:1}.${DATE:1} >> ${FILE} date +GITHUB_VERSION="\"${GIT_BRANCH-local}+${GIT_HASH-build}, %Y-%m-%d"\" >> ${FILE} echo BUILD_OPTION=${OPENIPC_VARIANT} >> ${FILE} +echo BUILD_ID=${BUILD_ID:-local-$(date -u +%Y%m%d)-${GIT_HASH-build}} >> ${FILE} +echo BUILD_SHA=${BUILD_SHA:-${GIT_HASH-build}} >> ${FILE} date +TIME_STAMP=%s >> ${FILE} CONF="USES_GLIBC=y|OSDRV_T30=y|OSDRV_V85X=y|LIBV4L=y|MAVLINK_ROUTER=y|RUBYFPV=y|ONYXFPV=y|WIFIBROADCAST=y|WIFIBROADCAST_NG=y|AUDIO_PROCESSING_OPENIPC=y"