build scheduled #1502
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: "build scheduled" | |
| on: | |
| workflow_dispatch: | |
| schedule: | |
| - cron: "0 */12 * * *" # every 12 hours | |
| jobs: | |
| get_all_versions: | |
| runs-on: ubuntu-latest | |
| outputs: | |
| versions: ${{ steps.get_versions.outputs.versions }} | |
| latest: ${{ steps.get_versions.outputs.latest }} | |
| steps: | |
| - name: get available versions | |
| id: get_versions | |
| run: | | |
| set -euo pipefail | |
| curl -s -o versions.json "https://fill.papermc.io/v3/projects/paper" | |
| # pick newest family (numeric sort) and determine newest stable and newest unstable by actual build channel | |
| LATEST_FAMILY=$(jq -r '.versions | keys | sort_by(split(".") | map(tonumber)) | last' versions.json) | |
| LATEST_STABLE="" | |
| LATEST_UNSTABLE="" | |
| for v in $(jq -r --arg f "$LATEST_FAMILY" '.versions[$f][]' versions.json); do | |
| CHANNEL=$(curl -s "https://fill.papermc.io/v3/projects/paper/versions/$v/builds" | jq -r 'if type=="array" and length>0 then .[0].channel else "NONE" end') | |
| if [[ "$CHANNEL" == "STABLE" && -z "$LATEST_STABLE" ]]; then LATEST_STABLE="$v"; elif [[ "$CHANNEL" != "STABLE" && "$CHANNEL" != "NONE" && -z "$LATEST_UNSTABLE" ]]; then LATEST_UNSTABLE="$v"; fi | |
| [[ -n "$LATEST_STABLE" && -n "$LATEST_UNSTABLE" ]] && break | |
| done | |
| # fallback to previous family if newest has no stable build yet | |
| if [[ -z "$LATEST_STABLE" ]]; then | |
| PREV_FAMILY=$(jq -r '.versions | keys | sort_by(split(".") | map(tonumber)) | .[-2]' versions.json) | |
| for v in $(jq -r --arg f "$PREV_FAMILY" '.versions[$f][]' versions.json); do | |
| CHANNEL=$(curl -s "https://fill.papermc.io/v3/projects/paper/versions/$v/builds" | jq -r 'if type=="array" and length>0 then .[0].channel else "NONE" end') | |
| if [[ "$CHANNEL" == "STABLE" ]]; then LATEST_STABLE="$v"; break; fi | |
| done | |
| fi | |
| # build order: newest unstable first, then latest stable | |
| VERSIONS=$(jq -cn --arg u "$LATEST_UNSTABLE" --arg s "$LATEST_STABLE" '[ $u, $s ] | map(select(. != null and . != ""))') | |
| echo "versions=$VERSIONS" >> "$GITHUB_OUTPUT" | |
| # keep compatibility: expose latest (stable) for downstream steps already using it | |
| echo "latest=$LATEST_STABLE" >> "$GITHUB_OUTPUT" | |
| - name: show output | |
| run: | | |
| echo "versions: ${{ steps.get_versions.outputs.versions }}" | |
| echo "latest: ${{ steps.get_versions.outputs.latest }}" | |
| build_for_version: | |
| runs-on: ubuntu-latest | |
| needs: get_all_versions | |
| permissions: write-all | |
| continue-on-error: ${{ contains(matrix.versions, '-') }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| versions: ${{ fromJson(needs.get_all_versions.outputs.versions) }} | |
| steps: | |
| - name: get latest build | |
| id: latest_build | |
| run: | | |
| set -euo pipefail | |
| BUILDS=$(curl -s -o builds.json https://fill.papermc.io/v3/projects/paper/versions/${{ matrix.versions }}/builds) | |
| # Extract full objects (not just .id) to access download URL | |
| BUILD_STABLE=$(jq 'first(.[] | select(.channel=="STABLE"))' builds.json) | |
| BUILD_BETA=$(jq 'first(.[] | select(.channel=="BETA"))' builds.json) | |
| BUILD_ALPHA=$(jq 'first(.[] | select(.channel=="ALPHA"))' builds.json) | |
| # Extract ID for compatibility outputs (fallback to null when channel has no build) | |
| echo "build_stable=$(echo "${BUILD_STABLE:-null}" | jq '.id // null')" >> $GITHUB_OUTPUT | |
| echo "build_beta=$(echo "${BUILD_BETA:-null}" | jq '.id // null')" >> $GITHUB_OUTPUT | |
| echo "build_alpha=$(echo "${BUILD_ALPHA:-null}" | jq '.id // null')" >> $GITHUB_OUTPUT | |
| if [[ -n "$BUILD_STABLE" && "$BUILD_STABLE" != "null" ]]; then | |
| BUILD_INFO="$BUILD_STABLE" | |
| BUILD_TYPE=stable | |
| elif [[ -n "$BUILD_BETA" && "$BUILD_BETA" != "null" ]]; then | |
| BUILD_INFO="$BUILD_BETA" | |
| BUILD_TYPE=experimental | |
| else | |
| BUILD_INFO="$BUILD_ALPHA" | |
| BUILD_TYPE=experimental | |
| fi | |
| BUILD_NUMBER=$(echo "$BUILD_INFO" | jq '.id') | |
| echo build_number="${BUILD_NUMBER}" >> $GITHUB_OUTPUT | |
| echo build_type="${BUILD_TYPE}" >> $GITHUB_OUTPUT | |
| echo download_url=$(echo "$BUILD_INFO" | jq -r '.downloads."server:default".url') >> $GITHUB_OUTPUT | |
| if [[ $BUILD_TYPE == "stable" && "${{ needs.get_all_versions.outputs.latest }}" == "${{ matrix.versions }}" ]]; then | |
| echo is_latest="yes" >> $GITHUB_OUTPUT | |
| else | |
| echo is_latest="no" >> $GITHUB_OUTPUT | |
| fi | |
| if [[ $BUILD_TYPE == "experimental" ]]; then | |
| echo is_experimental="yes" >> $GITHUB_OUTPUT | |
| else | |
| echo is_experimental="no" >> $GITHUB_OUTPUT | |
| fi | |
| - name: get self build | |
| id: self_build | |
| run: | | |
| # DOCKER_IMAGE="ghcr.io/${{ github.repository_owner }}/docker-minecraft-papermc-server:${{ matrix.versions }}" | |
| DOCKER_IMAGE="docker.io/marctv/minecraft-papermc-server:${{ matrix.versions }}" | |
| docker pull $DOCKER_IMAGE || true | |
| echo self_build=$(docker inspect $DOCKER_IMAGE --format '{{ index .Config.Labels "org.mojang.minecraft.papermc.build"}}' || true) >> $GITHUB_OUTPUT | |
| - name: show output | |
| if: always() | |
| run: | | |
| echo "latest: ${{ needs.get_all_versions.outputs.latest }}" | |
| echo "version: ${{ matrix.versions }}" | |
| echo "build_stable: ${{ steps.latest_build.outputs.build_stable }}" | |
| echo "build_beta: ${{ steps.latest_build.outputs.build_beta }}" | |
| echo "build_alpha: ${{ steps.latest_build.outputs.build_alpha }}" | |
| echo "build_number: ${{ steps.latest_build.outputs.build_number }}" | |
| echo "build_type: ${{ steps.latest_build.outputs.build_type }}" | |
| echo "download_url: ${{ steps.latest_build.outputs.download_url }}" | |
| echo "is_latest: ${{ steps.latest_build.outputs.is_latest }}" | |
| echo "is_experimental: ${{ steps.latest_build.outputs.is_experimental }}" | |
| echo "self_build: ${{ steps.self_build.outputs.self_build }}" | |
| - name: Repository Dispatch | |
| uses: peter-evans/repository-dispatch@v3 | |
| if: github.event_name == 'workflow_dispatch' || steps.latest_build.outputs.build_number != steps.self_build.outputs.self_build | |
| with: | |
| event-type: build_version | |
| client-payload: '{"download_version": "${{ matrix.versions }}", "download_url": "${{ steps.latest_build.outputs.download_url }}", "is_latest": "${{ steps.latest_build.outputs.is_latest }}", "is_experimental": "${{ steps.latest_build.outputs.is_experimental }}"}' |