From 2ca70cc6a235cb5d6720611460225f95a9454a1e Mon Sep 17 00:00:00 2001 From: rusdacent <57439765+rusdacent@users.noreply.github.com> Date: Mon, 15 Feb 2021 02:53:17 +0300 Subject: [PATCH] Refactoring CI for storage with updates (#339) * refactor CI * fix depends for genpic CI * fix paths for dfu files * fix list of upload files * add debug for upload * bump version for docker-layer-caching * edit opts for rsync * Add clear remote dir * Add bin file for upload * Add new template for pic * rm debug commands * restore prod params for gen pic * fix link to firmware --- .github/assets/latest-firmware-template.png | Bin 19783 -> 19516 bytes .github/workflows/ci.yml | 146 ++++++++------------ ReadMe.md | 2 +- docker/Dockerfile | 1 + 4 files changed, 59 insertions(+), 90 deletions(-) diff --git a/.github/assets/latest-firmware-template.png b/.github/assets/latest-firmware-template.png index 11eb523a9db90fc4cc0ef12b03c9b2e47c86a392..2bbf4dab7ba81abaede4db3a298c45ae13f404e8 100644 GIT binary patch literal 19516 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 literal 19783 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 I+y3!?0aQ?!j{pDw diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c693f6d8..ed001fb1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,7 +18,7 @@ jobs: with: fetch-depth: 0 submodules: true - - uses: satackey/action-docker-layer-caching@v0.0.8 + - uses: satackey/action-docker-layer-caching@v0.0.11 continue-on-error: true with: key: docker-cache-${{ hashFiles('docker/**') }}-{hash} @@ -42,18 +42,6 @@ jobs: with: run: hex2dfu -i bootloader/.obj/f4/bootloader.hex -o bootloader/.obj/f4/bootloader.dfu - - name: Publish F4 bootloader artifacts - uses: actions/upload-artifact@v2 - with: - name: bootloader_f4 - path: | - bootloader/.obj/f4/bootloader.elf - bootloader/.obj/f4/bootloader.bin - bootloader/.obj/f4/bootloader.hex - bootloader/.obj/f4/bootloader.dfu - if-no-files-found: error - retention-days: 7 - - name: Build F4 firmware in docker uses: ./.github/actions/docker with: @@ -63,16 +51,44 @@ jobs: uses: ./.github/actions/docker with: run: hex2dfu -i firmware/.obj/f4/firmware.hex -o firmware/.obj/f4/firmware.dfu - - - name: Publish F4 firmware artifacts + + - name: Generate full hex file + uses: ./.github/actions/docker + with: + run: srec_cat bootloader/.obj/f4/bootloader.hex -Intel firmware/.obj/f4/firmware.hex -Intel -o full.hex -Intel + + - name: Move upload files + uses: ./.github/actions/docker + with: + run: | + mv bootloader/.obj/f4/bootloader.dfu bootloader.dfu + mv bootloader/.obj/f4/bootloader.bin bootloader.bin + mv firmware/.obj/f4/firmware.dfu firmware.dfu + mv firmware/.obj/f4/firmware.bin firmware.bin + + - name: Generate full dfu file + uses: ./.github/actions/docker + with: + run: hex2dfu -i full.hex -o full.dfu + + - name: Copy bootloader for full.bin + run: cp bootloader.bin full.bin + - name: Truncate full.bin + run: truncate -s 32768 full.bin + - name: Add firmware.bin at full.bin + run: cat firmware.bin >> full.bin + + - name: Publish F4 artifacts uses: actions/upload-artifact@v2 with: - name: firmware_f4 + name: artifacts_f4 path: | - firmware/.obj/f4/firmware.elf - firmware/.obj/f4/firmware.bin - firmware/.obj/f4/firmware.hex - firmware/.obj/f4/firmware.dfu + bootloader.dfu + bootloader.bin + firmware.dfu + firmware.bin + full.dfu + full.bin if-no-files-found: error retention-days: 7 @@ -81,71 +97,29 @@ jobs: needs: build runs-on: [self-hosted] steps: - - name: Force remove artifacts dir - run: rm -rf artifacts - - name: Create directory for artifacts - run: mkdir artifacts - - name: Get bootloader - uses: actions/download-artifact@v2 - with: - name: bootloader_f4 - path: artifacts/bootloader - - name: Get firmware - uses: actions/download-artifact@v2 - with: - name: firmware_f4 - path: artifacts/firmware - - name: Upload bootloader - uses: burnett01/rsync-deployments@4.1 - with: - switches: -avzp --delete - path: artifacts/bootloader - remote_path: "${{ secrets.RSYNC_DEPLOY_BASE_PATH }}${GITHUB_REF##*/}/" - remote_host: ${{ secrets.RSYNC_DEPLOY_HOST }} - remote_port: ${{ secrets.RSYNC_DEPLOY_PORT }} - remote_user: ${{ secrets.RSYNC_DEPLOY_USER }} - remote_key: ${{ secrets.RSYNC_DEPLOY_KEY }} - - name: Upload firmware - uses: burnett01/rsync-deployments@4.1 - with: - switches: -avzp --delete - path: artifacts/firmware - remote_path: "${{ secrets.RSYNC_DEPLOY_BASE_PATH }}${GITHUB_REF##*/}/" - remote_host: ${{ secrets.RSYNC_DEPLOY_HOST }} - remote_port: ${{ secrets.RSYNC_DEPLOY_PORT }} - remote_user: ${{ secrets.RSYNC_DEPLOY_USER }} - remote_key: ${{ secrets.RSYNC_DEPLOY_KEY }} - fullfirmware: - name: Create latest full firmware - needs: upload - if: github.ref == 'refs/heads/master' - runs-on: [self-hosted] - steps: - - name: Get bootloader - uses: actions/download-artifact@v2 - with: - name: bootloader_f4 - path: bootloader - - name: Get firmware - uses: actions/download-artifact@v2 - with: - name: firmware_f4 - path: firmware - - name: cp - run: cp ./bootloader/bootloader.bin full_firmware_latest.bin - - name: truncate - run: truncate -s 32768 full_firmware_latest.bin - - name: cat - run: cat ./firmware/firmware.bin >> full_firmware_latest.bin - - name: ls - run: ls -R - - name: Upload fullfirmware + - name: Make empty dir + run: mkdir empty + + - name: Clear upload dir uses: burnett01/rsync-deployments@4.1 with: - switches: -avzp --delete - path: full_firmware_latest.bin - remote_path: "${{ secrets.RSYNC_DEPLOY_BASE_PATH }}/" + switches: -cvzr --delete + path: empty/ + remote_path: "${{ secrets.RSYNC_DEPLOY_BASE_PATH }}${GITHUB_REF##*/}/" + remote_host: ${{ secrets.RSYNC_DEPLOY_HOST }} + remote_port: ${{ secrets.RSYNC_DEPLOY_PORT }} + remote_user: ${{ secrets.RSYNC_DEPLOY_USER }} + remote_key: ${{ secrets.RSYNC_DEPLOY_KEY }} + + - name: Generate files list + run: ls bootloader.dfu firmware.dfu full.dfu bootloader.bin firmware.bin full.bin > uploadlist.txt + + - name: Upload artifacts + uses: burnett01/rsync-deployments@4.1 + with: + switches: -cvzr --delete --files-from=uploadlist.txt + remote_path: "${{ secrets.RSYNC_DEPLOY_BASE_PATH }}${GITHUB_REF##*/}/" remote_host: ${{ secrets.RSYNC_DEPLOY_HOST }} remote_port: ${{ secrets.RSYNC_DEPLOY_PORT }} remote_user: ${{ secrets.RSYNC_DEPLOY_USER }} @@ -153,16 +127,10 @@ jobs: genpic: name: Generate pic - needs: fullfirmware + needs: upload if: github.ref == 'refs/heads/master' runs-on: [self-hosted] steps: - - name: Checkout code - uses: actions/checkout@v2 - with: - fetch-depth: 0 - ref: master - submodules: true - name: Set test env run: echo "NUMBER_OF_COMMITS=$(git rev-list --count HEAD)" >> $GITHUB_ENV - name: Test output NUMBER_OF_COMMITS diff --git a/ReadMe.md b/ReadMe.md index 789477ff..00a84d31 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -10,7 +10,7 @@ This repo will become completely public closer to the device shipping date. # Update firmware - + Flipper Zero's firmware consists of three components: diff --git a/docker/Dockerfile b/docker/Dockerfile index b434e4fd..175d6ccf 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -22,6 +22,7 @@ RUN apt update && \ python-pip \ python3 \ imagemagick \ + srecord \ libstdc++-arm-none-eabi-newlib \ git \ && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*