name: Nightly build # Create nightly builds at the end of every day on: schedule: - cron: '0 0 * * *' repository_dispatch: types: [hyperion_nightly_push] jobs: update: name: Update Submodule rpi_ws281x if: github.repository_owner == 'hyperion-project' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: persist-credentials: false fetch-depth: 0 submodules: recursive - name: Update Submodule rpi_ws281x id: update run: git submodule update --remote --recursive dependencies/external/rpi_ws281x - name: Check git status id: status run: echo "status=$(git status -s)" >> $GITHUB_OUTPUT - name: Add and commit changes if: ${{ steps.status.outputs.status }} run: | git config --local user.email "20935312+Hyperion-Bot@users.noreply.github.com" git config --local user.name "Hyperion-Bot" git config --local diff.ignoreSubmodules dirty git commit -am "Update submodule rpi_ws281x" - name: Push changes if: ${{ steps.status.outputs.status }} uses: ad-m/github-push-action@master with: github_token: ${{ secrets.HYPERION_BOT_TOKEN }} branch: ${{ github.ref }} check: name: Compare local <-> nightly needs: [update] if: github.repository_owner == 'hyperion-project' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Check if commit has changed id: build-necessary run: | if wget --spider "https://nightly.apt.hyperion-project.org/$(git rev-parse --short HEAD)" 2>/dev/null; then echo "commit-has-changed=false" >> $GITHUB_OUTPUT else echo "commit-has-changed=true" >> $GITHUB_OUTPUT fi outputs: build-nightly: ${{ steps.build-necessary.outputs.commit-has-changed }} setup: name: Setup nightly build needs: [check] if: ${{ needs.check.outputs.build-nightly == 'true' }} runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set nightly matrix id: nightly-ppa run: | NIGHTLY=$(jq -n '.include |= [ inputs[] | select(.["exclude"] != true)]' .github/workflows/apt/*.json --compact-output) echo "nightly=$NIGHTLY" >> $GITHUB_OUTPUT outputs: nightly-matrix: ${{ steps.nightly-ppa.outputs.nightly }} build: name: ${{ matrix.description }} needs: [setup] runs-on: ubuntu-latest strategy: matrix: ${{ fromJson(needs.setup.outputs.nightly-matrix) }} steps: - uses: actions/checkout@v4 with: submodules: recursive - name: Generate environment variables run: | echo "$(tr -d '\n' < .version)+nightly$(date '+%Y%m%d')$(git rev-parse --short HEAD)" > .version VERSION=$(cat .version) echo VERSION=${VERSION} >> $GITHUB_ENV if [[ $VERSION == *"-"* ]]; then echo STANDARDS_VERSION=$(echo ${VERSION%-*}) >> $GITHUB_ENV echo TARBALL_VERSION=$(echo ${VERSION%-*}) >> $GITHUB_ENV echo DEBIAN_FORMAT='3.0 (quilt)' >> $GITHUB_ENV else echo STANDARDS_VERSION=$(echo ${VERSION%+*}) >> $GITHUB_ENV echo TARBALL_VERSION=${VERSION}~$(echo ${{ matrix.distribution }} | tr '[:upper:]' '[:lower:]') >> $GITHUB_ENV echo DEBIAN_FORMAT='3.0 (native)' >> $GITHUB_ENV fi echo DISTRIBUTION=$(echo ${{ matrix.distribution }} | tr '[:upper:]' '[:lower:]') >> $GITHUB_ENV - name: Build package shell: bash run: | mkdir -p "${GITHUB_WORKSPACE}/deploy" docker run --rm \ -v "${GITHUB_WORKSPACE}/deploy:/deploy" \ -v "${GITHUB_WORKSPACE}:/source:rw" \ ghcr.io/hyperion-project/${{ matrix.architecture }}:${{ env.DISTRIBUTION }} \ /bin/bash -c "cd /source && \ mkdir -p debian/source && echo '${{ env.DEBIAN_FORMAT }}' > debian/source/format && \ dch --create --distribution ${{ env.DISTRIBUTION }} --package 'hyperion' -v '${{ env.VERSION }}~${{ env.DISTRIBUTION }}' '${{ github.event.commits[0].message }}' && \ cp -fr LICENSE debian/copyright && \ sed 's/@BUILD_DEPENDS@/${{ matrix.build-depends }}/g; s/@DEPENDS@/${{ matrix.package-depends }}/g; s/@ARCHITECTURE@/${{ matrix.architecture }}/g; s/@STANDARDS_VERSION@/${{ env.STANDARDS_VERSION }}/g' debian/control.in > debian/control && \ sed 's/@CMAKE_ENVIRONMENT@/${{ matrix.cmake-environment }}/g' debian/rules.in > debian/rules && \ tar -cJf ../hyperion_${{ env.TARBALL_VERSION }}.orig.tar.xz . && \ debuild --no-lintian -uc -us && \ cp ../hyperion_*.deb /deploy" - name: Upload package artifact uses: actions/upload-artifact@v3 with: path: deploy retention-days: 1 publish: name: Publish nightly packages needs: [setup, build] if: github.repository_owner == 'hyperion-project' runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Import GPG key uses: crazy-max/ghaction-import-gpg@v6.0.0 with: gpg_private_key: ${{ secrets.APT_GPG }} - name: Install reprepro run: sudo apt -y install reprepro - name: Make build folders, export public GPG key, copy distributions file and create short sha file for nightly build check run: | mkdir -p nightly/{conf,dists,db} gpg --armor --output nightly/hyperion.pub.key --export 'admin@hyperion-project.org' cp debian/distributions nightly/conf/distributions touch "nightly/$(git rev-parse --short HEAD)" - name: Create initial structure/packages files and symbolic links run: | reprepro -Vb nightly createsymlinks reprepro -Vb nightly export - name: Download artifacts uses: actions/download-artifact@v3.0.2 - name: Include artifacts into the package source run: | for file in artifact/*.deb; do if [ -f "$file" ]; then dist=${file#*~} dist=${dist%_*} reprepro -Vb nightly/ includedeb "$dist" "$file" fi done - name: Upload packages to nightly server uses: SamKirkland/FTP-Deploy-Action@v4.3.4 with: server: nightly.apt.hyperion-project.org username: ${{ secrets.NIGHTLY_USER }} password: ${{ secrets.NIGHTLY_PASSWORD }} local-dir: "./nightly/" server-dir: "./" dangerous-clean-slate: true - name: Remove intermediate artifacts uses: geekyeggo/delete-artifact@v2 with: name: artifact failOnError: false