diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4d2965b5e8f..a69c2f4907f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,7 +18,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - id: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] + id: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/dev-builds.yml b/.github/workflows/dev-builds.yml deleted file mode 100644 index d2ffc058f80..00000000000 --- a/.github/workflows/dev-builds.yml +++ /dev/null @@ -1,245 +0,0 @@ -name: Build pre-release -# Don't enable CI on push, just on PR. If you -# are working on the main repo and want to trigger -# a CI build submit a draft PR. -on: - push: - branches: - - master - paths: - - 'src/**' - - '.github/**' - - 'cmake/**' - - 'lib/**' - - 'docs/Settings.md' - - 'CMakeLists.txt' - - '*.sh' - -jobs: - build: - runs-on: ubuntu-latest - strategy: - matrix: - id: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] - - steps: - - uses: actions/checkout@v4 - - name: Install dependencies - run: sudo apt-get update && sudo apt-get -y install ninja-build - - name: Setup environment - env: - ACTIONS_ALLOW_UNSECURE_COMMANDS: true - run: | - # This is the hash of the commit for the PR - # when the action is triggered by PR, empty otherwise - COMMIT_ID=${{ github.event.pull_request.head.sha }} - # This is the hash of the commit when triggered by push - # but the hash of refs/pull//merge, which is different - # from the hash of the latest commit in the PR, that's - # why we try github.event.pull_request.head.sha first - COMMIT_ID=${COMMIT_ID:-${{ github.sha }}} - BUILD_SUFFIX=dev-$(date '+%Y%m%d')-$(git rev-parse --short ${COMMIT_ID}) - VERSION=$(grep project CMakeLists.txt|awk -F VERSION '{ gsub(/^[ \t]+|[ \t\)]+$/, "", $2); print $2 }') - echo "BUILD_SUFFIX=${BUILD_SUFFIX}" >> $GITHUB_ENV - echo "BUILD_NAME=inav-${VERSION}-${BUILD_SUFFIX}" >> $GITHUB_ENV - echo "NUM_CORES=$(grep processor /proc/cpuinfo | wc -l)" >> $GITHUB_ENV - - uses: actions/cache@v4 - with: - path: downloads - key: ${{ runner.os }}-downloads-${{ hashFiles('CMakeLists.txt') }}-${{ hashFiles('**/cmake/*')}} - - name: Build targets (${{ matrix.id }}) - run: mkdir -p build && cd build && cmake -DWARNINGS_AS_ERRORS=ON -DCI_JOB_INDEX=${{ matrix.id }} -DCI_JOB_COUNT=${{ strategy.job-total }} -DBUILD_SUFFIX=${{ env.BUILD_SUFFIX }} -DVERSION_TYPE=dev -G Ninja .. && ninja -j${{ env.NUM_CORES }} ci - - name: Upload artifacts - uses: actions/upload-artifact@v4 - with: - name: ${{ env.BUILD_NAME }}.${{ matrix.id }} - path: ./build/*.hex - - build-SITL-Linux: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Install dependencies - run: sudo apt-get update && sudo apt-get -y install ninja-build - - name: Setup environment - env: - ACTIONS_ALLOW_UNSECURE_COMMANDS: true - run: | - # This is the hash of the commit for the PR - # when the action is triggered by PR, empty otherwise - COMMIT_ID=${{ github.event.pull_request.head.sha }} - # This is the hash of the commit when triggered by push - # but the hash of refs/pull//merge, which is different - # from the hash of the latest commit in the PR, that's - # why we try github.event.pull_request.head.sha first - COMMIT_ID=${COMMIT_ID:-${{ github.sha }}} - BUILD_SUFFIX=dev-$(date '+%Y%m%d')-$(git rev-parse --short ${COMMIT_ID}) - VERSION=$(grep project CMakeLists.txt|awk -F VERSION '{ gsub(/[ \t\)]+/, "", $2); print $2 }') - echo "BUILD_SUFFIX=${BUILD_SUFFIX}" >> $GITHUB_ENV - echo "BUILD_NAME=inav-${VERSION}-${BUILD_SUFFIX}" >> $GITHUB_ENV - echo "NUM_CORES=$(grep processor /proc/cpuinfo | wc -l)" >> $GITHUB_ENV - - name: Build SITL - run: mkdir -p build_SITL && cd build_SITL && cmake -DSITL=ON -DWARNINGS_AS_ERRORS=ON -G Ninja -DVERSION_TYPE=dev .. && ninja -j${{ env.NUM_CORES }} - - name: Upload artifacts - uses: actions/upload-artifact@v4 - with: - name: sitl-${{ env.BUILD_NAME }}-Linux - path: ./build_SITL/*_SITL - - build-SITL-Mac: - runs-on: macos-latest - steps: - - uses: actions/checkout@v4 - - name: Install dependencies - run: | - brew install cmake ninja ruby - - - name: Setup environment - env: - ACTIONS_ALLOW_UNSECURE_COMMANDS: true - run: | - # This is the hash of the commit for the PR - # when the action is triggered by PR, empty otherwise - COMMIT_ID=${{ github.event.pull_request.head.sha }} - # This is the hash of the commit when triggered by push - # but the hash of refs/pull//merge, which is different - # from the hash of the latest commit in the PR, that's - # why we try github.event.pull_request.head.sha first - COMMIT_ID=${COMMIT_ID:-${{ github.sha }}} - BUILD_SUFFIX=dev-$(date '+%Y%m%d')-$(git rev-parse --short ${COMMIT_ID}) - VERSION=$(grep project CMakeLists.txt|awk -F VERSION '{ gsub(/[ \t\)]+/, "", $2); print $2 }') - echo "BUILD_SUFFIX=${BUILD_SUFFIX}" >> $GITHUB_ENV - echo "BUILD_NAME=inav-${VERSION}-${BUILD_SUFFIX}" >> $GITHUB_ENV - - name: Build SITL - run: | - mkdir -p build_SITL && cd build_SITL - cmake -DSITL=ON -DWARNINGS_AS_ERRORS=ON -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" -DVERSION_TYPE=dev -G Ninja .. - ninja -j4 - - - name: Upload artifacts - uses: actions/upload-artifact@v4 - with: - name: sitl-${{ env.BUILD_NAME }}-MacOS - path: ./build_SITL/*_SITL - - build-SITL-Windows: - runs-on: windows-latest - defaults: - run: - shell: C:\tools\cygwin\bin\bash.exe -o igncr '{0}' - steps: - - uses: actions/checkout@v4 - - name: Setup Cygwin - uses: egor-tensin/setup-cygwin@v4 - with: - packages: cmake ruby ninja gcc-g++ - - name: Setup environment - env: - ACTIONS_ALLOW_UNSECURE_COMMANDS: true - run: | - # This is the hash of the commit for the PR - # when the action is triggered by PR, empty otherwise - COMMIT_ID=${{ github.event.pull_request.head.sha }} - # This is the hash of the commit when triggered by push - # but the hash of refs/pull//merge, which is different - # from the hash of the latest commit in the PR, that's - # why we try github.event.pull_request.head.sha first - COMMIT_ID=${COMMIT_ID:-${{ github.sha }}} - BUILD_SUFFIX=dev-$(date '+%Y%m%d')-$(git rev-parse --short ${COMMIT_ID}) - VERSION=$(grep project CMakeLists.txt|awk -F VERSION '{ gsub(/[ \t\)]+/, "", $2); print $2 }') - #echo "BUILD_SUFFIX=${BUILD_SUFFIX}" >> $GITHUB_ENV - #echo "BUILD_NAME=inav-${VERSION}-${BUILD_SUFFIX}" >> $GITHUB_ENV - #echo "VERSION_TAG=-$(date '+%Y%m%d')" >> $GITHUB_ENV - echo "version=${VERSION}" >> $GITHUB_OUTPUT - - name: Build SITL - run: mkdir -p build_SITL && cd build_SITL && cmake -DSITL=ON -DWARNINGS_AS_ERRORS=ON -DVERSION_TYPE=dev -G Ninja .. && ninja -j4 - - name: Upload artifacts - uses: actions/upload-artifact@v4 - with: - name: sitl-${{ env.BUILD_NAME }}-WIN - path: ./build_SITL/*.exe - - - test: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Install dependencies - run: sudo apt-get update && sudo apt-get -y install ninja-build - - name: Run Tests - run: mkdir -p build && cd build && cmake -DTOOLCHAIN=none -G Ninja .. && ninja check - - release: - needs: [build, build-SITL-Linux, build-SITL-Mac, build-SITL-Windows, test] - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Get version - id: version - run: | - VERSION=$(grep project CMakeLists.txt|awk -F VERSION '{ gsub(/[ \t\)]+/, "", $2); print $2 }') - echo "version=${VERSION}" >> $GITHUB_OUTPUT - - name: Get current date - id: date - run: echo "today=$(date '+%Y%m%d')" >> $GITHUB_OUTPUT - - name: download artifacts - uses: actions/download-artifact@v4 - with: - path: hexes - pattern: inav-* - merge-multiple: true - - name: download sitl linux - uses: actions/download-artifact@v4 - with: - path: resources/sitl/linux - pattern: sitl-*-Linux - merge-multiple: true - - name: download sitl windows - uses: actions/download-artifact@v4 - with: - path: resources/sitl/windows - pattern: sitl-*-WIN - merge-multiple: true - - name: download sitl mac - uses: actions/download-artifact@v4 - with: - path: resources/sitl/macos - pattern: sitl-*-MacOS - merge-multiple: true - - name: Consolidate sitl files - run: | - zip -r -9 sitl-resources.zip resources/ - - name: Upload release artifacts - uses: softprops/action-gh-release@v2 - with: - name: inav-${{ steps.version.outputs.version }}-dev-${{ steps.date.outputs.today }}-${{ github.run_number }}-${{ github.sha }} - tag_name: v${{ steps.version.outputs.version }}-${{ steps.date.outputs.today }}.${{ github.run_number }} - # To create release on a different repo, we need a token setup - token: ${{ secrets.NIGHTLY_TOKEN }} - repository: iNavFlight/inav-nightly - prerelease: true - draft: false - #generate_release_notes: true - make_latest: false - files: | - hexes/*.hex - sitl-resources.zip - body: | - ${{ steps.notes.outputs.notes }} - - ### Flashing - These are nightly builds and configuration settings can be added and removed often. Flashing with Full chip erase is strongly recommended to avoid issues. - Firmware related issues should be opened in the iNavflight/inav repository, not in inav-nightly. - - ### Repository: - ${{ github.repository }} ([link](${{ github.event.repository.html_url }})) - - ### Branch: - ${{ github.ref_name }} ([link](${{ github.event.repository.html_url }}/tree/${{ github.ref_name }})) - - ### Latest changeset: - ${{ github.event.head_commit.id }} ([link](${{ github.event.head_commit.url }})) - - ### Changes: - ${{ github.event.head_commit.message }} - diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml new file mode 100644 index 00000000000..b709cedd6c9 --- /dev/null +++ b/.github/workflows/nightly-build.yml @@ -0,0 +1,97 @@ +name: Build pre-release +# Don't enable CI on push, just on PR. If you +# are working on the main repo and want to trigger +# a CI build submit a draft PR. +on: + push: + branches: + - master + paths: + - 'src/**' + - '.github/**' + - 'cmake/**' + - 'lib/**' + - 'docs/Settings.md' + - 'CMakeLists.txt' + - '*.sh' + +jobs: + build: + name: build + uses: ./.github/workflows/ci.yaml + + release: + name: Release + needs: [build] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Get version + id: version + run: | + VERSION=$(grep project CMakeLists.txt|awk -F VERSION '{ gsub(/[ \t\)]+/, "", $2); print $2 }') + echo "version=${VERSION}" >> $GITHUB_OUTPUT + - name: Get current date + id: date + run: echo "today=$(date '+%Y%m%d')" >> $GITHUB_OUTPUT + - name: download artifacts + uses: actions/download-artifact@v4 + with: + path: hexes + pattern: inav-* + merge-multiple: true + - name: download sitl linux + uses: actions/download-artifact@v4 + with: + path: resources/sitl/linux + pattern: sitl-*-Linux + merge-multiple: true + - name: download sitl windows + uses: actions/download-artifact@v4 + with: + path: resources/sitl/windows + pattern: sitl-*-WIN + merge-multiple: true + - name: download sitl mac + uses: actions/download-artifact@v4 + with: + path: resources/sitl/macos + pattern: sitl-*-MacOS + merge-multiple: true + - name: Consolidate sitl files + run: | + zip -r -9 sitl-resources.zip resources/ + - name: Upload release artifacts + uses: softprops/action-gh-release@v2 + with: + name: inav-${{ steps.version.outputs.version }}-dev-${{ steps.date.outputs.today }}-${{ github.run_number }}-${{ github.sha }} + tag_name: v${{ steps.version.outputs.version }}-${{ steps.date.outputs.today }}.${{ github.run_number }} + # To create release on a different repo, we need a token setup + token: ${{ secrets.NIGHTLY_TOKEN }} + repository: iNavFlight/inav-nightly + prerelease: true + draft: false + #generate_release_notes: true + make_latest: false + files: | + hexes/*.hex + sitl-resources.zip + body: | + ${{ steps.notes.outputs.notes }} + + ### Flashing + These are nightly builds and configuration settings can be added and removed often. Flashing with Full chip erase is strongly recommended to avoid issues. + Firmware related issues should be opened in the iNavflight/inav repository, not in inav-nightly. + + ### Repository: + ${{ github.repository }} ([link](${{ github.event.repository.html_url }})) + + ### Branch: + ${{ github.ref_name }} ([link](${{ github.event.repository.html_url }}/tree/${{ github.ref_name }})) + + ### Latest changeset: + ${{ github.event.head_commit.id }} ([link](${{ github.event.head_commit.url }})) + + ### Changes: + ${{ github.event.head_commit.message }} + diff --git a/cmake/ci.cmake b/cmake/ci.cmake index 4546a8b6303..daa17337e61 100644 --- a/cmake/ci.cmake +++ b/cmake/ci.cmake @@ -3,13 +3,20 @@ if(DEFINED CI_JOB_INDEX AND DEFINED CI_JOB_COUNT) message("-- configuring CI job ${job_name}/${CI_JOB_COUNT}") get_property(targets GLOBAL PROPERTY RELEASE_TARGETS) list(LENGTH targets count) + message("-- ${count} total targets") math(EXPR per_job "(${count}+${CI_JOB_COUNT}-1)/${CI_JOB_COUNT}") - message("-- ${per_job} targets per job") math(EXPR start "${CI_JOB_INDEX}*${per_job}") - list(SUBLIST targets ${start} ${per_job} ci_targets) - message("-- will build targets: ${ci_targets}") - add_custom_target(ci - ${CMAKE_COMMAND} -E true - DEPENDS ${ci_targets} -) + message("-- ${per_job} targets per job, starting at ${start}") + if(${start} LESS ${count}) + list(SUBLIST targets ${start} ${per_job} ci_targets) + message("-- will build targets: ${ci_targets}") + add_custom_target(ci + ${CMAKE_COMMAND} -E true + DEPENDS ${ci_targets} + ) + else() + add_custom_target(ci + ${CMAKE_COMMAND} -E true + ) + endif() endif()