name: Platform Build on: push: branches: - '**4.3' workflow_dispatch: inputs: ui_build: description: 'Force Rebuilding the UI. When not forced, the system will check for [ui-build] in the last commit message to trigger a ui rebuild' required: true type: boolean release_build: description: 'Force a Release build. When not forced, the system will check for release word in the last commit message to trigger a release' required: true type: boolean jobs: bootstrap: name: Global setup runs-on: ubuntu-latest container: image: sle118/squeezelite-esp32-idfv43 outputs: build_number: ${{ steps.buildnumber.outputs.build_number }} ui_build: ${{ steps.build_flags.outputs.ui_build }} release_flag: ${{ steps.build_flags.outputs.release_flag }} mock: ${{ steps.build_flags.outputs.mock }} steps: - uses: actions/checkout@v2 with: fetch-depth: 0 submodules: true - name: Generate common build number id: buildnumber uses: einaregilsson/build-number@v3 with: token: ${{secrets.github_token}} - name: Set build flags id: build_flags run: | git config --global --add safe.directory /__w/squeezelite-esp32/squeezelite-esp32 [ ${{github.event.inputs.ui_build}} ] && ui_build_option="--ui_build" || ui_build_option="" [ ${{github.event.inputs.release_build}} ] && release_build_option="--force" || release_build_option="" echo "ui_build_option=$ui_build_option" >> $GITHUB_ENV echo "release_build_option=$release_build_option" >> $GITHUB_ENV echo "Dumping environment" env . /opt/esp/python_env/idf4.3_py3.8_env/bin/activate # build_flags support the following options # --mock - to mock the compilation part - this is to be used for testing only # --force - to force a release build even if the last commit message doesn't contain the word "release" # --ui_build - to force a ui_build even if the last commit message doesn't contain "[ui-build]" build_tools.py build_flags $ui_build_option $release_build_option - name: Show Build Flags run: | echo "Running with the following options" echo "Web Build Flag=${{steps.build_flags.outputs.ui_build}}" echo "Mock flag=${{steps.build_flags.outputs.mock}}" echo "Release Flag=${{steps.build_flags.outputs.release_flag}}" - name: Refresh certificates if: ${{ steps.build_flags.outputs.release_flag }} run: | git update-index --chmod=+x ./server_certs/getcert.sh cd server_certs;./getcert.sh;cat github.pem;cd .. - name: Setup Node.js dependencies if: ${{ !env.ACT }} uses: actions/setup-node@v3 with: node-version: 16 cache: 'npm' cache-dependency-path: components/wifi-manager/webapp/package.json - name: Build Web Application if: ${{ steps.build_flags.outputs.ui_build == 1 }} run: | cd components/wifi-manager/webapp/ npm install npm run-script build - name: Update repository with prebuilt items if: ${{ steps.build_flags.outputs.ui_build == 1 || steps.build_flags.outputs.release_flag == 1 }} run: | git config user.name github-actions git config user.email github-actions@github.com git add server_certs git add components/wifi-manager/webapp/*.h git add components/wifi-manager/webapp/*.c git add components/wifi-manager/webapp/*.cmake git add components/wifi-manager/webapp/dist/* git commit -m "Update prebuilt objects [skip actions]" git push https://${{secrets.github_token}}@github.com/sle118/squeezelite-esp32.git - name: Locally store commonly built objects uses: actions/upload-artifact@v3 with: name: prebuilt_objects path: | server_certs components/wifi-manager/webapp/*.h components/wifi-manager/webapp/*.c components/wifi-manager/webapp/dist/* components/wifi-manager/webapp/*.cmake build: runs-on: ubuntu-latest container: image: sle118/squeezelite-esp32-idfv43 needs: [bootstrap] strategy: matrix: node: [I2S-4MFlash, SqueezeAmp, Muse] depth: [16, 32] exclude: - node: Muse depth: 32 - node: bootstrap depth: 32 steps: - uses: actions/checkout@v2 with: fetch-depth: 0 submodules: true - name: Show Build Flags run: | echo "Running with the following options" echo "Web Build Flag=${{needs.bootstrap.outputs.ui_build}}" echo "Mock flag=${{needs.bootstrap.outputs.mock}}" echo "Release Flag=${{needs.bootstrap.outputs.release_flag}}" echo Environment File name: $GITHUB_ENV - name: Set build parameters run: | . /opt/esp/python_env/idf4.3_py3.8_env/bin/activate git config --global --add safe.directory /__w/squeezelite-esp32/squeezelite-esp32 git status build_tools.py environment --build ${{ needs.bootstrap.outputs.build_number }} --env_file "$GITHUB_ENV" --node "${{matrix.node}}" --depth ${{matrix.depth}} --major 2 --docker sle118/squeezelite-esp32-idfv43 - uses: actions/download-artifact@master name: Restore common objects with: name: prebuilt_objects - name: Build the firmware if: ${{ needs.bootstrap.outputs.mock == 0 }} run: | . ${IDF_PYTHON_ENV_PATH}/bin/activate chmod +x ./components/spotify/cspot/bell/nanopb/generator/protoc chmod +x ./components/spotify/cspot/bell/nanopb/generator/protoc-gen-nanopb chmod +x ./components/spotify/cspot/bell/nanopb/generator/*.py chmod +x ./components/spotify/cspot/bell/nanopb/generator/*.py2 chmod +x ./components/spotify/cspot/bell/nanopb/generator/proto/*.py echo "Copying target sdkconfig" cp build-scripts/${TARGET_BUILD_NAME}-sdkconfig.defaults sdkconfig echo "Building project" idf.py build -DDEPTH=${DEPTH} -DBUILD_NUMBER=${BUILD_NUMBER}-${DEPTH} - name: Build Mock firmware if: ${{ needs.bootstrap.outputs.mock == 1 }} run: | mkdir -p build cd build mkdir -p partition_table mkdir -p bootloader echo \\"mock content\\"> ./squeezelite.bin echo \"mock content\"> ./recovery.bin echo \"mock content\"> ./bootloader/bootloader.bin echo \"mock content\"> ./partition_table/partition-table.bin echo \"mock content\"> ./ota_data_initial.bin echo \"mock content\"> ./flash_project_args echo \"mock content\"> ./size_comp1.txt echo \"mock content\"> ./size_comp2.txt echo \"mock content\"> ./partitions.csv echo { \"write_flash_args\" : [ \"--flash_mode\", \"dio\", \"--flash_size\", \"detect\", \"--flash_freq\", \"80m\" ], \"flash_settings\" : { \"flash_mode\": \"dio\", \"flash_size\": \"detect\", \"flash_freq\": \"80m\" }, \"flash_files\" : { \"0x8000\" : \"partition_table/partition-table.bin\", \"0xd000\" : \"ota_data_initial.bin\", \"0x1000\" : \"bootloader/bootloader.bin\", \"0x10000\" : \"recovery.bin\", \"0x150000\" : \"squeezelite.bin\" }, \"partition_table\" : { \"offset\" : \"0x8000\", \"file\" : \"partition_table/partition-table.bin\" }, \"otadata\" : { \"offset\" : \"0xd000\", \"file\" : \"ota_data_initial.bin\" }, \"bootloader\" : { \"offset\" : \"0x1000\", \"file\" : \"bootloader/bootloader.bin\" }, \"app\" : { \"offset\" : \"0x10000\", \"file\" : \"recovery.bin\" }, \"squeezelite\" : { \"offset\" : \"0x150000\", \"file\" : \"squeezelite.bin\" }, \"extra_esptool_args\" : { \"after\" : \"hard_reset\", \"before\" : \"default_reset\" } } > ./flasher_args.json - name: Create Release Artifact Zip if: ${{ needs.bootstrap.outputs.release_flag == 1 && needs.bootstrap.outputs.mock == 0 }} run: | if [ -z "${artifact_file_name}" ] then echo "No artifact file name set. Will not generate zip file." else echo "Generating build artifact zip file" zip -r build_output.zip build zip build/${artifact_file_name} partitions*.csv components/ build/*.bin build/bootloader/bootloader.bin build/partition_table/partition-table.bin build/flash_project_args build/size_*.txt fi - name: Upload Build Artifacts uses: actions/upload-artifact@v3 if: ${{ needs.bootstrap.outputs.mock == 0 }} with: name: ${{ env.artifact_prefix }} path: | build/flash_project_args build/size_comp1.txt build/size_comp2.txt partitions.csv sdkconfig server_certs/github.pem build/*.bin build/bootloader/bootloader.bin build/partition_table/partition-table.bin build_output.zip - name: Create Release if: ${{ needs.bootstrap.outputs.release_flag == 1 && needs.bootstrap.outputs.mock == 0 }} id: create_release uses: actions/create-release@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token with: tag_name: ${{ env.tag }} release_name: ${{ env.name }} body: ${{ env.description }} draft: false prerelease: true - name: Upload Release Asset - Squeezelite binary file if: ${{ needs.bootstrap.outputs.release_flag == 1 && needs.bootstrap.outputs.mock == 0 }} id: upload-release-asset uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} # This pulls from the CREATE RELEASE step above, referencing it's ID to get its outputs object, which include a `upload_url`. See this blog post for more info: https://jasonet.co/posts/new-features-of-github-actions/#passing-data-to-future-steps asset_path: build/squeezelite.bin asset_name: ${{ env.artifact_bin_file_name }} asset_content_type: application/octet-stream - name: Upload Release Asset - Zip file if: ${{ needs.bootstrap.outputs.release_flag == 1 && needs.bootstrap.outputs.mock == 0 }} id: upload-release-asset-zip uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} # This pulls from the CREATE RELEASE step above, referencing it's ID to get its outputs object, which include a `upload_url`. See this blog post for more info: https://jasonet.co/posts/new-features-of-github-actions/#passing-data-to-future-steps asset_path: build/${{ env.artifact_file_name }} asset_name: ${{ env.artifact_file_name }} asset_content_type: application/octet-stream update_web_installer: name: Update Web Installer After Release needs: [ bootstrap, build ] if: ${{( always() && !cancelled() ) && needs.bootstrap.outputs.release_flag == 1 && needs.bootstrap.outputs.mock == 0 }} uses: ./.github/workflows/web_deploy.yml