Firmware at GHA #79
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Firmware at GHA | |
# | |
# this github action uses generate_matrix.sh to scan the file system and automatically produce build matrix! | |
# | |
# this github action is the heaviest one we've got, with each run taking around 10 minutes and the matrix which has a few dozens of these runs | |
# | |
# We have two mechanists to reduce github action runner consumption | |
# * 'skip_rate' ratio in meta-info.env files allows to skip some builds with specific skip percentage | |
# * 'only' syntax allow to build only specificed configuration, for example 'only:uaefi' line in the commit message would only build 'uaefi' configuration | |
# * for random commits we can build zero jobs if we do 'only:docs' or anything similar | |
# | |
on: | |
push: | |
pull_request: | |
schedule: | |
# this produces GitHub nightly releases https://github.com/rusefi/rusefi/releases | |
# by the way GitHub actions use UTC https://www.utctime.net/ which matches GMT time | |
# See https://github.com/rusefi/rusefi/issues/6286 for notes on scopes enabled on NIGHTLY_RELEASE_ACCESS_TOKEN | |
- cron: '27 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 1 | |
# at this point 'full' means 'release' or 'server' | |
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/[email protected] | |
id: checkTag | |
with: | |
tag: ${{ env.date }} | |
- name: Create Release Tag | |
if: ${{ env.upload == 'release' && steps.checkTag.outputs.exists == 'false' }} | |
id: tag | |
uses: mathieudutour/[email protected] | |
with: | |
github_token: ${{ secrets.NIGHTLY_RELEASE_ACCESS_TOKEN }} | |
custom_tag: ${{ env.date }} | |
tag_prefix: '' | |
- name: Create Release | |
if: ${{ env.upload == 'release' }} | |
uses: ncipollo/[email protected] | |
with: | |
tag: ${{ env.date }} | |
name: "Nightly ${{ env.date }}" | |
artifacts: "artifacts/rusefi_bundle_*.zip" | |
replacesArtifacts: false | |
token: ${{ secrets.NIGHTLY_RELEASE_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 | |
generate-matrix: | |
runs-on: ubuntu-latest | |
outputs: | |
matrix: ${{ steps.set-matrix.outputs.matrix }} | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Set matrix | |
id: set-matrix | |
run: | | |
export EVENT_NAME="${{github.event_name}}" | |
export RUN_ATTEMPT="${{github.run_attempt}}" | |
read -d '' COMMIT_MESSAGE << EOM || true | |
${{ github.event.head_commit.message }} | |
EOM | |
export COMMIT_MESSAGE | |
echo "matrix=$(bash firmware/bin/generate_matrix.sh)" >> $GITHUB_OUTPUT | |
build-firmware: | |
runs-on: ubuntu-latest | |
needs: [ | |
# todo proper build of build-libopenblt #5866 | |
#build-libopenblt-linux, | |
#build-libopenblt-macos, | |
release, | |
generate-matrix] | |
if: ${{ ! contains(needs.generate-matrix.outputs.matrix, '[]') }} | |
strategy: | |
# Let all builds finish even if one fails early | |
fail-fast: false | |
matrix: ${{fromJson(needs.generate-matrix.outputs.matrix)}} | |
steps: | |
- name: Check branch name | |
if: ${{ contains(github.ref_name, '.') }} | |
run: echo '::error::Branch names must not contain ".", this breaks firmware autoupdates. Branch name is "${{ github.ref_name }}".' && exit 1 | |
- name: Set run condition variables 2 | |
run: | | |
if [ "${{github.event_name}}" = "schedule" ] && [ "${{github.repository}}" = "rusefi/rusefi" ]; then | |
echo "Creating nightly build" | |
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" ]\ | |
|| [ "${{toJSON(inputs.lts)}}" = "true" ]; then | |
echo "Server upload mode" | |
echo "full=true" >> $GITHUB_ENV | |
echo "upload=server" >> $GITHUB_ENV | |
else | |
echo "GHA artifact mode" | |
echo "upload=gha_artifact" >> $GITHUB_ENV | |
fi | |
- uses: actions/checkout@v4 | |
- name: Checkout Submodules | |
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 | |
with: | |
distribution: 'zulu' | |
java-version: '11' | |
- name: Install multilib, mingw, sshpass and mtools | |
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 | |
working-directory: ./firmware/ | |
run: | | |
echo AUTOMATION_LTS=${{toJSON(inputs.lts)}} >> $GITHUB_ENV | |
echo AUTOMATION_REF=${{github.ref_name}} >> $GITHUB_ENV | |
echo BOARD_META_PATH=${{matrix.meta-info}} >> $GITHUB_ENV | |
echo "WHITE_LABEL=rusefi" >> $GITHUB_ENV | |
- name: Git Status | |
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) | |
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 | |
run: arm-none-eabi-gcc -v | |
- name: Configs build_server upload SSH variables | |
if: ${{ 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/ | |
- name: Clean (Just in Case) | |
working-directory: ./firmware/ | |
run: | | |
make clean | |
- name: Handle configs separately just to make github logs more readable | |
working-directory: ./firmware/ | |
run: | | |
bash bin/compile.sh ${{env.BOARD_META_PATH}} config | |
- name: Building Windows simulator separately just to make github logs more readable | |
working-directory: ./firmware/ | |
run: | | |
bash bin/compile.sh ${{env.BOARD_META_PATH}} ../simulator/build/rusefi_simulator.exe | |
# Build the firmware! We have the technology to build _everything_ in one 'make' invocation but choose to do separately for sake of more readable GHA logs | |
- name: Build Firmware | |
working-directory: ./firmware/ | |
run: | | |
bash bin/compile.sh ${{env.BOARD_META_PATH}} bundles --output-sync=recurse | |
- name: Check for illegal time conversions | |
working-directory: ./firmware/ | |
run: bash check_illegal_conversion.sh | |
- name: Upload Bundle | |
if: ${{ env.full == 'true' }} | |
working-directory: ./artifacts | |
run: | | |
source ../firmware/config/boards/common_script_read_meta_env.inc ../firmware/${{ env.BOARD_META_PATH }} | |
bash ../firmware/bin/upload_bundle.sh ${{ secrets.RUSEFI_SSH_USER }} "${{ secrets.RUSEFI_SSH_PASS }}" ${{ secrets.RUSEFI_SSH_SERVER }} ${BUNDLE_NAME} | |
- name: Add Bundles to Release | |
if: ${{ env.upload == 'release' }} | |
uses: ncipollo/[email protected] | |
with: | |
tag: ${{ env.date }} | |
name: "Nightly ${{ env.date }}" | |
artifacts: "artifacts/rusefi_bundle_*.zip" | |
replacesArtifacts: false | |
token: ${{ secrets.NIGHTLY_RELEASE_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 ${META_OUTPUT_ROOT_FOLDER}tunerstudio/generated | |
${OLDPWD}/tunerstudio/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.upload == 'gha_artifact' }} | |
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.upload == 'gha_artifact' }} | |
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.upload == 'gha_artifact' }} | |
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.upload == 'gha_artifact' }} | |
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.upload == 'gha_artifact' }} | |
uses: actions/upload-artifact@v4 | |
with: | |
name: rusefi_${{matrix.build-target}}.dfu | |
path: ./firmware/deliver/rusefi*.dfu | |
- name: Upload bundle artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
name: rusefi_bundle_${{matrix.build-target}}.zip | |
path: ./artifacts/rusefi_bundle_${{matrix.build-target}}.zip | |
- name: Upload github action autoupdate artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
name: rusefi_bundle_${{matrix.build-target}}_autoupdate.zip | |
path: ./artifacts/rusefi_bundle_${{matrix.build-target}}_autoupdate.zip |