name: Firmware at GHA on: push: pull_request: schedule: - cron: '0 0 * * *' workflow_dispatch: inputs: lts: description: 'LTS Build' required: false type: boolean jobs: build-libopenblt-linux: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: submodules: true - name: cmake configure libopenblt working-directory: ./firmware/ext/openblt/Host/Source/LibOpenBLT/build run: cmake -DCMAKE_BUILD_TYPE=Release .. # - name: make libopenblt # working-directory: ./firmware/ext/openblt/Host/Source/LibOpenBLT/build # run: make -j8 - name: cmake configure libopenblt_jni working-directory: ./misc/libopenblt_jni/build run: cmake -DCMAKE_BUILD_TYPE=Release .. # - name: make libopenblt_jni # working-directory: ./misc/libopenblt_jni/build # run: make -j8 - name: coalesce if: 0 run: | mkdir deliver cp ./firmware/ext/openblt/Host/libopenblt.so deliver/ cp ./misc/libopenblt_jni/build/libopenblt_jni.so deliver/ # - uses: actions/upload-artifact@v4 # if: 0 # name: libopenblt-linux # path: | # ./deliver/libopenblt.so # ./deliver/libopenblt_jni.so release: runs-on: ubuntu-latest steps: - name: Dump GitHub context env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - name: Set run condition variables run: | if [ "${{github.event_name}}" = "schedule" ] && [ "${{github.repository}}" = "rusefi/rusefi" ]; then echo "full=true" >> $GITHUB_ENV echo "upload=release" >> $GITHUB_ENV echo "date=$(date +'%Y-%m-%d')" >> $GITHUB_ENV fi - uses: mukunku/tag-exists-action@v1.6.0 id: checkTag with: tag: ${{ env.date }} - name: Create Release Tag if: ${{ env.full == 'true' && env.upload == 'release' && steps.checkTag.outputs.exists == 'false' }} id: tag uses: mathieudutour/github-tag-action@v6.1 with: github_token: ${{ secrets.ACCESS_TOKEN }} custom_tag: ${{ env.date }} tag_prefix: '' - name: Create Release if: ${{ env.full == 'true' && env.upload == 'release' }} uses: ncipollo/release-action@v1.14.0 with: tag: ${{ env.date }} name: "Nightly ${{ env.date }}" artifacts: "artifacts/rusefi_bundle_*.zip" replacesArtifacts: false token: ${{ secrets.ACCESS_TOKEN }} allowUpdates: true prerelease: true - name: coalesce if: 0 run: | mkdir deliver cp ./firmware/ext/openblt/Host/libopenblt.dylib deliver/ cp ./misc/libopenblt_jni/build/libopenblt_jni.dylib deliver/ - uses: actions/upload-artifact@v4 with: name: bootcommander-linux path: | ./deliver/libopenblt.dylib ./deliver/libopenblt_jni.dylib build-firmware: runs-on: ubuntu-latest needs: [ # todo proper build of build-libopenblt #5866 #build-libopenblt-linux, #build-libopenblt-macos, release] strategy: # Let all builds finish even if one fails early fail-fast: false matrix: # What boards should we build for? In the 'include' section below, # set up what each of these boards needs to build. # # see also gen_config where we have a similar list for all boards! # see also build-primary-bundle where default/primary bundle is build separately # build-target: [ alphax-2chan, alphax-4chan, alphax-4chan_f7, alphax-8chan, alphax-8chan_debug, # todo alphax-8chan-revA, m74_9, s105, t-b-g, hellen81, hellen88bmw, hellen88bmw_avr, hellenMiataNA6, hellenMiataNA96, hellenMiataNB1, hellenMiataNB2, hellen-gm-e67, hellen128, hellen121vag, hellen-honda-k, hellen121nissan, cypress, frankenso_na6, kinetis, mre_f4, mre_f7, prometheus_405, prometheus_469, proteus_f4, proteus_f7, proteus_h7, stm32f429_nucleo, stm32f767_nucleo, stm32f767_nucleo_debug, stm32h743_nucleo, subaru_eg33_f7, subaru_eg33_f7_no_bl, f407-discovery, f429-discovery, atlas, tdg-pdm8, at_start_f435, ] include: # Board configurations # 'target' should match corresponding SHORT_BOARD_NAME - build-target: hellen81 folder: config/boards/hellen/hellen81 skip-rate: 90 - build-target: alphax-2chan folder: config/boards/hellen/alphax-2chan skip-rate: 0 - build-target: alphax-4chan folder: config/boards/hellen/alphax-4chan - build-target: alphax-4chan_f7 folder: config/boards/hellen/alphax-4chan - build-target: alphax-8chan folder: config/boards/hellen/alphax-8chan skip-rate: 0 - build-target: alphax-8chan_debug folder: config/boards/hellen/alphax-8chan skip-rate: 95 - build-target: alphax-8chan_f7 folder: config/boards/hellen/alphax-8chan skip-rate: 0 # - build-target: alphax-8chan-revA # folder: config/boards/hellen/alphax-8chan-revA # skip-rate: 30 - build-target: s105 folder: config/boards/s105 skip-rate: 90 - build-target: t-b-g folder: config/boards/test-build-guards skip-rate: 90 - build-target: m74_9 folder: config/boards/m74_9 skip-rate: 50 - build-target: small-can-board folder: config/boards/hellen/small-can-board skip-rate: 50 - build-target: uaefi folder: config/boards/hellen/uaefi - build-target: small-can-board_debug folder: config/boards/hellen/small-can-board skip-rate: 00 - build-target: hellen88bmw folder: config/boards/hellen/hellen88bmw skip-rate: 99 - build-target: hellen88bmw_avr folder: config/boards/hellen/hellen88bmw skip-rate: 99 - build-target: hellen-112-17 folder: config/boards/hellen/hellen-112-17 skip-rate: 50 - build-target: hellen-112-17_debug folder: config/boards/hellen/hellen-112-17 skip-rate: 50 - build-target: hellen-gm-e67 folder: config/boards/hellen/hellen-gm-e67 skip-rate: 99 - build-target: hellenMiataNA6 folder: config/boards/hellen/hellenMiataNA6 skip-rate: 99 - build-target: hellenMiataNA96 folder: config/boards/hellen/hellenMiataNA96 skip-rate: 99 - build-target: hellenMiataNB1 folder: config/boards/hellen/hellenMiataNB1 skip-rate: 99 - build-target: hellenMiataNB2 folder: config/boards/hellen/hellenMiataNB2 skip-rate: 99 - build-target: hellen128 folder: config/boards/hellen/hellen128 skip-rate: 50 - build-target: hellen121vag folder: config/boards/hellen/hellen121vag skip-rate: 99 - build-target: hellen121nissan folder: config/boards/hellen/hellen121nissan skip-rate: 50 - build-target: hellen-honda-k folder: config/boards/hellen/hellen-honda-k - build-target: hellen-honda-k_debug folder: config/boards/hellen/hellen-honda-k skip-rate: 50 - build-target: hellen154hyundai folder: config/boards/hellen/hellen154hyundai skip-rate: 0 - build-target: hellen154hyundai_f7 folder: config/boards/hellen/hellen154hyundai skip-rate: 90 - build-target: cypress folder: config/boards/cypress - build-target: frankenso_na6 folder: config/boards/frankenso_na6 skip-rate: 90 - build-target: kinetis folder: config/boards/kinetis skip-rate: 0 - build-target: mre_f4 folder: config/boards/microrusefi - build-target: mre_f7 folder: config/boards/microrusefi skip-rate: 90 - build-target: prometheus_405 folder: config/boards/prometheus/f405 skip-rate: 90 - build-target: prometheus_469 folder: config/boards/prometheus/f469 skip-rate: 90 - build-target: proteus_f4 folder: config/boards/proteus - build-target: proteus_f4_debug folder: config/boards/proteus skip-rate: 80 - build-target: proteus_f7 folder: config/boards/proteus # - build-target: proteus_f7_debug # folder: config/boards/proteus # skip-rate: 80 - build-target: proteus_h7 folder: config/boards/proteus skip-rate: 90 - build-target: stm32f429_nucleo folder: config/boards/nucleo_f429 skip-rate: 50 - build-target: stm32f767_nucleo folder: config/boards/nucleo_f767 skip-rate: 50 - build-target: stm32f767_nucleo_debug folder: config/boards/nucleo_f767 skip-rate: 50 - build-target: stm32h743_nucleo folder: config/boards/nucleo_h743 skip-rate: 95 - build-target: subaru_eg33_f7 folder: config/boards/subaru_eg33 skip-rate: 50 - build-target: subaru_eg33_f7_no_bl folder: config/boards/subaru_eg33 skip-rate: 50 - build-target: f407-discovery folder: config/boards/f407-discovery skip-rate: 0 - build-target: f407-discovery_debug folder: config/boards/f407-discovery skip-rate: 0 - build-target: f429-discovery folder: config/boards/f429-discovery skip-rate: 95 - build-target: atlas folder: config/boards/atlas skip-rate: 95 - build-target: tdg-pdm8 folder: config/boards/tdg-pdm8 skip-rate: 95 - build-target: at_start_f435 folder: config/boards/at_start_f435 skip-rate: 0 steps: - name: Check branch name if: ${{ contains(github.ref_name, '.') }} run: echo '::error::Branch names must not contain ".", this breaks firmware autoupdates.' && exit 1 - name: Execution throttle early exit # Don't skip any jobs if this workflow was run manually, # or if the commit contains `only:`, signifying that only one bundle should be built. if: ${{ matrix.skip-rate && github.event_name != 'workflow_dispatch' && github.event_name != 'schedule' && github.event_name != 'pull_request' && github.run_attempt == 1 || contains(github.event.head_commit.message, 'only:') }} run: | # if the commit message contains `only:`, get the part after the semicolon and check if it matches the build target. read -d '' MSG << EOM || true ${{ github.event.head_commit.message }} EOM if echo $MSG | grep "only:"; then if [ "$(echo $MSG | grep -Po '(?<=only:)[^\s]*')" = "${{ matrix.build-target }}" ]; then exit 0 else # if it doesn't match, skip this job. echo "skip=true" >> $GITHUB_ENV exit 0 fi fi if (($(($RANDOM % 100)) < ${{ matrix.skip-rate }})); then echo "skip=true" >> $GITHUB_ENV; fi - name: Set run condition variables run: | if [ "${{github.event_name}}" = "schedule" ] && [ "${{github.repository}}" = "rusefi/rusefi" ]; then echo "Scheduled mode" echo "full=true" >> $GITHUB_ENV echo "upload=release" >> $GITHUB_ENV echo "date=$(date +'%Y-%m-%d')" >> $GITHUB_ENV elif [ "${{github.event_name}}" = "push" ]\ && [ "${{github.ref}}" = "refs/heads/master" ]\ && [ "${{env.skip}}" != "true" ]\ || [ "${{toJSON(inputs.lts)}}" = "true" ]; then echo "Full mode" echo "full=true" >> $GITHUB_ENV echo "upload=server" >> $GITHUB_ENV elif [ "${{env.skip}}" != "true" ]; then echo "Partial mode" echo "partial=true" >> $GITHUB_ENV fi - uses: actions/checkout@v4 if: ${{ env.skip != 'true' }} - name: Checkout Submodules if: ${{ env.skip != 'true' }} run: | git submodule update --init --depth=1 firmware/ChibiOS git submodule update --init --depth=1 firmware/ChibiOS-Contrib git submodule update --init --depth=1 firmware/libfirmware git submodule update --init --depth=1 firmware/ext/lua git submodule update --init --depth=1 firmware/ext/uzlib git submodule update --init --depth=1 firmware/ext/openblt git submodule update --init --depth=1 firmware/controllers/lua/luaaa git submodule update --init --depth=1 firmware/controllers/can/wideband_firmware git submodule update --init --depth=1 java_console/luaformatter git submodule update --init --depth=1 java_console/peak-can-basic - uses: actions/setup-java@v4 if: ${{ env.skip != 'true' }} with: distribution: 'zulu' java-version: '11' - name: Install multilib, mingw, sshpass and mtools if: ${{ env.skip != 'true' }} run: | sudo bash misc/actions/add-ubuntu-latest-apt-mirrors.sh sudo apt-get install gcc-multilib g++-multilib g++-mingw-w64 gcc-mingw-w64 sshpass mtools zip dosfstools - name: Set Build Env Variables if: ${{ env.skip != 'true' }} working-directory: ./firmware/ run: | echo LTS=${{toJSON(inputs.lts)}} >> $GITHUB_ENV echo REF=${{github.ref_name}} >> $GITHUB_ENV echo BUNDLE_NAME=${{matrix.build-target}} >> $GITHUB_ENV echo BOARD_DIR=${{matrix.folder}} >> $GITHUB_ENV echo BOARD_META_PATH=$(bash bin/find_meta_info.sh ${{matrix.folder}} ${{matrix.build-target}}) >> $GITHUB_ENV - name: Git Status if: ${{ env.skip != 'true' }} run: | git status # # Note to humans: on personal devices we have firmware/provide_gcc.sh and setup_linux_environment.sh # - name: Install Arm GNU Toolchain (arm-none-eabi-gcc) if: ${{ env.skip != 'true' }} uses: carlosperate/arm-none-eabi-gcc-action@v1 with: release: '12.3.Rel1' # Make sure the compiler we just downloaded works - just print out the version - name: Test arm-none-eabi-gcc Compiler if: ${{ env.skip != 'true' }} run: arm-none-eabi-gcc -v - name: Configs build_server upload SSH variables if: ${{ env.full == 'true' && env.upload == 'server' }} env: ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true' run: | echo "RUSEFI_SSH_SERVER=${{secrets.RUSEFI_SSH_SERVER}}" >> $GITHUB_ENV echo "RUSEFI_SSH_USER=${{secrets.RUSEFI_SSH_USER}}" >> $GITHUB_ENV echo "RUSEFI_SSH_PASS=${{secrets.RUSEFI_SSH_PASS}}" >> $GITHUB_ENV # - name: Download LibOpenBLT Tool (Linux) # uses: actions/download-artifact@v3 # with: # name: libopenblt-linux # path: ./firmware/ext/openblt/Host/ # - name: Download LibOpenBLT Tool (MacOS) # uses: actions/download-artifact@v3 # with: # name: libopenblt-macos # path: ./firmware/ext/openblt/Host/ # Build the firmware! - name: Build Firmware if: ${{ env.skip != 'true' }} working-directory: ./firmware/ run: | make clean if [ "$full" == "true" ]; then bash bin/compile.sh -b ${{env.BOARD_META_PATH}} else bash bin/compile.sh ${{env.BOARD_META_PATH}} all deliver/rusefi.dfu deliver/rusefi.bin fi - name: Upload Bundle if: ${{ env.full == 'true' }} working-directory: ./artifacts run: bash ../firmware/bin/upload_bundle.sh - name: Add Bundles to Release if: ${{ env.full == 'true' && env.upload == 'release' }} uses: ncipollo/release-action@v1.14.0 with: tag: ${{ env.date }} name: "Nightly ${{ env.date }}" artifacts: "artifacts/rusefi_bundle_*.zip" replacesArtifacts: false token: ${{ secrets.ACCESS_TOKEN }} allowUpdates: true prerelease: true - name: Upload .ini files to rusEFI Online server if: ${{ env.full == 'true' }} working-directory: ./firmware run: | source config/boards/common_script_read_meta_env.inc ${{ env.BOARD_META_PATH }} cd tunerstudio/generated ../upload_ini.sh ${{ secrets.RUSEFI_ONLINE_FTP_USER }} ${{ secrets.RUSEFI_ONLINE_FTP_PASS }} ${{ secrets.RUSEFI_FTP_SERVER }} - name: Upload github action elf artifact if: ${{ env.partial == 'true' }} uses: actions/upload-artifact@v4 with: name: rusefi_${{matrix.build-target}}.elf path: ./firmware/build/rusefi.elf - name: Upload github action map artifact if: ${{ env.partial == 'true' }} uses: actions/upload-artifact@v4 with: name: rusefi_${{matrix.build-target}}.map path: ./firmware/build/rusefi.map - name: Upload github action bin artifact if: ${{ env.partial == 'true' }} uses: actions/upload-artifact@v4 with: name: rusefi_${{matrix.build-target}}.bin path: ./firmware/deliver/rusefi*.bin - name: Upload github action hex artifact if: ${{ env.partial == 'true' }} uses: actions/upload-artifact@v4 with: name: rusefi_${{matrix.build-target}}.hex # we have a bit of a mess - this file from 'build' folder is only legit for not-BLT builds # todo: we should produce .hex in both OpenBLT and non-OpenBLT case same as we do for .bin and .elf path: ./firmware/build/rusefi*.hex - name: Upload github action dfu artifact if: ${{ env.partial == 'true' }} uses: actions/upload-artifact@v4 with: name: rusefi_${{matrix.build-target}}.dfu path: ./firmware/deliver/rusefi*.dfu - name: Upload bundle artifact if: ${{ env.full == 'true' }} uses: actions/upload-artifact@v4 with: name: rusefi_bundle_${{matrix.build-target}}.zip path: ./artifacts/rusefi_bundle*.zip - name: Upload github action autoupdate artifact if: ${{ env.full == 'true' }} uses: actions/upload-artifact@v4 with: name: rusefi_bundle_${{matrix.build-target}}_autoupdate.zip path: ./artifacts/rusefi_bundle_${{matrix.build-target}}_autoupdate.zip