name: nightly on: schedule: - cron: "0 2 * * *" workflow_dispatch: jobs: check: runs-on: ubuntu-latest outputs: skip: ${{ steps.check_changes.outputs.skip }} steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Check for changes since last nightly release id: check_changes env: API: ${{ github.server_url }}/api/v1 REPO: ${{ github.repository }} TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | LAST_NIGHTLY_SHA=$(curl -sf -H "Authorization: token $TOKEN" \ "$API/repos/$REPO/releases/tags/nightly" | jq -r '.target_commitish // empty' || 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@v4 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 Gitea Container Registry uses: docker/login-action@v3 with: registry: source.offmarket.win username: ${{ secrets.GITEA_REGISTRY_USER }} password: ${{ secrets.GITEA_REGISTRY_TOKEN }} - name: Delete existing nightly release and tag env: API: ${{ github.server_url }}/api/v1 REPO: ${{ github.repository }} TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | RELEASE_ID=$(curl -sf -H "Authorization: token $TOKEN" \ "$API/repos/$REPO/releases/tags/nightly" | jq -r '.id // empty' || echo "") if [ -n "$RELEASE_ID" ]; then curl -sf -X DELETE -H "Authorization: token $TOKEN" "$API/repos/$REPO/releases/$RELEASE_ID" || true curl -sf -X DELETE -H "Authorization: token $TOKEN" "$API/repos/$REPO/tags/nightly" || true fi - 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: EAGLECAST_VERSION: nightly-${{ steps.tag.outputs.date }} - name: Push Docker images run: | # Push all architecture-specific images docker push source.offmarket.win/aleagle/eaglecast:nightly-amd64 docker push source.offmarket.win/aleagle/eaglecast:nightly-arm64v8 docker push source.offmarket.win/aleagle/eaglecast:nightly-armv6 docker push source.offmarket.win/aleagle/eaglecast:nightly-armv7 - name: Create and push Docker manifest run: | docker buildx imagetools create -t source.offmarket.win/aleagle/eaglecast:nightly \ source.offmarket.win/aleagle/eaglecast:nightly-amd64 \ source.offmarket.win/aleagle/eaglecast:nightly-arm64v8 \ source.offmarket.win/aleagle/eaglecast:nightly-armv6 \ source.offmarket.win/aleagle/eaglecast:nightly-armv7 - name: Verify Docker manifest run: | docker buildx imagetools inspect source.offmarket.win/aleagle/eaglecast:nightly - name: Create Gitea release and upload assets env: API: ${{ github.server_url }}/api/v1 REPO: ${{ github.repository }} TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | BODY="> **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 the Gitea container registry as \`source.offmarket.win/aleagle/eaglecast:nightly\`. > For stable releases, please use a versioned release. Built from commit: $(git rev-parse --short HEAD)" PAYLOAD=$(jq -n \ --arg tag "nightly" \ --arg target "$(git rev-parse HEAD)" \ --arg name "Nightly release" \ --arg body "$BODY" \ '{tag_name: $tag, target_commitish: $target, name: $name, body: $body, prerelease: true}') RELEASE_ID=$(curl -sf -X POST \ -H "Authorization: token $TOKEN" \ -H "Content-Type: application/json" \ -d "$PAYLOAD" \ "$API/repos/$REPO/releases" | jq -r '.id') for f in dist/*.tar.gz; do curl -sf -X POST \ -H "Authorization: token $TOKEN" \ -F "attachment=@$f" \ "$API/repos/$REPO/releases/$RELEASE_ID/assets?name=$(basename "$f")" > /dev/null echo "uploaded: $(basename "$f")" done