name: nightly on: schedule: - cron: "0 2 * * *" workflow_dispatch: permissions: contents: write packages: write jobs: check: runs-on: ubuntu-latest outputs: skip: ${{ steps.check_changes.outputs.skip }} steps: - name: Checkout uses: actions/checkout@v6 with: fetch-depth: 0 - name: Check for changes since last nightly release id: check_changes env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | LAST_NIGHTLY_SHA=$(gh release view nightly --json targetCommitish -q '.targetCommitish' 2>/dev/null || echo "") CURRENT_SHA=$(git rev-parse HEAD) echo "Last nightly SHA: $LAST_NIGHTLY_SHA" echo "Current SHA: $CURRENT_SHA" if [ -n "$LAST_NIGHTLY_SHA" ] && [ "$LAST_NIGHTLY_SHA" = "$CURRENT_SHA" ]; then echo "No changes since last nightly build, skipping ..." echo "skip=true" >> $GITHUB_OUTPUT else echo "Changes detected, proceeding with build ..." echo "skip=false" >> $GITHUB_OUTPUT fi nightly: needs: check if: needs.check.outputs.skip != 'true' runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v6 with: fetch-depth: 0 - name: Set up QEMU uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Set up Go uses: actions/setup-go@v5 with: go-version: "1.26.1" - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Login to GitHub Container Registry uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Delete existing nightly release env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: gh release delete nightly --yes --cleanup-tag 2>/dev/null || true - name: Set nightly date id: tag run: | NIGHTLY_DATE=$(date -u +%Y-%m-%d) echo "date=$NIGHTLY_DATE" >> $GITHUB_OUTPUT - name: Prepare dependencies run: make dist env: EAGLECAST_VERSION: nightly-${{ steps.tag.outputs.date }} - name: Run GoReleaser uses: goreleaser/goreleaser-action@v6 with: version: latest args: release --snapshot --parallelism 1 --clean --config .goreleaser-nightly.yml env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} EAGLECAST_VERSION: nightly-${{ steps.tag.outputs.date }} - name: Push Docker images run: | # Push all architecture-specific images docker push eaglecast:nightly-amd64 docker push eaglecast:nightly-arm64v8 docker push eaglecast:nightly-armv6 docker push eaglecast:nightly-armv7 docker push ghcr.io/h202-wq/eaglecast:nightly-amd64 docker push ghcr.io/h202-wq/eaglecast:nightly-arm64v8 docker push ghcr.io/h202-wq/eaglecast:nightly-armv6 docker push ghcr.io/h202-wq/eaglecast:nightly-armv7 - name: Create and push Docker manifests run: | # Docker Hub manifest docker buildx imagetools create -t eaglecast:nightly \ eaglecast:nightly-amd64 \ eaglecast:nightly-arm64v8 \ eaglecast:nightly-armv6 \ eaglecast:nightly-armv7 # GHCR manifest docker buildx imagetools create -t ghcr.io/h202-wq/eaglecast:nightly \ ghcr.io/h202-wq/eaglecast:nightly-amd64 \ ghcr.io/h202-wq/eaglecast:nightly-arm64v8 \ ghcr.io/h202-wq/eaglecast:nightly-armv6 \ ghcr.io/h202-wq/eaglecast:nightly-armv7 - name: Verify Docker manifests run: | docker buildx imagetools inspect eaglecast:nightly docker buildx imagetools inspect ghcr.io/h202-wq/eaglecast:nightly - name: Create GitHub Release env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | gh release create nightly \ --title "Nightly release" \ --notes " > **Warning**: This is an automated nightly build from the master branch. > It may contain bugs and breaking changes. Use at your own risk. > Available on Docker Hub and GitHub Container Registry as `eaglecast:nightly`. > For stable releases, please use a versioned release. Built from commit: $(git rev-parse --short HEAD)" \ --prerelease \ --target $(git rev-parse HEAD) \ dist/*.tar.gz