mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-03-29 10:49:54 +00:00
233 lines
9.7 KiB
YAML
233 lines
9.7 KiB
YAML
name: "Build"
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- "**"
|
|
- "!release"
|
|
tags:
|
|
- "*"
|
|
pull_request:
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
env:
|
|
DEFAULT_TARGET: f7
|
|
FBT_GIT_SUBMODULE_SHALLOW: 1
|
|
|
|
jobs:
|
|
build:
|
|
permissions:
|
|
issues: write
|
|
pull-requests: write
|
|
runs-on: ubuntu-latest
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
target: [f7]
|
|
steps:
|
|
- name: "Checkout code"
|
|
uses: actions/checkout@v4
|
|
with:
|
|
fetch-depth: 1
|
|
ref: ${{ github.event.pull_request.head.sha }}
|
|
|
|
- name: "Get commit details"
|
|
id: names
|
|
run: |
|
|
BUILD_TYPE='DEBUG=0 COMPACT=1'
|
|
if [[ ${{ github.event_name }} == 'pull_request' ]]; then
|
|
TYPE="pull"
|
|
elif [[ "${{ github.ref }}" == "refs/tags/"* ]]; then
|
|
TYPE="tag"
|
|
else
|
|
TYPE="other"
|
|
fi
|
|
python3 scripts/get_env.py "--event_file=${{ github.event_path }}" "--type=$TYPE" || cat "${{ github.event_path }}"
|
|
echo "event_type=$TYPE" >> $GITHUB_OUTPUT
|
|
echo "FBT_BUILD_TYPE=$BUILD_TYPE" >> $GITHUB_ENV
|
|
echo "TARGET=${{ matrix.target }}" >> $GITHUB_ENV
|
|
echo "TARGET_HW=$(echo "${{ matrix.target }}" | sed 's/f//')" >> $GITHUB_ENV
|
|
|
|
- name: "Check API versions for consistency between targets"
|
|
run: |
|
|
set -e
|
|
N_API_HEADER_SIGNATURES=`ls -1 targets/f*/api_symbols.csv | xargs -I {} sh -c "head -n2 {} | md5sum" | sort -u | wc -l`
|
|
if [ $N_API_HEADER_SIGNATURES != 1 ] ; then
|
|
echo API versions aren\'t matching for available targets. Please update!
|
|
echo API versions are:
|
|
head -n2 targets/f*/api_symbols.csv
|
|
exit 1
|
|
fi
|
|
|
|
- name: "Check API version for consistency with OFW release channel"
|
|
run: |
|
|
set -e
|
|
symbols="targets/$TARGET/api_symbols.csv"
|
|
ofw_api="$(curl -s "https://raw.githubusercontent.com/flipperdevices/flipperzero-firmware/release/${symbols}" | head -n2)"
|
|
our_api="$(head -n2 "${symbols}")"
|
|
if [ "$our_api" != "$ofw_api" ] ; then
|
|
echo API versions aren\'t matching OFW release channel. Please update!
|
|
echo API versions are:
|
|
echo "Official: $(tail -n1 <<< "$ofw_api")"
|
|
echo "Momentum: $(tail -n1 <<< "$our_api")"
|
|
exit 1
|
|
fi
|
|
|
|
- name: "Configure for Devbuild/PR/Upload"
|
|
run: |
|
|
if ${{ secrets.INDEXER_URL == '' }} ; then
|
|
exit
|
|
fi
|
|
if ${{ github.event_name == 'push' }} ; then
|
|
if ${{ github.ref_name == 'dev' }} ; then
|
|
SHOULD_DEVBUILD=${{ !contains(github.event.head_commit.message, '--nobuild') }}
|
|
SHOULD_UPLOAD=$SHOULD_DEVBUILD
|
|
SHOULD_DEPLOY=$SHOULD_DEVBUILD
|
|
elif ${{ startsWith(github.ref, 'refs/tags/') }} ; then
|
|
SHOULD_UPLOAD=true
|
|
fi
|
|
elif ${{ !!github.event.pull_request }} ; then
|
|
SHOULD_PRBUILD=${{ matrix.target == env.DEFAULT_TARGET }}
|
|
SHOULD_UPLOAD=$SHOULD_PRBUILD
|
|
SHOULD_DEPLOY=$SHOULD_PRBUILD
|
|
else
|
|
echo "What?"
|
|
exit 1
|
|
fi
|
|
echo "SHOULD_DEVBUILD=$SHOULD_DEVBUILD" >> $GITHUB_ENV
|
|
echo "SHOULD_PRBUILD=$SHOULD_PRBUILD" >> $GITHUB_ENV
|
|
echo "SHOULD_UPLOAD=$SHOULD_UPLOAD" >> $GITHUB_ENV
|
|
echo "SHOULD_DEPLOY=$SHOULD_DEPLOY" >> $GITHUB_ENV
|
|
|
|
- name: "Build the firmware and apps"
|
|
id: build-fw
|
|
run: |
|
|
./fbt TARGET_HW=$TARGET_HW $FBT_BUILD_TYPE copro_dist updater_package fap_dist
|
|
echo "firmware_api=$(./fbt TARGET_HW=$TARGET_HW get_apiversion)" >> $GITHUB_OUTPUT
|
|
|
|
- name: "Check for uncommitted changes"
|
|
run: |
|
|
git diff --exit-code
|
|
|
|
- name: "Upload artifacts to GitHub"
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
path: |
|
|
dist/${{ env.TARGET }}-*/flipper-z-${{ env.TARGET }}-update-*
|
|
dist/${{ env.TARGET }}-*/flipper-z-${{ env.TARGET }}-sdk-*
|
|
|
|
- name: "Copy build output"
|
|
if: ${{ env.SHOULD_UPLOAD == 'true' }}
|
|
run: |
|
|
set -e
|
|
rm -rf artifacts || true
|
|
mkdir artifacts
|
|
cp dist/${TARGET}-*/flipper-z-${TARGET}-{update-*.tgz,sdk-*.zip,full-*.dfu} artifacts/
|
|
tar czpf "artifacts/flipper-z-${TARGET}-resources-${SUFFIX}.tgz" \
|
|
-C build/latest resources
|
|
cd dist/${TARGET}-*/${TARGET}-update-*/
|
|
ARTIFACT_TAG=flipper-z-"$(basename "$(realpath .)")"
|
|
7z a ../../../artifacts/${ARTIFACT_TAG}.zip .
|
|
echo "ARTIFACT_TAG=$ARTIFACT_TAG" >> $GITHUB_ENV
|
|
VERSION_TAG="$(basename "$(realpath .)" | cut -d- -f3-)"
|
|
echo "VERSION_TAG=$VERSION_TAG" >> $GITHUB_ENV
|
|
|
|
- name: "Copy universal artifacts"
|
|
if: ${{ env.SHOULD_UPLOAD == 'true' }}
|
|
run: |
|
|
tar czpf "artifacts/flipper-z-any-scripts-${SUFFIX}.tgz" scripts
|
|
cp build/core2_firmware.tgz "artifacts/flipper-z-any-core2_firmware-${SUFFIX}.tgz"
|
|
|
|
- name: "Upload artifacts to update server"
|
|
if: ${{ env.SHOULD_UPLOAD == 'true' }}
|
|
run: |
|
|
curl "${{ secrets.INDEXER_URL }}"/firmware/directory.json > previndex.json
|
|
FILES=$(for ARTIFACT in $(find artifacts -maxdepth 1 -not -type d); do echo "-F files=@${ARTIFACT}"; done)
|
|
curl --fail -L -H "Token: ${{ secrets.INDEXER_TOKEN }}" \
|
|
-F "branch=${BRANCH_NAME}" \
|
|
-F "version_token=${COMMIT_SHA}" \
|
|
${FILES[@]} \
|
|
"${{ secrets.INDEXER_URL }}"/firmware/uploadfiles
|
|
|
|
- name: "Force deploy website to refresh devbuilds"
|
|
if: ${{ env.SHOULD_DEPLOY == 'true' }}
|
|
uses: Codex-/return-dispatch@v2
|
|
id: force-deploy
|
|
with:
|
|
token: ${{ secrets.REPO_DISPATCH_TOKEN }}
|
|
ref: dev
|
|
repo: v2.momentum-fw.dev
|
|
owner: Next-Flip
|
|
workflow: force-deploy.yml
|
|
workflow_timeout_seconds: 300
|
|
workflow_job_steps_retry_seconds: 5
|
|
|
|
- name: "Calculate DFU sizes"
|
|
if: ${{ env.SHOULD_PRBUILD == 'true' }}
|
|
run: |
|
|
curl -L "${{ secrets.INDEXER_URL }}"/firmware/development/f7/full_dfu -o dev.dfu
|
|
dfu_size_new=$(du --apparent-size -B 1 artifacts/flipper-z-${TARGET}-full-*.dfu | cut -f1)
|
|
dfu_size_dev=$(du --apparent-size -B 1 dev.dfu | cut -f1)
|
|
dfu_size_diff=$((dfu_size_new - dfu_size_dev))
|
|
DFU_SIZE=$(echo $dfu_size_new | numfmt --to=iec-i --format=%.2fB | sed 's/.00B$/B/')
|
|
DFU_DIFF=$(echo $dfu_size_diff | numfmt --to=iec-i --format=%.2fB | sed 's/.00B$/B/' | sed -r 's/^([^-])/+\1/')
|
|
echo "DFU_SIZE=$DFU_SIZE" >> $GITHUB_ENV
|
|
echo "DFU_DIFF=$DFU_DIFF" >> $GITHUB_ENV
|
|
|
|
tar xzf build/core2_firmware.tgz
|
|
radio_addr=$(jq -r '.copro.radio.files[0].address' core2_firmware/Manifest.json)
|
|
flash_base=0x8000000
|
|
min_gap=$((0 * 4 * 1024))
|
|
flash_free_total=$((radio_addr - flash_base - dfu_size_new))
|
|
flash_free_usable=$((flash_free_total - min_gap))
|
|
FLASH_FREE=$(echo $flash_free_total | numfmt --to=iec-i --format=%.2fB | sed 's/.00B$/B/')
|
|
FLASH_USABLE=$(echo $flash_free_usable | numfmt --to=iec-i --format=%.2fB | sed 's/.00B$/B/')
|
|
echo "FLASH_FREE=$FLASH_FREE" >> $GITHUB_ENV
|
|
echo "FLASH_USABLE=$FLASH_USABLE" >> $GITHUB_ENV
|
|
|
|
- name: "Find previous comment"
|
|
if: ${{ env.SHOULD_PRBUILD == 'true' }}
|
|
uses: peter-evans/find-comment@v3
|
|
id: find-comment
|
|
with:
|
|
issue-number: ${{ github.event.pull_request.number }}
|
|
comment-author: "github-actions[bot]"
|
|
body-includes: "Compiled ${{ matrix.target }} firmware for commit"
|
|
|
|
- name: "Wait for deploy (Run ID ${{ steps.force-deploy.outputs.run_id }})"
|
|
if: ${{ env.SHOULD_DEPLOY == 'true' }}
|
|
uses: Codex-/await-remote-run@v1
|
|
with:
|
|
token: ${{ github.token }}
|
|
repo: v2.momentum-fw.dev
|
|
owner: Next-Flip
|
|
run_id: ${{ steps.force-deploy.outputs.run_id }}
|
|
run_timeout_seconds: 300
|
|
poll_interval_ms: 5000
|
|
|
|
- name: "Create or update comment"
|
|
if: ${{ env.SHOULD_PRBUILD == 'true' }}
|
|
uses: peter-evans/create-or-update-comment@v4
|
|
with:
|
|
comment-id: ${{ steps.find-comment.outputs.comment-id }}
|
|
issue-number: ${{ github.event.pull_request.number }}
|
|
body: |
|
|
**Compiled ${{ matrix.target }} firmware for commit `${{steps.names.outputs.commit_sha}}`:**
|
|
- [🖥️ Web Updater](https://momentum-fw.dev/update?branch=${{steps.names.outputs.branch_name_urlencoded}})
|
|
- [☁️ Flipper Lab/App](https://lab.flipper.net/?url=${{secrets.INDEXER_URL}}/builds/firmware/${{steps.names.outputs.branch_name}}/flipper-z-${{steps.names.outputs.default_target}}-update-${{steps.names.outputs.suffix}}.tgz&channel=mntm-${{steps.names.outputs.branch_name}}&version=${{steps.names.outputs.commit_sha}})
|
|
- [📦 qFlipper Package](${{secrets.INDEXER_URL}}/builds/firmware/${{steps.names.outputs.branch_name}}/flipper-z-${{steps.names.outputs.default_target}}-update-${{steps.names.outputs.suffix}}.tgz)
|
|
- DFU Size: `${{ env.DFU_SIZE }}` (`${{ env.DFU_DIFF }}` from dev)
|
|
- Free Flash: `${{ env.FLASH_FREE }}` (`${{ env.FLASH_USABLE }}` usable)
|
|
edit-mode: replace
|
|
|
|
- name: "Send devbuild webhook"
|
|
env:
|
|
INDEXER_URL: ${{ secrets.INDEXER_URL }}
|
|
BUILD_WEBHOOK: ${{ secrets.BUILD_WEBHOOK }}
|
|
if: ${{ env.SHOULD_DEVBUILD == 'true' }}
|
|
run: |
|
|
python .github/workflow_data/devbuild.py
|