feat: Add reproducible Debian package builds and distribution #103
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Release Suite | ||
| on: | ||
| push: | ||
| tags: | ||
| - v* | ||
| concurrency: | ||
| group: ${{ github.workflow }}-${{ github.ref }} | ||
| cancel-in-progress: true | ||
| env: | ||
| DOCKER_PASSWORD: ${{ secrets.DH_KEY }} | ||
| DOCKER_USERNAME: ${{ secrets.DH_ORG }} | ||
| REPO_NAME: ${{ github.repository_owner }}/lighthouse | ||
| IMAGE_NAME: ${{ github.repository_owner }}/lighthouse | ||
| # Enable self-hosted runners for the sigp repo only. | ||
| SELF_HOSTED_RUNNERS: ${{ github.repository == 'sigp/lighthouse' }} | ||
| jobs: | ||
| extract-version: | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - name: Extract version | ||
| run: echo "VERSION=$(echo ${GITHUB_REF#refs/tags/})" >> $GITHUB_OUTPUT | ||
| id: extract_version | ||
| outputs: | ||
| VERSION: ${{ steps.extract_version.outputs.VERSION }} | ||
| build: | ||
| name: Build Release | ||
| strategy: | ||
| matrix: | ||
| arch: [aarch64-unknown-linux-gnu, | ||
| x86_64-unknown-linux-gnu, | ||
| x86_64-apple-darwin, | ||
| aarch64-apple-darwin, | ||
| x86_64-windows, | ||
| x86_64-unknown-linux-gnu-deb, | ||
| aarch64-unknown-linux-gnu-deb] | ||
| include: | ||
| - arch: aarch64-unknown-linux-gnu | ||
| runner: ${{ github.repository == 'sigp/lighthouse' && fromJson('["self-hosted", "linux", "release", "large"]') || 'ubuntu-latest' }} | ||
| profile: maxperf | ||
| - arch: x86_64-unknown-linux-gnu | ||
| runner: ${{ github.repository == 'sigp/lighthouse' && fromJson('["self-hosted", "linux", "release", "large"]') || 'ubuntu-latest' }} | ||
| profile: maxperf | ||
| - arch: x86_64-apple-darwin | ||
| runner: macos-13 | ||
| profile: maxperf | ||
| - arch: aarch64-apple-darwin | ||
| runner: macos-14 | ||
| profile: maxperf | ||
| - arch: x86_64-windows | ||
| runner: ${{ github.repository == 'sigp/lighthouse' && fromJson('["self-hosted", "windows", "release"]') || 'windows-2019' }} | ||
| profile: maxperf | ||
| # Debian package builds | ||
| - arch: x86_64-unknown-linux-gnu-deb | ||
| runner: ${{ github.repository == 'sigp/lighthouse' && fromJson('["self-hosted", "linux", "release", "large"]') || 'ubuntu-latest' }} | ||
| profile: maxperf | ||
| rust_target: x86_64-unknown-linux-gnu | ||
| gcc_package: gcc | ||
| - arch: aarch64-unknown-linux-gnu-deb | ||
| runner: ${{ github.repository == 'sigp/lighthouse' && fromJson('["self-hosted", "linux", "release", "large"]') || 'ubuntu-latest' }} | ||
| profile: maxperf | ||
| rust_target: aarch64-unknown-linux-gnu | ||
| gcc_package: gcc-aarch64-linux-gnu | ||
| runs-on: ${{ matrix.runner }} | ||
| needs: extract-version | ||
| steps: | ||
| - name: Checkout sources | ||
| uses: actions/checkout@v4 | ||
| - name: Get latest version of stable Rust | ||
| if: env.SELF_HOSTED_RUNNERS == 'false' | ||
| run: rustup update stable | ||
| # ============================== | ||
| # Windows dependencies | ||
| # ============================== | ||
| - uses: KyleMayes/install-llvm-action@v1 | ||
| if: env.SELF_HOSTED_RUNNERS == 'false' && startsWith(matrix.arch, 'x86_64-windows') | ||
| with: | ||
| version: "17.0" | ||
| directory: ${{ runner.temp }}/llvm | ||
| - name: Set LIBCLANG_PATH | ||
| if: startsWith(matrix.arch, 'x86_64-windows') | ||
| run: echo "LIBCLANG_PATH=$((gcm clang).source -replace "clang.exe")" >> $env:GITHUB_ENV | ||
| # ============================== | ||
| # Debian build dependencies | ||
| # ============================== | ||
| - name: Install Debian build dependencies | ||
| if: endsWith(matrix.arch, '-deb') | ||
| run: | | ||
| sudo apt-get update | ||
| sudo apt-get install -y libclang-dev cmake ${{ matrix.gcc_package }} | ||
| - name: Install Rust target for Debian builds | ||
| if: endsWith(matrix.arch, '-deb') | ||
| run: rustup target add ${{ matrix.rust_target }} | ||
| - name: Install cargo-deb | ||
| if: endsWith(matrix.arch, '-deb') | ||
| run: cargo install cargo-deb | ||
| # ============================== | ||
| # Builds - Binaries | ||
| # ============================== | ||
| - name: Build Lighthouse for aarch64-unknown-linux-gnu | ||
| if: matrix.arch == 'aarch64-unknown-linux-gnu' | ||
| run: | | ||
| cargo install cross | ||
| env CROSS_PROFILE=${{ matrix.profile }} make build-aarch64 | ||
| - name: Build Lighthouse for x86_64-unknown-linux-gnu | ||
| if: matrix.arch == 'x86_64-unknown-linux-gnu' | ||
| run: | | ||
| cargo install cross | ||
| env CROSS_PROFILE=${{ matrix.profile }} make build-x86_64 | ||
| - name: Move cross-compiled binary | ||
| if: contains(matrix.arch, 'unknown-linux-gnu') && !endsWith(matrix.arch, '-deb') | ||
| run: mv target/${{ matrix.arch }}/${{ matrix.profile }}/lighthouse ~/.cargo/bin/lighthouse | ||
| - name: Build Lighthouse for x86_64-apple-darwin | ||
| if: matrix.arch == 'x86_64-apple-darwin' | ||
| run: cargo install --path lighthouse --force --locked --features portable,gnosis --profile ${{ matrix.profile }} | ||
| - name: Build Lighthouse for aarch64-apple-darwin | ||
| if: matrix.arch == 'aarch64-apple-darwin' | ||
| run: cargo install --path lighthouse --force --locked --features portable,gnosis --profile ${{ matrix.profile }} | ||
| - name: Build Lighthouse for Windows | ||
| if: matrix.arch == 'x86_64-windows' | ||
| run: cargo install --path lighthouse --force --locked --features portable,gnosis --profile ${{ matrix.profile }} | ||
| # ============================== | ||
| # Builds - Debian Packages | ||
| # ============================== | ||
| - name: Build reproducible Debian package | ||
| if: endsWith(matrix.arch, '-deb') | ||
| run: | | ||
| make deb-cargo RUST_TARGET=${{ matrix.rust_target }} PROFILE=${{ matrix.profile }} | ||
| - name: Find and prepare Debian package | ||
| if: endsWith(matrix.arch, '-deb') | ||
| run: | | ||
| VERSION=${{ needs.extract-version.outputs.VERSION }} | ||
| DEB_FILE=$(find target/${{ matrix.rust_target }}/debian -name "*.deb" | head -1) | ||
| if [ -n "$DEB_FILE" ]; then | ||
| # Create standardized filename to match existing pattern | ||
| ARCH_SHORT=$(echo "${{ matrix.rust_target }}" | cut -d'-' -f1) | ||
| NEW_NAME="lighthouse-${{ needs.extract-version.outputs.VERSION }}-${ARCH_SHORT}.deb" | ||
| cp "$DEB_FILE" "$NEW_NAME" | ||
| echo "DEB_PACKAGE=$NEW_NAME" >> $GITHUB_ENV | ||
| # Generate checksums | ||
| sha256sum "$NEW_NAME" > "$NEW_NAME.sha256" | ||
| sha512sum "$NEW_NAME" > "$NEW_NAME.sha512" | ||
| echo "Debian package built: $NEW_NAME" | ||
| echo "Size: $(du -h "$NEW_NAME" | cut -f1)" | ||
| else | ||
| echo "❌ No .deb package found" | ||
| exit 1 | ||
| fi | ||
| # ================================== | ||
| # Binary Artifacts (existing) | ||
| # ================================== | ||
| - name: Configure GPG and create artifacts | ||
| if: startsWith(matrix.arch, 'x86_64-windows') != true && !endsWith(matrix.arch, '-deb') | ||
| env: | ||
| GPG_SIGNING_KEY: ${{ secrets.GPG_SIGNING_KEY }} | ||
| GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} | ||
| run: | | ||
| export GPG_TTY=$(tty) | ||
| echo "$GPG_SIGNING_KEY" | gpg --batch --import | ||
| mkdir artifacts | ||
| mv ~/.cargo/bin/lighthouse ./artifacts | ||
| cd artifacts | ||
| tar -czf lighthouse-${{ needs.extract-version.outputs.VERSION }}-${{ matrix.arch }}.tar.gz lighthouse | ||
| echo "$GPG_PASSPHRASE" | gpg --passphrase-fd 0 --pinentry-mode loopback --batch -ab lighthouse-${{ needs.extract-version.outputs.VERSION }}-${{ matrix.arch }}.tar.gz | ||
| for ext in "tar.gz" "tar.gz.asc";\ | ||
| do for f in *.$ext;\ | ||
| do cp $f "../${f%.$ext}.$ext";\ | ||
| done;\ | ||
| done | ||
| mv *tar.gz* .. | ||
| - name: Configure GPG and create artifacts Windows | ||
| if: startsWith(matrix.arch, 'x86_64-windows') | ||
| env: | ||
| GPG_SIGNING_KEY: ${{ secrets.GPG_SIGNING_KEY }} | ||
| GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} | ||
| run: | | ||
| echo $env:GPG_SIGNING_KEY | gpg --batch --import | ||
| mkdir artifacts | ||
| move $env:USERPROFILE/.cargo/bin/lighthouse.exe ./artifacts | ||
| cd artifacts | ||
| tar -czf lighthouse-${{ needs.extract-version.outputs.VERSION }}-${{ matrix.arch }}.tar.gz lighthouse.exe | ||
| gpg --passphrase "$env:GPG_PASSPHRASE" --batch --pinentry-mode loopback -ab lighthouse-${{ needs.extract-version.outputs.VERSION }}-${{ matrix.arch }}.tar.gz | ||
| move *tar.gz* .. | ||
| # ============================== | ||
| # Debian Package Artifacts | ||
| # ============================== | ||
| - name: Sign Debian package | ||
| if: endsWith(matrix.arch, '-deb') | ||
| env: | ||
| GPG_SIGNING_KEY: ${{ secrets.GPG_SIGNING_KEY }} | ||
| GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} | ||
| run: | | ||
| export GPG_TTY=$(tty) | ||
| echo "$GPG_SIGNING_KEY" | gpg --batch --import | ||
| echo "$GPG_PASSPHRASE" | gpg --passphrase-fd 0 --pinentry-mode loopback --batch -ab "$DEB_PACKAGE" | ||
| # ======================================================================= | ||
| # Upload artifacts - Binaries (existing) | ||
| # ======================================================================= | ||
| - name: Upload artifact | ||
| if: !endsWith(matrix.arch, '-deb') | ||
| uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: lighthouse-${{ needs.extract-version.outputs.VERSION }}-${{ matrix.arch }}.tar.gz | ||
| path: lighthouse-${{ needs.extract-version.outputs.VERSION }}-${{ matrix.arch }}.tar.gz | ||
| compression-level: 0 | ||
| - name: Upload signature | ||
| if: !endsWith(matrix.arch, '-deb') | ||
| uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: lighthouse-${{ needs.extract-version.outputs.VERSION }}-${{ matrix.arch }}.tar.gz.asc | ||
| path: lighthouse-${{ needs.extract-version.outputs.VERSION }}-${{ matrix.arch }}.tar.gz.asc | ||
| compression-level: 0 | ||
| # ======================================================================= | ||
| # Upload artifacts - Debian packages | ||
| # ======================================================================= | ||
| - name: Upload Debian package | ||
| if: endsWith(matrix.arch, '-deb') | ||
| uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: ${{ env.DEB_PACKAGE }} | ||
| path: ${{ env.DEB_PACKAGE }} | ||
| compression-level: 0 | ||
| - name: Upload Debian package signature | ||
| if: endsWith(matrix.arch, '-deb') | ||
| uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: ${{ env.DEB_PACKAGE }}.asc | ||
| path: ${{ env.DEB_PACKAGE }}.asc | ||
| compression-level: 0 | ||
| - name: Upload Debian package checksums | ||
| if: endsWith(matrix.arch, '-deb') | ||
| uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: ${{ env.DEB_PACKAGE }}-checksums | ||
| path: | | ||
| ${{ env.DEB_PACKAGE }}.sha256 | ||
| ${{ env.DEB_PACKAGE }}.sha512 | ||
| compression-level: 0 | ||
| draft-release: | ||
| name: Draft Release | ||
| needs: [build, extract-version] | ||
| runs-on: ubuntu-latest | ||
| env: | ||
| VERSION: ${{ needs.extract-version.outputs.VERSION }} | ||
| steps: | ||
| # This is necessary for generating the changelog. It has to come before "Download Artifacts" or else it deletes the artifacts. | ||
| - name: Checkout sources | ||
| uses: actions/checkout@v4 | ||
| with: | ||
| fetch-depth: 0 | ||
| # ============================== | ||
| # Download artifacts | ||
| # ============================== | ||
| - name: Download artifacts | ||
| uses: actions/download-artifact@v4 | ||
| # ============================== | ||
| # Create release draft | ||
| # ============================== | ||
| - name: Generate Full Changelog | ||
| id: changelog | ||
| run: | | ||
| echo "CHANGELOG<<EOF" >> $GITHUB_OUTPUT | ||
| echo "$(git log --pretty=format:"- %s" $(git describe --tags --abbrev=0 ${{ env.VERSION }}^)..${{ env.VERSION }})" >> $GITHUB_OUTPUT | ||
| echo "EOF" >> $GITHUB_OUTPUT | ||
| - name: Create Release Draft | ||
| env: | ||
| GITHUB_USER: ${{ github.repository_owner }} | ||
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||
| # The formatting here is borrowed from OpenEthereum: https://github.com/openethereum/openethereum/blob/main/.github/workflows/build.yml | ||
| run: | | ||
| body=$(cat <<- "ENDBODY" | ||
| <Rick and Morty character> | ||
| ## Testing Checklist (DELETE ME) | ||
| - [ ] Run on synced Holesky Sigma Prime nodes. | ||
| - [ ] Run on synced Canary (mainnet) Sigma Prime nodes. | ||
| - [ ] Resync a Holesky node. | ||
| - [ ] Resync a mainnet node. | ||
| ## Release Checklist (DELETE ME) | ||
| - [ ] Merge `unstable` -> `stable`. | ||
| - [ ] Ensure docker images are published (check `latest` and the version tag). | ||
| - [ ] Prepare Discord post. | ||
| - [ ] Prepare Twitter post. | ||
| - [ ] Prepare mailing list email. | ||
| ## Summary | ||
| Add a summary. | ||
| ## Update Priority | ||
| This table provides priorities for which classes of users should update particular components. | ||
| |User Class |Beacon Node | Validator Client| | ||
| --- | --- | --- | ||
| |Staking Users| <TODO> | <TODO> | | ||
| |Non-Staking Users| <TODO>|---| | ||
| *See [Update | ||
| Priorities](https://lighthouse-book.sigmaprime.io/installation_priorities.html) | ||
| more information about this table.* | ||
| ## All Changes | ||
| ${{ steps.changelog.outputs.CHANGELOG }} | ||
| ## Binaries | ||
| [See pre-built binaries documentation.](https://lighthouse-book.sigmaprime.io/installation_binaries.html) | ||
| The binaries are signed with Sigma Prime's PGP key: `15E66D941F697E28F49381F426416DC3F30674B0` | ||
| | System | Architecture | Binary | PGP Signature | | ||
| |:---:|:---:|:---:|:---| | ||
| | <picture> <source media="(prefers-color-scheme: dark)" srcset="https://cdn.simpleicons.org/apple/white" > <source media="(prefers-color-scheme: light)" srcset="https://cdn.simpleicons.org/apple" ><img src="https://cdn.simpleicons.org/apple" width="32" alt="Apple logo"> </picture> | x86_64 | [lighthouse-${{ env.VERSION }}-x86_64-apple-darwin.tar.gz](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/lighthouse-${{ env.VERSION }}-x86_64-apple-darwin.tar.gz) | [PGP Signature](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/lighthouse-${{ env.VERSION }}-x86_64-apple-darwin.tar.gz.asc) | | ||
| | <picture> <source media="(prefers-color-scheme: dark)" srcset="https://cdn.simpleicons.org/apple/white" > <source media="(prefers-color-scheme: light)" srcset="https://cdn.simpleicons.org/apple" ><img src="https://cdn.simpleicons.org/apple" width="32" alt="Apple logo"> </picture> | aarch64 | [lighthouse-${{ env.VERSION }}-aarch64-apple-darwin.tar.gz](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/lighthouse-${{ env.VERSION }}-aarch64-apple-darwin.tar.gz) | [PGP Signature](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/lighthouse-${{ env.VERSION }}-aarch64-apple-darwin.tar.gz.asc) | | ||
| | <picture> <source media="(prefers-color-scheme: dark)" srcset="https://cdn.simpleicons.org/linux/white" > <source media="(prefers-color-scheme: light)" srcset="https://cdn.simpleicons.org/linux/black" ><img src="https://cdn.simpleicons.org/linux" width="32" alt="Linux logo"> </picture> | x86_64 | [lighthouse-${{ env.VERSION }}-x86_64-unknown-linux-gnu.tar.gz](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/lighthouse-${{ env.VERSION }}-x86_64-unknown-linux-gnu.tar.gz) | [PGP Signature](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/lighthouse-${{ env.VERSION }}-x86_64-unknown-linux-gnu.tar.gz.asc) | | ||
| | <picture> <source media="(prefers-color-scheme: dark)" srcset="https://cdn.simpleicons.org/raspberrypi/white" > <source media="(prefers-color-scheme: light)" srcset="https://cdn.simpleicons.org/raspberrypi/black" > <img src="https://cdn.simpleicons.org/raspberrypi" width="32" alt="Raspberrypi logo"> </picture> | aarch64 | [lighthouse-${{ env.VERSION }}-aarch64-unknown-linux-gnu.tar.gz](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/lighthouse-${{ env.VERSION }}-aarch64-unknown-linux-gnu.tar.gz) | [PGP Signature](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/lighthouse-${{ env.VERSION }}-aarch64-unknown-linux-gnu.tar.gz.asc) | | ||
| | <picture> <source media="(prefers-color-scheme: dark)" srcset="https://upload.wikimedia.org/wikipedia/commons/8/87/Windows_logo_-_2021.svg"> <source media="(prefers-color-scheme: light)" srcset="https://upload.wikimedia.org/wikipedia/commons/c/c4/Windows_logo_-_2021_%28Black%29.svg"> <img src="https://upload.wikimedia.org/wikipedia/commons/c/c4/Windows_logo_-_2021_%28Black%29.svg" width="32" alt="Windows logo"> </picture> | x86_64 | [lighthouse-${{ env.VERSION }}-x86_64-windows.tar.gz](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/lighthouse-${{ env.VERSION }}-x86_64-windows.tar.gz) | [PGP Signature](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/lighthouse-${{ env.VERSION }}-x86_64-windows.tar.gz.asc) | | ||
| ## Debian Packages | ||
| For Debian/Ubuntu users, we provide pre-built `.deb` packages with systemd integration: | ||
| | System | Architecture | Package | PGP Signature | Checksums | | ||
| |:---:|:---:|:---:|:---:|:---:| | ||
| | <picture> <source media="(prefers-color-scheme: dark)" srcset="https://cdn.simpleicons.org/debian/white" > <source media="(prefers-color-scheme: light)" srcset="https://cdn.simpleicons.org/debian/black" ><img src="https://cdn.simpleicons.org/debian" width="32" alt="Debian logo"> </picture> | x86_64 | [lighthouse-${{ env.VERSION }}-x86_64.deb](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/lighthouse-${{ env.VERSION }}-x86_64.deb) | [PGP Signature](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/lighthouse-${{ env.VERSION }}-x86_64.deb.asc) | [SHA256](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/lighthouse-${{ env.VERSION }}-x86_64.deb.sha256) / [SHA512](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/lighthouse-${{ env.VERSION }}-x86_64.deb.sha512) | | ||
| | <picture> <source media="(prefers-color-scheme: dark)" srcset="https://cdn.simpleicons.org/debian/white" > <source media="(prefers-color-scheme: light)" srcset="https://cdn.simpleicons.org/debian/black" ><img src="https://cdn.simpleicons.org/debian" width="32" alt="Debian logo"> </picture> | aarch64 | [lighthouse-${{ env.VERSION }}-aarch64.deb](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/lighthouse-${{ env.VERSION }}-aarch64.deb) | [PGP Signature](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/lighthouse-${{ env.VERSION }}-aarch64.deb.asc) | [SHA256](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/lighthouse-${{ env.VERSION }}-aarch64.deb.sha256) / [SHA512](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/lighthouse-${{ env.VERSION }}-aarch64.deb.sha512) | | ||
| ### Installation: | ||
| \`\`\`bash | ||
| # Download and install (x86_64) | ||
| wget https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/lighthouse-${{ env.VERSION }}-x86_64.deb | ||
| sudo dpkg -i lighthouse-${{ env.VERSION }}-x86_64.deb | ||
| sudo apt-get install -f # Fix dependencies if needed | ||
| # Enable and start service | ||
| sudo systemctl enable lighthouse | ||
| sudo systemctl start lighthouse | ||
| \`\`\` | ||
| | | | | | | ||
| |:---:|:---:|:---:|:---:| | ||
| | **System** | **Option** | - | **Resource** | | ||
| | <picture> <source media="(prefers-color-scheme: dark)" srcset="https://cdn.simpleicons.org/docker/white" > <source media="(prefers-color-scheme: light)" srcset="https://cdn.simpleicons.org/docker/black" > <img src="https://cdn.simpleicons.org/docker/black" width="32" alt="Docker logo"></picture> | Docker | [${{ env.VERSION }}](https://hub.docker.com/r/${{ env.IMAGE_NAME }}/tags?page=1&ordering=last_updated&name=${{ env.VERSION }}) | [${{ env.IMAGE_NAME }}](https://hub.docker.com/r/${{ env.IMAGE_NAME }}) | | ||
| ENDBODY | ||
| ) | ||
| assets=(./lighthouse-*.tar.gz*/lighthouse-*.tar.gz* ./lighthouse-*.deb*/lighthouse-*.deb*) | ||
| tag_name="${{ env.VERSION }}" | ||
| echo "$body" | gh release create --draft -F "-" "$tag_name" "${assets[@]}" | ||