diff --git a/.github/workflows/build-fw_nrf52840dk_a2_release_mock.yml b/.github/workflows/build-fw_nrf52840dk_a2_release_mock.yml index 1b6056b..e1aab6e 100644 --- a/.github/workflows/build-fw_nrf52840dk_a2_release_mock.yml +++ b/.github/workflows/build-fw_nrf52840dk_a2_release_mock.yml @@ -181,14 +181,23 @@ jobs: printf "%s" "$IMAGE_SIGN" > "$RUNNER_TEMP/signing_keys/image_sign-dev.pem" - name: Prepare derived env + env: + TAG: ${{ github.ref_name }} + TAG_ON_MASTER: ${{ steps.master_check.outputs.tag_on_master }} run: | echo "SCRIPT_PATH=./${SCRIPT_NAME}.sh" >> "$GITHUB_ENV" echo "BUILD_DIR_NAME=${SCRIPT_NAME}" >> "$GITHUB_ENV" + if [[ "${TAG_ON_MASTER:-false}" == "true" ]]; then + BUILD_FLAGS="--tag_on_master=${TAG}" + else + BUILD_FLAGS="" + fi + echo "BUILD_FLAGS=${BUILD_FLAGS}" >> "$GITHUB_ENV" - name: Download B0, mcuboot, and fwloader releases run: | cd "$GITHUB_WORKSPACE/${PROJECT_DIR}" - "./${SCRIPT_PATH}" --download_releases + "./${SCRIPT_PATH}" ${BUILD_FLAGS:+"${BUILD_FLAGS}"} --download_releases - name: Build inside Docker container (reusing cached .nrfutil and ncs) env: @@ -217,6 +226,7 @@ jobs: -e PROJECT_DIR="${PROJECT_DIR}" \ -e SCRIPT_PATH="${SCRIPT_PATH}" \ -e BUILD_DIR_NAME="${BUILD_DIR_NAME}" \ + -e BUILD_FLAGS="${BUILD_FLAGS}" \ "${IMAGE_REF}" \ bash -lc ' set -xeuo pipefail @@ -229,7 +239,7 @@ jobs: cd $HOME/ncs/${NCS_VERSION}/${PROJECT_DIR} echo ">>> Running build script: ${SCRIPT_PATH}" - "./${SCRIPT_PATH}" --build_dir="${BUILD_DIR_NAME}" + "./${SCRIPT_PATH}" --build_dir="${BUILD_DIR_NAME}" ${BUILD_FLAGS:+"${BUILD_FLAGS}"} ' mv "$HOME/ncs/${{ env.NCS_VERSION }}/${{ env.PROJECT_DIR }}" "$GITHUB_WORKSPACE/${PROJECT_DIR}" @@ -246,7 +256,8 @@ jobs: TAG_ON_MASTER: ${{ steps.master_check.outputs.tag_on_master }} shell: bash run: | - set -euo pipefail + set -xeuo pipefail + pwd if [[ "${TAG_ON_MASTER:-false}" == "true" ]]; then ARTIFACT_NAME="${{ env.BUILD_DIR_NAME }}_${TAG}" else @@ -258,20 +269,65 @@ jobs: SRC="${{ env.PROJECT_DIR }}/${{ env.BUILD_DIR_NAME }}" DST="$ARTIFACT_NAME/${{ env.BUILD_DIR_NAME }}" - paths=( - "merged.hex" - "merged.ext_flash.hex" - "b0_container.hex" - "app_provision.hex" - "signed_by_mcuboot_and_b0_mcuboot.bin" - "signed_by_mcuboot_and_b0_mcuboot.hex" - "signed_by_mcuboot_and_b0_s1_image.bin" - "signed_by_mcuboot_and_b0_s1_image.hex" - "firmware_loader/zephyr/ruuvi_air_fw_loader.signed.bin" - "firmware_loader/zephyr/ruuvi_air_fw_loader.signed.hex" - "${{ env.PROJECT_DIR }}/zephyr/ruuvi_air_fw.signed.bin" - "${{ env.PROJECT_DIR }}/zephyr/ruuvi_air_fw.signed.hex" - ) + flag_build_release_subcomponent=false + flag_build_release_b0=false + flag_build_release_mcuboot=false + flag_build_release_fwloader=false + + if [[ "${TAG_ON_MASTER:-false}" == "true" ]]; then + echo "Tag on master: ${TAG}" + if [[ "${TAG}" == "b0_v"* ]]; then + flag_build_release_subcomponent=true + flag_build_release_b0=true + fi + if [[ "${TAG}" == "mcuboot_v"* ]]; then + flag_build_release_subcomponent=true + flag_build_release_mcuboot=true + fi + if [[ "${TAG}" == "fwloader_v"* ]]; then + flag_build_release_subcomponent=true + flag_build_release_fwloader=true + fi + fi + + if [ "${flag_build_release_subcomponent}" = true ]; then + if [ "${flag_build_release_b0}" = true ]; then + paths=( + "b0_container.hex" + "app_provision.hex" + ) + elif [ "${flag_build_release_mcuboot}" = true ]; then + paths=( + "signed_by_mcuboot_and_b0_mcuboot.bin" + "signed_by_mcuboot_and_b0_mcuboot.hex" + "signed_by_mcuboot_and_b0_s1_image.bin" + "signed_by_mcuboot_and_b0_s1_image.hex" + ) + elif [ "${flag_build_release_fwloader}" = true ]; then + paths=( + "firmware_loader/zephyr/ruuvi_air_fw_loader.signed.bin" + "firmware_loader/zephyr/ruuvi_air_fw_loader.signed.hex" + ) + else + echo "Unknown subcomponent release tag: ${TAG}" + exit 1 + fi + else + paths=( + "merged.hex" + "merged.ext_flash.hex" + "b0_container.hex" + "app_provision.hex" + "signed_by_mcuboot_and_b0_mcuboot.bin" + "signed_by_mcuboot_and_b0_mcuboot.hex" + "signed_by_mcuboot_and_b0_s1_image.bin" + "signed_by_mcuboot_and_b0_s1_image.hex" + "firmware_loader/zephyr/ruuvi_air_fw_loader.signed.bin" + "firmware_loader/zephyr/ruuvi_air_fw_loader.signed.hex" + "${{ env.PROJECT_DIR }}/zephyr/ruuvi_air_fw.signed.bin" + "${{ env.PROJECT_DIR }}/zephyr/ruuvi_air_fw.signed.hex" + ) + fi for rel in "${paths[@]}"; do src_path="$SRC/$rel" @@ -279,12 +335,14 @@ jobs: mkdir -p "$(dirname "$dst_path")" cp "$src_path" "$dst_path" done - cp ${{ env.PROJECT_DIR }}/nrfjprog_cfg_ruuviair.toml "$ARTIFACT_NAME/nrfjprog_cfg_ruuviair.toml" + cp "${{ env.PROJECT_DIR }}/nrfjprog_cfg_ruuviair.toml" "$ARTIFACT_NAME/nrfjprog_cfg_ruuviair.toml" # Create zip file to upload as release asset - zip -r -q "$ARTIFACT_NAME.zip" "$ARTIFACT_NAME" + ARTIFACT_PATH="$GITHUB_WORKSPACE/$ARTIFACT_NAME.zip" + zip -r -q "$ARTIFACT_PATH" "$ARTIFACT_NAME" echo "artifact_name=$ARTIFACT_NAME" >> "$GITHUB_OUTPUT" + echo "artifact_path=$ARTIFACT_PATH" >> "$GITHUB_OUTPUT" - name: Upload artifact ${{ steps.create_zip.outputs.artifact_name }} uses: actions/upload-artifact@v4 diff --git a/.github/workflows/build-fw_ruuviair_a1-dev.yml b/.github/workflows/build-fw_ruuviair_a1-dev.yml index caeea64..1c4ea5c 100644 --- a/.github/workflows/build-fw_ruuviair_a1-dev.yml +++ b/.github/workflows/build-fw_ruuviair_a1-dev.yml @@ -183,14 +183,23 @@ jobs: printf "%s" "$IMAGE_SIGN" > "$RUNNER_TEMP/signing_keys/image_sign-dev.pem" - name: Prepare derived env + env: + TAG: ${{ github.ref_name }} + TAG_ON_MASTER: ${{ steps.master_check.outputs.tag_on_master }} run: | echo "SCRIPT_PATH=./${SCRIPT_NAME}.sh" >> "$GITHUB_ENV" echo "BUILD_DIR_NAME=${SCRIPT_NAME}" >> "$GITHUB_ENV" + if [[ "${TAG_ON_MASTER:-false}" == "true" ]]; then + BUILD_FLAGS="--tag_on_master=${TAG}" + else + BUILD_FLAGS="" + fi + echo "BUILD_FLAGS=${BUILD_FLAGS}" >> "$GITHUB_ENV" - name: Download B0, mcuboot, and fwloader releases run: | cd "$GITHUB_WORKSPACE/${PROJECT_DIR}" - "./${SCRIPT_PATH}" --download_releases + "./${SCRIPT_PATH}" ${BUILD_FLAGS:+"${BUILD_FLAGS}"} --download_releases - name: Build inside Docker container (reusing cached .nrfutil and ncs) env: @@ -219,6 +228,7 @@ jobs: -e PROJECT_DIR="${PROJECT_DIR}" \ -e SCRIPT_PATH="${SCRIPT_PATH}" \ -e BUILD_DIR_NAME="${BUILD_DIR_NAME}" \ + -e BUILD_FLAGS="${BUILD_FLAGS}" \ "${IMAGE_REF}" \ bash -lc ' set -xeuo pipefail @@ -231,7 +241,7 @@ jobs: cd $HOME/ncs/${NCS_VERSION}/${PROJECT_DIR} echo ">>> Running build script: ${SCRIPT_PATH}" - "./${SCRIPT_PATH}" --build_dir="${BUILD_DIR_NAME}" + "./${SCRIPT_PATH}" --build_dir="${BUILD_DIR_NAME}" ${BUILD_FLAGS:+"${BUILD_FLAGS}"} ' mv "$HOME/ncs/${{ env.NCS_VERSION }}/${{ env.PROJECT_DIR }}" "$GITHUB_WORKSPACE/${PROJECT_DIR}" @@ -261,20 +271,65 @@ jobs: SRC="${{ env.PROJECT_DIR }}/${{ env.BUILD_DIR_NAME }}" DST="$ARTIFACT_NAME/${{ env.BUILD_DIR_NAME }}" - paths=( - "merged.hex" - "merged.ext_flash.hex" - "b0_container.hex" - "app_provision.hex" - "signed_by_mcuboot_and_b0_mcuboot.bin" - "signed_by_mcuboot_and_b0_mcuboot.hex" - "signed_by_mcuboot_and_b0_s1_image.bin" - "signed_by_mcuboot_and_b0_s1_image.hex" - "firmware_loader/zephyr/ruuvi_air_fw_loader.signed.bin" - "firmware_loader/zephyr/ruuvi_air_fw_loader.signed.hex" - "${{ env.PROJECT_DIR }}/zephyr/ruuvi_air_fw.signed.bin" - "${{ env.PROJECT_DIR }}/zephyr/ruuvi_air_fw.signed.hex" - ) + flag_build_release_subcomponent=false + flag_build_release_b0=false + flag_build_release_mcuboot=false + flag_build_release_fwloader=false + + if [[ "${TAG_ON_MASTER:-false}" == "true" ]]; then + echo "Tag on master: ${TAG}" + if [[ "${TAG}" == "b0_v"* ]]; then + flag_build_release_subcomponent=true + flag_build_release_b0=true + fi + if [[ "${TAG}" == "mcuboot_v"* ]]; then + flag_build_release_subcomponent=true + flag_build_release_mcuboot=true + fi + if [[ "${TAG}" == "fwloader_v"* ]]; then + flag_build_release_subcomponent=true + flag_build_release_fwloader=true + fi + fi + + if [ "${flag_build_release_subcomponent}" = true ]; then + if [ "${flag_build_release_b0}" = true ]; then + paths=( + "b0_container.hex" + "app_provision.hex" + ) + elif [ "${flag_build_release_mcuboot}" = true ]; then + paths=( + "signed_by_mcuboot_and_b0_mcuboot.bin" + "signed_by_mcuboot_and_b0_mcuboot.hex" + "signed_by_mcuboot_and_b0_s1_image.bin" + "signed_by_mcuboot_and_b0_s1_image.hex" + ) + elif [ "${flag_build_release_fwloader}" = true ]; then + paths=( + "firmware_loader/zephyr/ruuvi_air_fw_loader.signed.bin" + "firmware_loader/zephyr/ruuvi_air_fw_loader.signed.hex" + ) + else + echo "Unknown subcomponent release tag: ${TAG}" + exit 1 + fi + else + paths=( + "merged.hex" + "merged.ext_flash.hex" + "b0_container.hex" + "app_provision.hex" + "signed_by_mcuboot_and_b0_mcuboot.bin" + "signed_by_mcuboot_and_b0_mcuboot.hex" + "signed_by_mcuboot_and_b0_s1_image.bin" + "signed_by_mcuboot_and_b0_s1_image.hex" + "firmware_loader/zephyr/ruuvi_air_fw_loader.signed.bin" + "firmware_loader/zephyr/ruuvi_air_fw_loader.signed.hex" + "${{ env.PROJECT_DIR }}/zephyr/ruuvi_air_fw.signed.bin" + "${{ env.PROJECT_DIR }}/zephyr/ruuvi_air_fw.signed.hex" + ) + fi for rel in "${paths[@]}"; do src_path="$SRC/$rel" @@ -282,7 +337,7 @@ jobs: mkdir -p "$(dirname "$dst_path")" cp "$src_path" "$dst_path" done - cp ${{ env.PROJECT_DIR }}/nrfjprog_cfg_ruuviair.toml "$ARTIFACT_NAME/nrfjprog_cfg_ruuviair.toml" + cp "${{ env.PROJECT_DIR }}/nrfjprog_cfg_ruuviair.toml" "$ARTIFACT_NAME/nrfjprog_cfg_ruuviair.toml" # Create zip file to upload as release asset ARTIFACT_PATH="$GITHUB_WORKSPACE/$ARTIFACT_NAME.zip" diff --git a/.github/workflows/build-fw_ruuviair_a2-dev.yml b/.github/workflows/build-fw_ruuviair_a2-dev.yml index d235112..1d0bbd9 100644 --- a/.github/workflows/build-fw_ruuviair_a2-dev.yml +++ b/.github/workflows/build-fw_ruuviair_a2-dev.yml @@ -183,14 +183,23 @@ jobs: printf "%s" "$IMAGE_SIGN" > "$RUNNER_TEMP/signing_keys/image_sign-dev.pem" - name: Prepare derived env + env: + TAG: ${{ github.ref_name }} + TAG_ON_MASTER: ${{ steps.master_check.outputs.tag_on_master }} run: | echo "SCRIPT_PATH=./${SCRIPT_NAME}.sh" >> "$GITHUB_ENV" echo "BUILD_DIR_NAME=${SCRIPT_NAME}" >> "$GITHUB_ENV" + if [[ "${TAG_ON_MASTER:-false}" == "true" ]]; then + BUILD_FLAGS="--tag_on_master=${TAG}" + else + BUILD_FLAGS="" + fi + echo "BUILD_FLAGS=${BUILD_FLAGS}" >> "$GITHUB_ENV" - name: Download B0, mcuboot, and fwloader releases run: | cd "$GITHUB_WORKSPACE/${PROJECT_DIR}" - "./${SCRIPT_PATH}" --download_releases + "./${SCRIPT_PATH}" ${BUILD_FLAGS:+"${BUILD_FLAGS}"} --download_releases - name: Build inside Docker container (reusing cached .nrfutil and ncs) env: @@ -219,6 +228,7 @@ jobs: -e PROJECT_DIR="${PROJECT_DIR}" \ -e SCRIPT_PATH="${SCRIPT_PATH}" \ -e BUILD_DIR_NAME="${BUILD_DIR_NAME}" \ + -e BUILD_FLAGS="${BUILD_FLAGS}" \ "${IMAGE_REF}" \ bash -lc ' set -xeuo pipefail @@ -231,7 +241,7 @@ jobs: cd $HOME/ncs/${NCS_VERSION}/${PROJECT_DIR} echo ">>> Running build script: ${SCRIPT_PATH}" - "./${SCRIPT_PATH}" --build_dir="${BUILD_DIR_NAME}" + "./${SCRIPT_PATH}" --build_dir="${BUILD_DIR_NAME}" ${BUILD_FLAGS:+"${BUILD_FLAGS}"} ' mv "$HOME/ncs/${{ env.NCS_VERSION }}/${{ env.PROJECT_DIR }}" "$GITHUB_WORKSPACE/${PROJECT_DIR}" @@ -261,20 +271,65 @@ jobs: SRC="${{ env.PROJECT_DIR }}/${{ env.BUILD_DIR_NAME }}" DST="$ARTIFACT_NAME/${{ env.BUILD_DIR_NAME }}" - paths=( - "merged.hex" - "merged.ext_flash.hex" - "b0_container.hex" - "app_provision.hex" - "signed_by_mcuboot_and_b0_mcuboot.bin" - "signed_by_mcuboot_and_b0_mcuboot.hex" - "signed_by_mcuboot_and_b0_s1_image.bin" - "signed_by_mcuboot_and_b0_s1_image.hex" - "firmware_loader/zephyr/ruuvi_air_fw_loader.signed.bin" - "firmware_loader/zephyr/ruuvi_air_fw_loader.signed.hex" - "${{ env.PROJECT_DIR }}/zephyr/ruuvi_air_fw.signed.bin" - "${{ env.PROJECT_DIR }}/zephyr/ruuvi_air_fw.signed.hex" - ) + flag_build_release_subcomponent=false + flag_build_release_b0=false + flag_build_release_mcuboot=false + flag_build_release_fwloader=false + + if [[ "${TAG_ON_MASTER:-false}" == "true" ]]; then + echo "Tag on master: ${TAG}" + if [[ "${TAG}" == "b0_v"* ]]; then + flag_build_release_subcomponent=true + flag_build_release_b0=true + fi + if [[ "${TAG}" == "mcuboot_v"* ]]; then + flag_build_release_subcomponent=true + flag_build_release_mcuboot=true + fi + if [[ "${TAG}" == "fwloader_v"* ]]; then + flag_build_release_subcomponent=true + flag_build_release_fwloader=true + fi + fi + + if [ "${flag_build_release_subcomponent}" = true ]; then + if [ "${flag_build_release_b0}" = true ]; then + paths=( + "b0_container.hex" + "app_provision.hex" + ) + elif [ "${flag_build_release_mcuboot}" = true ]; then + paths=( + "signed_by_mcuboot_and_b0_mcuboot.bin" + "signed_by_mcuboot_and_b0_mcuboot.hex" + "signed_by_mcuboot_and_b0_s1_image.bin" + "signed_by_mcuboot_and_b0_s1_image.hex" + ) + elif [ "${flag_build_release_fwloader}" = true ]; then + paths=( + "firmware_loader/zephyr/ruuvi_air_fw_loader.signed.bin" + "firmware_loader/zephyr/ruuvi_air_fw_loader.signed.hex" + ) + else + echo "Unknown subcomponent release tag: ${TAG}" + exit 1 + fi + else + paths=( + "merged.hex" + "merged.ext_flash.hex" + "b0_container.hex" + "app_provision.hex" + "signed_by_mcuboot_and_b0_mcuboot.bin" + "signed_by_mcuboot_and_b0_mcuboot.hex" + "signed_by_mcuboot_and_b0_s1_image.bin" + "signed_by_mcuboot_and_b0_s1_image.hex" + "firmware_loader/zephyr/ruuvi_air_fw_loader.signed.bin" + "firmware_loader/zephyr/ruuvi_air_fw_loader.signed.hex" + "${{ env.PROJECT_DIR }}/zephyr/ruuvi_air_fw.signed.bin" + "${{ env.PROJECT_DIR }}/zephyr/ruuvi_air_fw.signed.hex" + ) + fi for rel in "${paths[@]}"; do src_path="$SRC/$rel" @@ -282,7 +337,7 @@ jobs: mkdir -p "$(dirname "$dst_path")" cp "$src_path" "$dst_path" done - cp ${{ env.PROJECT_DIR }}/nrfjprog_cfg_ruuviair.toml "$ARTIFACT_NAME/nrfjprog_cfg_ruuviair.toml" + cp "${{ env.PROJECT_DIR }}/nrfjprog_cfg_ruuviair.toml" "$ARTIFACT_NAME/nrfjprog_cfg_ruuviair.toml" # Create zip file to upload as release asset ARTIFACT_PATH="$GITHUB_WORKSPACE/$ARTIFACT_NAME.zip" diff --git a/.github/workflows/build-fw_ruuviair_a2-prod.yml b/.github/workflows/build-fw_ruuviair_a2-prod.yml index c6ee0dc..94ea4a7 100644 --- a/.github/workflows/build-fw_ruuviair_a2-prod.yml +++ b/.github/workflows/build-fw_ruuviair_a2-prod.yml @@ -180,14 +180,23 @@ jobs: printf "%s" "$IMAGE_SIGN" > "$RUNNER_TEMP/signing_keys/image_sign-prod.pem" - name: Prepare derived env + env: + TAG: ${{ github.ref_name }} + TAG_ON_MASTER: ${{ steps.master_check.outputs.tag_on_master }} run: | echo "SCRIPT_PATH=./${SCRIPT_NAME}.sh" >> "$GITHUB_ENV" echo "BUILD_DIR_NAME=${SCRIPT_NAME}" >> "$GITHUB_ENV" + if [[ "${TAG_ON_MASTER:-false}" == "true" ]]; then + BUILD_FLAGS="--tag_on_master=${TAG}" + else + BUILD_FLAGS="" + fi + echo "BUILD_FLAGS=${BUILD_FLAGS}" >> "$GITHUB_ENV" - name: Download B0, mcuboot, and fwloader releases run: | cd "$GITHUB_WORKSPACE/${PROJECT_DIR}" - "./${SCRIPT_PATH}" --download_releases + "./${SCRIPT_PATH}" ${BUILD_FLAGS:+"${BUILD_FLAGS}"} --download_releases - name: Build inside Docker container (reusing cached .nrfutil and ncs) env: @@ -216,6 +225,7 @@ jobs: -e PROJECT_DIR="${PROJECT_DIR}" \ -e SCRIPT_PATH="${SCRIPT_PATH}" \ -e BUILD_DIR_NAME="${BUILD_DIR_NAME}" \ + -e BUILD_FLAGS="${BUILD_FLAGS}" \ "${IMAGE_REF}" \ bash -lc ' set -xeuo pipefail @@ -228,7 +238,7 @@ jobs: cd $HOME/ncs/${NCS_VERSION}/${PROJECT_DIR} echo ">>> Running build script: ${SCRIPT_PATH}" - "./${SCRIPT_PATH}" --build_dir="${BUILD_DIR_NAME}" + "./${SCRIPT_PATH}" --build_dir="${BUILD_DIR_NAME}" ${BUILD_FLAGS:+"${BUILD_FLAGS}"} ' mv "$HOME/ncs/${{ env.NCS_VERSION }}/${{ env.PROJECT_DIR }}" "$GITHUB_WORKSPACE/${PROJECT_DIR}" @@ -258,20 +268,65 @@ jobs: SRC="${{ env.PROJECT_DIR }}/${{ env.BUILD_DIR_NAME }}" DST="$ARTIFACT_NAME/${{ env.BUILD_DIR_NAME }}" - paths=( - "merged.hex" - "merged.ext_flash.hex" - "b0_container.hex" - "app_provision.hex" - "signed_by_mcuboot_and_b0_mcuboot.bin" - "signed_by_mcuboot_and_b0_mcuboot.hex" - "signed_by_mcuboot_and_b0_s1_image.bin" - "signed_by_mcuboot_and_b0_s1_image.hex" - "firmware_loader/zephyr/ruuvi_air_fw_loader.signed.bin" - "firmware_loader/zephyr/ruuvi_air_fw_loader.signed.hex" - "${{ env.PROJECT_DIR }}/zephyr/ruuvi_air_fw.signed.bin" - "${{ env.PROJECT_DIR }}/zephyr/ruuvi_air_fw.signed.hex" - ) + flag_build_release_subcomponent=false + flag_build_release_b0=false + flag_build_release_mcuboot=false + flag_build_release_fwloader=false + + if [[ "${TAG_ON_MASTER:-false}" == "true" ]]; then + echo "Tag on master: ${TAG}" + if [[ "${TAG}" == "b0_v"* ]]; then + flag_build_release_subcomponent=true + flag_build_release_b0=true + fi + if [[ "${TAG}" == "mcuboot_v"* ]]; then + flag_build_release_subcomponent=true + flag_build_release_mcuboot=true + fi + if [[ "${TAG}" == "fwloader_v"* ]]; then + flag_build_release_subcomponent=true + flag_build_release_fwloader=true + fi + fi + + if [ "${flag_build_release_subcomponent}" = true ]; then + if [ "${flag_build_release_b0}" = true ]; then + paths=( + "b0_container.hex" + "app_provision.hex" + ) + elif [ "${flag_build_release_mcuboot}" = true ]; then + paths=( + "signed_by_mcuboot_and_b0_mcuboot.bin" + "signed_by_mcuboot_and_b0_mcuboot.hex" + "signed_by_mcuboot_and_b0_s1_image.bin" + "signed_by_mcuboot_and_b0_s1_image.hex" + ) + elif [ "${flag_build_release_fwloader}" = true ]; then + paths=( + "firmware_loader/zephyr/ruuvi_air_fw_loader.signed.bin" + "firmware_loader/zephyr/ruuvi_air_fw_loader.signed.hex" + ) + else + echo "Unknown subcomponent release tag: ${TAG}" + exit 1 + fi + else + paths=( + "merged.hex" + "merged.ext_flash.hex" + "b0_container.hex" + "app_provision.hex" + "signed_by_mcuboot_and_b0_mcuboot.bin" + "signed_by_mcuboot_and_b0_mcuboot.hex" + "signed_by_mcuboot_and_b0_s1_image.bin" + "signed_by_mcuboot_and_b0_s1_image.hex" + "firmware_loader/zephyr/ruuvi_air_fw_loader.signed.bin" + "firmware_loader/zephyr/ruuvi_air_fw_loader.signed.hex" + "${{ env.PROJECT_DIR }}/zephyr/ruuvi_air_fw.signed.bin" + "${{ env.PROJECT_DIR }}/zephyr/ruuvi_air_fw.signed.hex" + ) + fi for rel in "${paths[@]}"; do src_path="$SRC/$rel" @@ -279,7 +334,7 @@ jobs: mkdir -p "$(dirname "$dst_path")" cp "$src_path" "$dst_path" done - cp ${{ env.PROJECT_DIR }}/nrfjprog_cfg_ruuviair.toml "$ARTIFACT_NAME/nrfjprog_cfg_ruuviair.toml" + cp "${{ env.PROJECT_DIR }}/nrfjprog_cfg_ruuviair.toml" "$ARTIFACT_NAME/nrfjprog_cfg_ruuviair.toml" # Create zip file to upload as release asset ARTIFACT_PATH="$GITHUB_WORKSPACE/$ARTIFACT_NAME.zip" diff --git a/.github/workflows/build-fw_ruuviair_a3-dev.yml b/.github/workflows/build-fw_ruuviair_a3-dev.yml index 8804edf..c1ba1c7 100644 --- a/.github/workflows/build-fw_ruuviair_a3-dev.yml +++ b/.github/workflows/build-fw_ruuviair_a3-dev.yml @@ -183,14 +183,23 @@ jobs: printf "%s" "$IMAGE_SIGN" > "$RUNNER_TEMP/signing_keys/image_sign-dev.pem" - name: Prepare derived env + env: + TAG: ${{ github.ref_name }} + TAG_ON_MASTER: ${{ steps.master_check.outputs.tag_on_master }} run: | echo "SCRIPT_PATH=./${SCRIPT_NAME}.sh" >> "$GITHUB_ENV" echo "BUILD_DIR_NAME=${SCRIPT_NAME}" >> "$GITHUB_ENV" + if [[ "${TAG_ON_MASTER:-false}" == "true" ]]; then + BUILD_FLAGS="--tag_on_master=${TAG}" + else + BUILD_FLAGS="" + fi + echo "BUILD_FLAGS=${BUILD_FLAGS}" >> "$GITHUB_ENV" - name: Download B0, mcuboot, and fwloader releases run: | cd "$GITHUB_WORKSPACE/${PROJECT_DIR}" - "./${SCRIPT_PATH}" --download_releases + "./${SCRIPT_PATH}" ${BUILD_FLAGS:+"${BUILD_FLAGS}"} --download_releases - name: Build inside Docker container (reusing cached .nrfutil and ncs) env: @@ -219,6 +228,7 @@ jobs: -e PROJECT_DIR="${PROJECT_DIR}" \ -e SCRIPT_PATH="${SCRIPT_PATH}" \ -e BUILD_DIR_NAME="${BUILD_DIR_NAME}" \ + -e BUILD_FLAGS="${BUILD_FLAGS}" \ "${IMAGE_REF}" \ bash -lc ' set -xeuo pipefail @@ -231,7 +241,7 @@ jobs: cd $HOME/ncs/${NCS_VERSION}/${PROJECT_DIR} echo ">>> Running build script: ${SCRIPT_PATH}" - "./${SCRIPT_PATH}" --build_dir="${BUILD_DIR_NAME}" + "./${SCRIPT_PATH}" --build_dir="${BUILD_DIR_NAME}" ${BUILD_FLAGS:+"${BUILD_FLAGS}"} ' mv "$HOME/ncs/${{ env.NCS_VERSION }}/${{ env.PROJECT_DIR }}" "$GITHUB_WORKSPACE/${PROJECT_DIR}" @@ -261,20 +271,65 @@ jobs: SRC="${{ env.PROJECT_DIR }}/${{ env.BUILD_DIR_NAME }}" DST="$ARTIFACT_NAME/${{ env.BUILD_DIR_NAME }}" - paths=( - "merged.hex" - "merged.ext_flash.hex" - "b0_container.hex" - "app_provision.hex" - "signed_by_mcuboot_and_b0_mcuboot.bin" - "signed_by_mcuboot_and_b0_mcuboot.hex" - "signed_by_mcuboot_and_b0_s1_image.bin" - "signed_by_mcuboot_and_b0_s1_image.hex" - "firmware_loader/zephyr/ruuvi_air_fw_loader.signed.bin" - "firmware_loader/zephyr/ruuvi_air_fw_loader.signed.hex" - "${{ env.PROJECT_DIR }}/zephyr/ruuvi_air_fw.signed.bin" - "${{ env.PROJECT_DIR }}/zephyr/ruuvi_air_fw.signed.hex" - ) + flag_build_release_subcomponent=false + flag_build_release_b0=false + flag_build_release_mcuboot=false + flag_build_release_fwloader=false + + if [[ "${TAG_ON_MASTER:-false}" == "true" ]]; then + echo "Tag on master: ${TAG}" + if [[ "${TAG}" == "b0_v"* ]]; then + flag_build_release_subcomponent=true + flag_build_release_b0=true + fi + if [[ "${TAG}" == "mcuboot_v"* ]]; then + flag_build_release_subcomponent=true + flag_build_release_mcuboot=true + fi + if [[ "${TAG}" == "fwloader_v"* ]]; then + flag_build_release_subcomponent=true + flag_build_release_fwloader=true + fi + fi + + if [ "${flag_build_release_subcomponent}" = true ]; then + if [ "${flag_build_release_b0}" = true ]; then + paths=( + "b0_container.hex" + "app_provision.hex" + ) + elif [ "${flag_build_release_mcuboot}" = true ]; then + paths=( + "signed_by_mcuboot_and_b0_mcuboot.bin" + "signed_by_mcuboot_and_b0_mcuboot.hex" + "signed_by_mcuboot_and_b0_s1_image.bin" + "signed_by_mcuboot_and_b0_s1_image.hex" + ) + elif [ "${flag_build_release_fwloader}" = true ]; then + paths=( + "firmware_loader/zephyr/ruuvi_air_fw_loader.signed.bin" + "firmware_loader/zephyr/ruuvi_air_fw_loader.signed.hex" + ) + else + echo "Unknown subcomponent release tag: ${TAG}" + exit 1 + fi + else + paths=( + "merged.hex" + "merged.ext_flash.hex" + "b0_container.hex" + "app_provision.hex" + "signed_by_mcuboot_and_b0_mcuboot.bin" + "signed_by_mcuboot_and_b0_mcuboot.hex" + "signed_by_mcuboot_and_b0_s1_image.bin" + "signed_by_mcuboot_and_b0_s1_image.hex" + "firmware_loader/zephyr/ruuvi_air_fw_loader.signed.bin" + "firmware_loader/zephyr/ruuvi_air_fw_loader.signed.hex" + "${{ env.PROJECT_DIR }}/zephyr/ruuvi_air_fw.signed.bin" + "${{ env.PROJECT_DIR }}/zephyr/ruuvi_air_fw.signed.hex" + ) + fi for rel in "${paths[@]}"; do src_path="$SRC/$rel" @@ -282,7 +337,7 @@ jobs: mkdir -p "$(dirname "$dst_path")" cp "$src_path" "$dst_path" done - cp ${{ env.PROJECT_DIR }}/nrfjprog_cfg_ruuviair.toml "$ARTIFACT_NAME/nrfjprog_cfg_ruuviair.toml" + cp "${{ env.PROJECT_DIR }}/nrfjprog_cfg_ruuviair.toml" "$ARTIFACT_NAME/nrfjprog_cfg_ruuviair.toml" # Create zip file to upload as release asset ARTIFACT_PATH="$GITHUB_WORKSPACE/$ARTIFACT_NAME.zip" diff --git a/.github/workflows/build-fw_ruuviair_a3-prod.yml b/.github/workflows/build-fw_ruuviair_a3-prod.yml index eb1c4c2..55119dd 100644 --- a/.github/workflows/build-fw_ruuviair_a3-prod.yml +++ b/.github/workflows/build-fw_ruuviair_a3-prod.yml @@ -180,14 +180,23 @@ jobs: printf "%s" "$IMAGE_SIGN" > "$RUNNER_TEMP/signing_keys/image_sign-prod.pem" - name: Prepare derived env + env: + TAG: ${{ github.ref_name }} + TAG_ON_MASTER: ${{ steps.master_check.outputs.tag_on_master }} run: | echo "SCRIPT_PATH=./${SCRIPT_NAME}.sh" >> "$GITHUB_ENV" echo "BUILD_DIR_NAME=${SCRIPT_NAME}" >> "$GITHUB_ENV" + if [[ "${TAG_ON_MASTER:-false}" == "true" ]]; then + BUILD_FLAGS="--tag_on_master=${TAG}" + else + BUILD_FLAGS="" + fi + echo "BUILD_FLAGS=${BUILD_FLAGS}" >> "$GITHUB_ENV" - name: Download B0, mcuboot, and fwloader releases run: | cd "$GITHUB_WORKSPACE/${PROJECT_DIR}" - "./${SCRIPT_PATH}" --download_releases + "./${SCRIPT_PATH}" ${BUILD_FLAGS:+"${BUILD_FLAGS}"} --download_releases - name: Build inside Docker container (reusing cached .nrfutil and ncs) env: @@ -216,6 +225,7 @@ jobs: -e PROJECT_DIR="${PROJECT_DIR}" \ -e SCRIPT_PATH="${SCRIPT_PATH}" \ -e BUILD_DIR_NAME="${BUILD_DIR_NAME}" \ + -e BUILD_FLAGS="${BUILD_FLAGS}" \ "${IMAGE_REF}" \ bash -lc ' set -xeuo pipefail @@ -228,7 +238,7 @@ jobs: cd $HOME/ncs/${NCS_VERSION}/${PROJECT_DIR} echo ">>> Running build script: ${SCRIPT_PATH}" - "./${SCRIPT_PATH}" --build_dir="${BUILD_DIR_NAME}" + "./${SCRIPT_PATH}" --build_dir="${BUILD_DIR_NAME}" ${BUILD_FLAGS:+"${BUILD_FLAGS}"} ' mv "$HOME/ncs/${{ env.NCS_VERSION }}/${{ env.PROJECT_DIR }}" "$GITHUB_WORKSPACE/${PROJECT_DIR}" @@ -258,20 +268,65 @@ jobs: SRC="${{ env.PROJECT_DIR }}/${{ env.BUILD_DIR_NAME }}" DST="$ARTIFACT_NAME/${{ env.BUILD_DIR_NAME }}" - paths=( - "merged.hex" - "merged.ext_flash.hex" - "b0_container.hex" - "app_provision.hex" - "signed_by_mcuboot_and_b0_mcuboot.bin" - "signed_by_mcuboot_and_b0_mcuboot.hex" - "signed_by_mcuboot_and_b0_s1_image.bin" - "signed_by_mcuboot_and_b0_s1_image.hex" - "firmware_loader/zephyr/ruuvi_air_fw_loader.signed.bin" - "firmware_loader/zephyr/ruuvi_air_fw_loader.signed.hex" - "${{ env.PROJECT_DIR }}/zephyr/ruuvi_air_fw.signed.bin" - "${{ env.PROJECT_DIR }}/zephyr/ruuvi_air_fw.signed.hex" - ) + flag_build_release_subcomponent=false + flag_build_release_b0=false + flag_build_release_mcuboot=false + flag_build_release_fwloader=false + + if [[ "${TAG_ON_MASTER:-false}" == "true" ]]; then + echo "Tag on master: ${TAG}" + if [[ "${TAG}" == "b0_v"* ]]; then + flag_build_release_subcomponent=true + flag_build_release_b0=true + fi + if [[ "${TAG}" == "mcuboot_v"* ]]; then + flag_build_release_subcomponent=true + flag_build_release_mcuboot=true + fi + if [[ "${TAG}" == "fwloader_v"* ]]; then + flag_build_release_subcomponent=true + flag_build_release_fwloader=true + fi + fi + + if [ "${flag_build_release_subcomponent}" = true ]; then + if [ "${flag_build_release_b0}" = true ]; then + paths=( + "b0_container.hex" + "app_provision.hex" + ) + elif [ "${flag_build_release_mcuboot}" = true ]; then + paths=( + "signed_by_mcuboot_and_b0_mcuboot.bin" + "signed_by_mcuboot_and_b0_mcuboot.hex" + "signed_by_mcuboot_and_b0_s1_image.bin" + "signed_by_mcuboot_and_b0_s1_image.hex" + ) + elif [ "${flag_build_release_fwloader}" = true ]; then + paths=( + "firmware_loader/zephyr/ruuvi_air_fw_loader.signed.bin" + "firmware_loader/zephyr/ruuvi_air_fw_loader.signed.hex" + ) + else + echo "Unknown subcomponent release tag: ${TAG}" + exit 1 + fi + else + paths=( + "merged.hex" + "merged.ext_flash.hex" + "b0_container.hex" + "app_provision.hex" + "signed_by_mcuboot_and_b0_mcuboot.bin" + "signed_by_mcuboot_and_b0_mcuboot.hex" + "signed_by_mcuboot_and_b0_s1_image.bin" + "signed_by_mcuboot_and_b0_s1_image.hex" + "firmware_loader/zephyr/ruuvi_air_fw_loader.signed.bin" + "firmware_loader/zephyr/ruuvi_air_fw_loader.signed.hex" + "${{ env.PROJECT_DIR }}/zephyr/ruuvi_air_fw.signed.bin" + "${{ env.PROJECT_DIR }}/zephyr/ruuvi_air_fw.signed.hex" + ) + fi for rel in "${paths[@]}"; do src_path="$SRC/$rel" @@ -279,7 +334,7 @@ jobs: mkdir -p "$(dirname "$dst_path")" cp "$src_path" "$dst_path" done - cp ${{ env.PROJECT_DIR }}/nrfjprog_cfg_ruuviair.toml "$ARTIFACT_NAME/nrfjprog_cfg_ruuviair.toml" + cp "${{ env.PROJECT_DIR }}/nrfjprog_cfg_ruuviair.toml" "$ARTIFACT_NAME/nrfjprog_cfg_ruuviair.toml" # Create zip file to upload as release asset ARTIFACT_PATH="$GITHUB_WORKSPACE/$ARTIFACT_NAME.zip" diff --git a/build.sh b/build.sh index 445167c..9b041e1 100755 --- a/build.sh +++ b/build.sh @@ -26,6 +26,7 @@ flash_ext=false flag_clean=false flag_prod=false flag_download_releases=false +tag_on_master="" # Loop over all arguments for arg in "$@"; do @@ -82,8 +83,12 @@ for arg in "$@"; do flag_download_releases=true shift ;; + --tag_on_master=*) + tag_on_master="${arg#*=}" + shift + ;; *) - echo "Error: Unknown argument '$1'" >&2 + echo "Error: Unknown argument '$arg'" >&2 exit 1 ;; esac @@ -140,6 +145,26 @@ if [ "$flash_ext" = true ] || [ "$flash" = true ]; then fi fi +flag_build_release_subcomponent=false +flag_build_release_b0=false +flag_build_release_mcuboot=false +flag_build_release_fwloader=false +if [[ -n "$tag_on_master" ]]; then + echo "Tag on master: $tag_on_master" + if [[ "$tag_on_master" == "b0_v"* ]]; then + flag_build_release_subcomponent=true + flag_build_release_b0=true + fi + if [[ "$tag_on_master" == "mcuboot_v"* ]]; then + flag_build_release_subcomponent=true + flag_build_release_mcuboot=true + fi + if [[ "$tag_on_master" == "fwloader_v"* ]]; then + flag_build_release_subcomponent=true + flag_build_release_fwloader=true + fi +fi + warn_default() { echo "Warning: no valid tag matching '${prefix}[0..255].[0..255].[0..255][.0..255]' found; using 0.0.0+0" >&2 printf '0.0.0+0\n' @@ -410,19 +435,20 @@ download_all_releases() { fi } +if [ "$flag_build_release_subcomponent" = true ]; then + echo "Tag on master '$tag_on_master' indicates a release build for a subcomponent." + echo "Do not download releases for the subcomponents, as they will be built locally in this run and can be used directly without downloading." +else + echo "Downloading releases for B0, MCUBOOT and FWLOADER as indicated by the absence of a release tag on master for these components." + download_all_releases "$board_suffix" "$build_mode_suffix" "$flag_download_releases" + echo "All releases downloaded successfully." +fi + # Handle --download_releases flag early exit if [ "$flag_download_releases" = true ]; then - if [ -z "$board_rev_name" ]; then - echo "Error: --board_rev_name is required for --download_releases" >&2 - exit 1 - fi - download_all_releases "$board_suffix" "$build_mode_suffix" "true" - echo "All releases downloaded successfully." exit 0 fi -download_all_releases "$board_suffix" "$build_mode_suffix" "false" - # Ensure that ZEPHYR_BASE is set if [ -z "$ZEPHYR_BASE" ]; then echo "Error: ZEPHYR_BASE is not set. Please set it to the Zephyr base directory." >&2 @@ -668,7 +694,7 @@ fi RUUVI_AIR_BUILD_DIR="$BUILD_DIR/$CUR_DIR_NAME/zephyr" -if [[ -n "${B0_VER}" ]]; then +if [[ -n "${B0_VER}" && "$flag_build_release_subcomponent" != true ]]; then B0_TAG="b0_${B0_VER}" archive_name="build_ruuviair_${board_suffix}_release-${build_mode_suffix}_${B0_TAG}" archive_subfolder_name="build_ruuviair_${board_suffix}_release-${build_mode_suffix}" @@ -684,7 +710,7 @@ else BUILD_PATH_B0_APP_PROVISION_HEX="$BUILD_DIR/app_provision.hex" fi -if [[ -n "${MCUBOOT_VER}" ]]; then +if [[ -n "${MCUBOOT_VER}" && "$flag_build_release_subcomponent" != true ]]; then MCUBOOT_TAG="mcuboot_${MCUBOOT_VER}" archive_name="build_ruuviair_${board_suffix}_release-${build_mode_suffix}_${MCUBOOT_TAG}" archive_subfolder_name="build_ruuviair_${board_suffix}_release-${build_mode_suffix}" @@ -701,15 +727,15 @@ else BUILD_PATH_MCUBOOT1_HEX="$BUILD_DIR/signed_by_mcuboot_and_b0_s1_image.hex" fi -if [[ -n "${FWLOADER_VER}" ]]; then +if [[ -n "${FWLOADER_VER}" && "$flag_build_release_subcomponent" != true ]]; then FWLOADER_TAG="fwloader_${FWLOADER_VER}" archive_name="build_ruuviair_${board_suffix}_release-${build_mode_suffix}_${FWLOADER_TAG}" archive_subfolder_name="build_ruuviair_${board_suffix}_release-${build_mode_suffix}" archive_subfolder_path="${RELEASES_DIR}/${archive_name}/${archive_subfolder_name}" - BUILD_PATH_FWLOADER_HEX="${archive_subfolder_path}/ruuvi_air_fw_loader.signed.hex" - cp ${archive_subfolder_path}/firmware_loader/zephyr/ruuvi_air_fw_loader.signed.bin "$BUILD_DIR/firmware_loader/zephyr/ruuvi_air_fw_loader.signed.bin" - cp ${archive_subfolder_path}/firmware_loader/zephyr/ruuvi_air_fw_loader.signed.hex "$BUILD_DIR/firmware_loader/zephyr/ruuvi_air_fw_loader.signed.hex" + BUILD_PATH_FWLOADER_HEX="${archive_subfolder_path}/firmware_loader/zephyr/ruuvi_air_fw_loader.signed.hex" + cp "${archive_subfolder_path}/firmware_loader/zephyr/ruuvi_air_fw_loader.signed.bin" "$BUILD_DIR/firmware_loader/zephyr/ruuvi_air_fw_loader.signed.bin" + cp "${archive_subfolder_path}/firmware_loader/zephyr/ruuvi_air_fw_loader.signed.hex" "$BUILD_DIR/firmware_loader/zephyr/ruuvi_air_fw_loader.signed.hex" else BUILD_PATH_FWLOADER_HEX="$BUILD_DIR/firmware_loader/zephyr/ruuvi_air_fw_loader.signed.hex" fi @@ -768,7 +794,6 @@ if [ "$build_mode" = "release" ]; then ${BUILD_PATH_FWLOADER_HEX} \ $RUUVI_AIR_BUILD_DIR/ruuvi_air_fw.signed.hex - OFFSET=0x12000000 srec_cat "${BUILD_PATH_B0_APP_PROVISION_HEX}" -intel --offset $OFFSET -o "$BUILD_DIR/app_provision.ext_flash.hex" -intel srec_cat "${BUILD_PATH_MCUBOOT0_HEX}" -intel --offset $OFFSET -o "$BUILD_DIR/signed_by_mcuboot_and_b0_mcuboot.ext_flash.hex" -intel @@ -782,6 +807,34 @@ if [ "$build_mode" = "release" ]; then "$BUILD_DIR/firmware_loader/zephyr/ruuvi_air_fw_loader.signed.ext_flash.hex" -intel \ "$RUUVI_AIR_BUILD_DIR/ruuvi_air_fw.signed.ext_flash.hex" -intel \ -o "$BUILD_DIR/merged.ext_flash.hex" -intel + + if [ "$flag_build_release_subcomponent" = true ]; then + rm "$BUILD_DIR/merged.hex" + rm "$RUUVI_AIR_BUILD_DIR/ruuvi_air_fw.signed.hex" + rm "$RUUVI_AIR_BUILD_DIR/ruuvi_air_fw.signed.bin" + + rm "$BUILD_DIR/app_provision.ext_flash.hex" + rm "$BUILD_DIR/signed_by_mcuboot_and_b0_mcuboot.ext_flash.hex" + rm "$BUILD_DIR/signed_by_mcuboot_and_b0_s1_image.ext_flash.hex" + rm "$BUILD_DIR/firmware_loader/zephyr/ruuvi_air_fw_loader.signed.ext_flash.hex" + rm "$RUUVI_AIR_BUILD_DIR/ruuvi_air_fw.signed.ext_flash.hex" + rm "$BUILD_DIR/merged.ext_flash.hex" + + if [ "$flag_build_release_b0" != true ]; then + rm "${BUILD_PATH_B0_CONTAINER_HEX}" \ + "${BUILD_PATH_B0_APP_PROVISION_HEX}" + fi + if [ "$flag_build_release_mcuboot" != true ]; then + rm "$BUILD_DIR/signed_by_mcuboot_and_b0_mcuboot.bin" \ + "$BUILD_DIR/signed_by_mcuboot_and_b0_mcuboot.hex" + rm "$BUILD_DIR/signed_by_mcuboot_and_b0_s1_image.bin" \ + "$BUILD_DIR/signed_by_mcuboot_and_b0_s1_image.hex" + fi + if [ "$flag_build_release_fwloader" != true ]; then + rm "$BUILD_DIR/firmware_loader/zephyr/ruuvi_air_fw_loader.signed.bin" \ + "$BUILD_DIR/firmware_loader/zephyr/ruuvi_air_fw_loader.signed.hex" + fi + fi fi if [ "$flash_ext" = true ]; then