From f878e3f69b9f4ed4ebc6939424ef9383a1ad1d0f Mon Sep 17 00:00:00 2001 From: fithwum Date: Mon, 20 Jul 2026 07:20:10 -0700 Subject: [PATCH] remove old builds as no longer working on them --- .gitea/workflows/minecraft-build-bukkit.yml | 405 ------------------ .gitea/workflows/minecraft-build-fabric.yml | 405 ------------------ .gitea/workflows/minecraft-build-forge.yml | 405 ------------------ .../workflows/minecraft-build-neoforged.yml | 405 ------------------ .gitea/workflows/minecraft-build-quilt.yml | 405 ------------------ .gitea/workflows/minecraft-build-vanilla.yml | 405 ------------------ 6 files changed, 2430 deletions(-) delete mode 100644 .gitea/workflows/minecraft-build-bukkit.yml delete mode 100644 .gitea/workflows/minecraft-build-fabric.yml delete mode 100644 .gitea/workflows/minecraft-build-forge.yml delete mode 100644 .gitea/workflows/minecraft-build-neoforged.yml delete mode 100644 .gitea/workflows/minecraft-build-quilt.yml delete mode 100644 .gitea/workflows/minecraft-build-vanilla.yml diff --git a/.gitea/workflows/minecraft-build-bukkit.yml b/.gitea/workflows/minecraft-build-bukkit.yml deleted file mode 100644 index bef0251..0000000 --- a/.gitea/workflows/minecraft-build-bukkit.yml +++ /dev/null @@ -1,405 +0,0 @@ -name: minecraft-build-bukkit - -on: - push: - branches: - - master - paths: - - '.gitea/workflows/minecraft-build-bukkit.yml' - - 'bukkit/Dockerfile' - - 'bukkit/*.sh' - - '!.cache/*' - - '!bukkit/CHANGES.md' - - '!bukkit/build-info.json' - schedule: - - cron: '30 21 * * 0' - -env: - IMAGE_REGISTRY: gitea.fithwum.tech - IMAGE_ORG: fithwum - IMAGE_REPO_DEBIAN: debian-base - IMAGE_REPO_MINECRAFT: minecraft - IMAGE_TAG_DEBIAN: bookworm - DIGEST_FILE: .cache/debian-base.digest - VERSIONS: bukkit - -jobs: - docker-prune: - name: Docker prune (${{ matrix.runner }}) - runs-on: ${{ matrix.runner }} - strategy: - fail-fast: false - matrix: - runner: - - vm-docker-build2 - steps: - - name: Prune unused Docker images - run: | - echo "[INFO] Pruning Docker images on ${{ matrix.runner }}..." - docker image prune -a -f || true - - poll-debian-base-and-detect-changes: - runs-on: vm-docker-build2 - needs: docker-prune - outputs: - digest_changed: ${{ steps.compare_digest.outputs.changed }} - versions_changed: ${{ steps.check_changed_versions.outputs.versions_changed }} - new_versions: ${{ steps.check_new_versions.outputs.new_versions }} - steps: - - name: Checkout repo - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Ensure .cache exists - run: mkdir -p .cache && touch .cache/.gitkeep - - - name: Log in to Gitea Registry - run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login gitea.fithwum.tech -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin - - - name: Get current digest of debian-base image - id: get_digest - run: | - IMAGE="${{ env.IMAGE_REGISTRY }}/${{ env.IMAGE_ORG }}/${{ env.IMAGE_REPO_DEBIAN }}:${{ env.IMAGE_TAG_DEBIAN }}" - docker pull "$IMAGE" > /dev/null - DIGEST=$(docker inspect --format='{{index .RepoDigests 0}}' "$IMAGE") - echo "digest=$DIGEST" >> $GITHUB_OUTPUT - echo "$DIGEST" > .cache/debian-base.digest.new - - - name: Compare with stored digest - id: compare_digest - run: | - CURRENT_DIGEST="${{ steps.get_digest.outputs.digest }}" - LAST_DIGEST="$(cat ${{ env.DIGEST_FILE }} 2>/dev/null || echo '')" - - if [ "$CURRENT_DIGEST" = "$LAST_DIGEST" ]; then - echo "[INFO] Digest unchanged" - echo "changed=false" >> $GITHUB_OUTPUT - exit 0 - fi - - echo "[INFO] Digest changed → updating cache" - echo "$CURRENT_DIGEST" > ${{ env.DIGEST_FILE }} - - git config user.name "${{ secrets.GIT_USERNAME }}" - git config user.email "${{ secrets.GIT_EMAIL }}" - - git add ${{ env.DIGEST_FILE }} - git commit -m "Update base digest to $CURRENT_DIGEST" || true - - # --- Safe rebase with auto conflict resolution --- - git fetch origin master - if ! git rebase --strategy-option=theirs origin/master; then - echo "[WARN] Rebase conflict, auto-resolving by preferring local digest" - git rebase --abort - git fetch origin master - git reset --hard origin/master - echo "$CURRENT_DIGEST" > ${{ env.DIGEST_FILE }} - git add ${{ env.DIGEST_FILE }} - git commit -m "Force-update base digest to $CURRENT_DIGEST (auto-resolved)" - fi - - git push origin HEAD:master - echo "changed=true" >> $GITHUB_OUTPUT - - - name: Detect changed Minecraft versions - id: check_changed_versions - run: | - BEFORE_COMMIT="${{ github.event.before }}" - if [ -z "$BEFORE_COMMIT" ] || ! git cat-file -e "$BEFORE_COMMIT^{commit}" 2>/dev/null; then - BEFORE_COMMIT=$(git rev-parse HEAD~1) - fi - CHANGED=$(git diff --name-only "$BEFORE_COMMIT" HEAD || true) - CHANGED_VERSIONS="" - for version in $VERSIONS; do - echo "$CHANGED" | grep -q "^$version/.*\.\(sh\|Dockerfile\)$" && CHANGED_VERSIONS="$CHANGED_VERSIONS $version" - done - CHANGED_VERSIONS=$(echo "$CHANGED_VERSIONS" | xargs) # trim whitespace - echo "versions_changed=$CHANGED_VERSIONS" >> $GITHUB_OUTPUT - - - name: Detect Minecraft versions without build-info - id: check_new_versions - run: | - NEW_VERSIONS="" - GIT_CREDENTIAL="${{ secrets.GIT_TOKEN || secrets.GIT_PASSWORD }}" - git clone --depth=1 "https://${{ secrets.GIT_USERNAME }}:${GIT_CREDENTIAL}@gitea.fithwum.tech/fithwum/minecraft.git" upload-repo - - for version in $VERSIONS; do - if [ ! -f "upload-repo/$version/build-info.json" ]; then - echo "[INFO] No build-info.json for $version → treating as new" - NEW_VERSIONS="$NEW_VERSIONS $version" - fi - done - - echo "new_versions=$NEW_VERSIONS" >> $GITHUB_OUTPUT - - build-minecraft-images: - runs-on: vm-docker-build2 - needs: - - docker-prune - - poll-debian-base-and-detect-changes - if: | - needs.poll-debian-base-and-detect-changes.outputs.digest_changed == 'true' || - needs.poll-debian-base-and-detect-changes.outputs.versions_changed != '' || - needs.poll-debian-base-and-detect-changes.outputs.new_versions != '' - strategy: - matrix: - version: [bukkit] - name: Build and Push ${{ matrix.version }} - steps: - - name: Checkout repo - uses: actions/checkout@v3 - - - name: Log in to Gitea Registry - run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login gitea.fithwum.tech -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin - - - name: Clone Minecraft repo (with retries) - run: | - GIT_CREDENTIAL="${{ secrets.GIT_TOKEN || secrets.GIT_PASSWORD }}" - for i in {1..5}; do - git clone "https://${{ secrets.GIT_USERNAME }}:${GIT_CREDENTIAL}@gitea.fithwum.tech/fithwum/minecraft.git" upload-repo && break - echo "[WARN] Clone attempt $i failed. Retrying in 10s..." - sleep 10 - done - if [ ! -d upload-repo ]; then - echo "[ERROR] Failed to clone Minecraft repo after retries." - exit 1 - fi - - - name: Build and push image - run: | - IMAGE="$IMAGE_REGISTRY/$IMAGE_ORG/$IMAGE_REPO_MINECRAFT:${{ matrix.version }}" - docker buildx build --platform linux/amd64 --push -t "$IMAGE" "./${{ matrix.version }}" - - generate-changelogs: - needs: build-minecraft-images - runs-on: vm-docker-build2 - steps: - - name: Checkout repo - uses: actions/checkout@v3 - - - name: Create temporary changelog workspace - run: mkdir -p changelogs - - - name: Clone Minecraft repo - run: | - GIT_CREDENTIAL="${{ secrets.GIT_TOKEN || secrets.GIT_PASSWORD }}" - git clone --depth=3 "https://${{ secrets.GIT_USERNAME }}:${GIT_CREDENTIAL}@gitea.fithwum.tech/fithwum/minecraft.git" upload-repo - - - name: Generate changelogs - run: | - for version in $VERSIONS; do - echo "[INFO] Generating changelog for $version" - changelog="changelogs/$version/CHANGES.md" - mkdir -p "$(dirname "$changelog")" - touch "$changelog" - - cd upload-repo - infofile="$version/build-info.json" - last_commit="" - if [ -f "$infofile" ]; then - last_commit=$(jq -r '.commit' "$infofile") - fi - - echo -e "## $(date -u +'%Y-%m-%dT%H:%M:%SZ')\n" > "../$changelog" - if [ -n "$last_commit" ]; then - COMMITS=$(git log "${last_commit}..HEAD" --pretty=format:"- %s (%an)" || true) - fi - if [ -z "$COMMITS" ]; then - echo "[INFO] No new commits since last build. Showing latest 5 instead." - COMMITS=$(git log -n 5 --pretty=format:"- %s (%an)" || true) - fi - echo "$COMMITS" >> "../$changelog" - cd .. - done - - - name: Copy changelogs into repo - run: | - for version in $VERSIONS; do - mkdir -p upload-repo/$version - cp changelogs/$version/CHANGES.md upload-repo/$version/ - done - - - name: Commit and push changelogs (temp branch) - run: | - cd upload-repo - - git config user.name "${{ secrets.GIT_USERNAME }}" - git config user.email "${{ secrets.GIT_EMAIL }}" - - TEMP_BRANCH="tmp-changelog-$(date +%s)" - - # Create temporary branch - git checkout -b "$TEMP_BRANCH" - - # Stage changes - git add */CHANGES.md - - # Nothing changed? - if git diff --cached --quiet; then - echo "[INFO] No changelog changes." - exit 0 - fi - - git commit -m "Update changelogs on $(date -u +'%Y-%m-%dT%H:%M:%SZ') [skip ci]" - - # Push temporary branch - git push origin HEAD:$TEMP_BRANCH - - # Rebase temp branch onto latest master - git fetch origin master - - git checkout "$TEMP_BRANCH" - - if ! git rebase origin/master; then - echo "[WARN] Rebase failed, using merge instead." - git rebase --abort || true - git merge origin/master --no-edit - fi - - git push origin HEAD:$TEMP_BRANCH --force - - # Fast-forward master - git checkout master - git reset --hard origin/master - - git merge --no-ff "$TEMP_BRANCH" \ - -m "Merge changelog updates" - - git push origin master - - git push origin --delete "$TEMP_BRANCH" || true - - generate-build-info: - needs: generate-changelogs - runs-on: vm-docker-build2 - steps: - - name: Checkout repo - uses: actions/checkout@v3 - - - name: Prepare temporary build-info workspace - run: mkdir -p buildinfo - - - name: Clone Minecraft repo - run: | - GIT_CREDENTIAL="${{ secrets.GIT_TOKEN || secrets.GIT_PASSWORD }}" - git clone --depth=1 "https://${{ secrets.GIT_USERNAME }}:${GIT_CREDENTIAL}@gitea.fithwum.tech/fithwum/minecraft.git" upload-repo - - - name: Generate build-info files - run: | - human_size() { - local b=$1 d='' s=0 S=(B KB MB GB TB) - while ((b >= 1024 && s < ${#S[@]}-1)); do - d=$((b % 1024)); b=$((b / 1024)); s=$((s + 1)) - done - printf "%s%s\n" "$b" "${S[$s]}" - } - - for version in $VERSIONS; do - echo "[INFO] Generating build-info.json for $version" - image="${IMAGE_REGISTRY}/${IMAGE_ORG}/${IMAGE_REPO_MINECRAFT}:$version" - infofile="buildinfo/$version/build-info.json" - mkdir -p "$(dirname "$infofile")" - - if ! docker pull "$image"; then - echo "[WARN] Failed to pull $image — setting fields to unknown/0" - digest="unknown" - size_bytes=0 - else - digest=$(docker inspect --format='{{if .RepoDigests}}{{index .RepoDigests 0}}{{else}}unknown{{end}}' "$image" 2>/dev/null || echo "unknown") - size_bytes=$(docker image inspect "$image" --format='{{.Size}}' 2>/dev/null || echo "0") - size_bytes=${size_bytes//[^0-9]/} - if [[ -z "$size_bytes" ]]; then size_bytes=0; fi - fi - - size_human=$(human_size "$size_bytes") - - cd upload-repo - commit=$(git rev-parse HEAD) - cd .. - - jq -n \ - --arg version "$version" \ - --arg commit "$commit" \ - --arg build_time "$(date -u +'%Y-%m-%dT%H:%M:%SZ')" \ - --arg image_tag "$image" \ - --arg digest "$digest" \ - --arg image_size "$size_human" \ - --argjson image_size_bytes "$size_bytes" \ - '{ - version: $version, - commit: $commit, - build_time: $build_time, - image_tag: $image_tag, - digest: $digest, - image_size: $image_size, - image_size_bytes: $image_size_bytes - }' > "$infofile" - done - - - name: Copy build-info.json into repo - run: | - for version in $VERSIONS; do - mkdir -p upload-repo/$version - cp "buildinfo/$version/build-info.json" "upload-repo/$version/" - done - - - name: Commit and push build-info (temp branch) - run: | - cd upload-repo - - git config user.name "${{ secrets.GIT_USERNAME }}" - git config user.email "${{ secrets.GIT_EMAIL }}" - - TEMP_BRANCH="tmp-buildinfo-$(date +%s)" - - # Create temporary branch - git checkout -b "$TEMP_BRANCH" - - # Stage changes - git add */build-info.json - - # Nothing changed? - if git diff --cached --quiet; then - echo "[INFO] No build-info changes." - exit 0 - fi - - git commit -m "Update build-info on $(date -u +'%Y-%m-%dT%H:%M:%SZ') [skip ci]" - - # Push temporary branch - git push origin HEAD:$TEMP_BRANCH - - # Rebase temp branch onto latest master - git fetch origin master - - git checkout "$TEMP_BRANCH" - - if ! git rebase origin/master; then - echo "[WARN] Rebase failed, using merge instead." - git rebase --abort || true - git merge origin/master --no-edit - fi - - git push origin HEAD:$TEMP_BRANCH --force - - # Merge into master - git checkout master - git reset --hard origin/master - - git merge --no-ff "$TEMP_BRANCH" \ - -m "Merge build-info updates" - - git push origin master - - git push origin --delete "$TEMP_BRANCH" || true - - for version in $VERSIONS; do - TAG="build-$version" - - git tag -d "$TAG" 2>/dev/null || true - git push origin ":refs/tags/$TAG" 2>/dev/null || true - - git tag "$TAG" - git push origin "$TAG" --force - done diff --git a/.gitea/workflows/minecraft-build-fabric.yml b/.gitea/workflows/minecraft-build-fabric.yml deleted file mode 100644 index ff0332d..0000000 --- a/.gitea/workflows/minecraft-build-fabric.yml +++ /dev/null @@ -1,405 +0,0 @@ -name: minecraft-build-fabric - -on: - push: - branches: - - master - paths: - - '.gitea/workflows/minecraft-build-fabric.yml' - - 'fabric/Dockerfile' - - 'fabric/*.sh' - - '!.cache/*' - - '!fabric/CHANGES.md' - - '!fabric/build-info.json' - schedule: - - cron: '30 21 * * 0' - -env: - IMAGE_REGISTRY: gitea.fithwum.tech - IMAGE_ORG: fithwum - IMAGE_REPO_DEBIAN: debian-base - IMAGE_REPO_MINECRAFT: minecraft - IMAGE_TAG_DEBIAN: bookworm - DIGEST_FILE: .cache/debian-base.digest - VERSIONS: fabric - -jobs: - docker-prune: - name: Docker prune (${{ matrix.runner }}) - runs-on: ${{ matrix.runner }} - strategy: - fail-fast: false - matrix: - runner: - - vm-docker-build2 - steps: - - name: Prune unused Docker images - run: | - echo "[INFO] Pruning Docker images on ${{ matrix.runner }}..." - docker image prune -a -f || true - - poll-debian-base-and-detect-changes: - runs-on: vm-docker-build2 - needs: docker-prune - outputs: - digest_changed: ${{ steps.compare_digest.outputs.changed }} - versions_changed: ${{ steps.check_changed_versions.outputs.versions_changed }} - new_versions: ${{ steps.check_new_versions.outputs.new_versions }} - steps: - - name: Checkout repo - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Ensure .cache exists - run: mkdir -p .cache && touch .cache/.gitkeep - - - name: Log in to Gitea Registry - run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login gitea.fithwum.tech -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin - - - name: Get current digest of debian-base image - id: get_digest - run: | - IMAGE="${{ env.IMAGE_REGISTRY }}/${{ env.IMAGE_ORG }}/${{ env.IMAGE_REPO_DEBIAN }}:${{ env.IMAGE_TAG_DEBIAN }}" - docker pull "$IMAGE" > /dev/null - DIGEST=$(docker inspect --format='{{index .RepoDigests 0}}' "$IMAGE") - echo "digest=$DIGEST" >> $GITHUB_OUTPUT - echo "$DIGEST" > .cache/debian-base.digest.new - - - name: Compare with stored digest - id: compare_digest - run: | - CURRENT_DIGEST="${{ steps.get_digest.outputs.digest }}" - LAST_DIGEST="$(cat ${{ env.DIGEST_FILE }} 2>/dev/null || echo '')" - - if [ "$CURRENT_DIGEST" = "$LAST_DIGEST" ]; then - echo "[INFO] Digest unchanged" - echo "changed=false" >> $GITHUB_OUTPUT - exit 0 - fi - - echo "[INFO] Digest changed → updating cache" - echo "$CURRENT_DIGEST" > ${{ env.DIGEST_FILE }} - - git config user.name "${{ secrets.GIT_USERNAME }}" - git config user.email "${{ secrets.GIT_EMAIL }}" - - git add ${{ env.DIGEST_FILE }} - git commit -m "Update base digest to $CURRENT_DIGEST" || true - - # --- Safe rebase with auto conflict resolution --- - git fetch origin master - if ! git rebase --strategy-option=theirs origin/master; then - echo "[WARN] Rebase conflict, auto-resolving by preferring local digest" - git rebase --abort - git fetch origin master - git reset --hard origin/master - echo "$CURRENT_DIGEST" > ${{ env.DIGEST_FILE }} - git add ${{ env.DIGEST_FILE }} - git commit -m "Force-update base digest to $CURRENT_DIGEST (auto-resolved)" - fi - - git push origin HEAD:master - echo "changed=true" >> $GITHUB_OUTPUT - - - name: Detect changed Minecraft versions - id: check_changed_versions - run: | - BEFORE_COMMIT="${{ github.event.before }}" - if [ -z "$BEFORE_COMMIT" ] || ! git cat-file -e "$BEFORE_COMMIT^{commit}" 2>/dev/null; then - BEFORE_COMMIT=$(git rev-parse HEAD~1) - fi - CHANGED=$(git diff --name-only "$BEFORE_COMMIT" HEAD || true) - CHANGED_VERSIONS="" - for version in $VERSIONS; do - echo "$CHANGED" | grep -q "^$version/.*\.\(sh\|Dockerfile\)$" && CHANGED_VERSIONS="$CHANGED_VERSIONS $version" - done - CHANGED_VERSIONS=$(echo "$CHANGED_VERSIONS" | xargs) # trim whitespace - echo "versions_changed=$CHANGED_VERSIONS" >> $GITHUB_OUTPUT - - - name: Detect Minecraft versions without build-info - id: check_new_versions - run: | - NEW_VERSIONS="" - GIT_CREDENTIAL="${{ secrets.GIT_TOKEN || secrets.GIT_PASSWORD }}" - git clone --depth=1 "https://${{ secrets.GIT_USERNAME }}:${GIT_CREDENTIAL}@gitea.fithwum.tech/fithwum/minecraft.git" upload-repo - - for version in $VERSIONS; do - if [ ! -f "upload-repo/$version/build-info.json" ]; then - echo "[INFO] No build-info.json for $version → treating as new" - NEW_VERSIONS="$NEW_VERSIONS $version" - fi - done - - echo "new_versions=$NEW_VERSIONS" >> $GITHUB_OUTPUT - - build-minecraft-images: - runs-on: vm-docker-build2 - needs: - - docker-prune - - poll-debian-base-and-detect-changes - if: | - needs.poll-debian-base-and-detect-changes.outputs.digest_changed == 'true' || - needs.poll-debian-base-and-detect-changes.outputs.versions_changed != '' || - needs.poll-debian-base-and-detect-changes.outputs.new_versions != '' - strategy: - matrix: - version: [fabric] - name: Build and Push ${{ matrix.version }} - steps: - - name: Checkout repo - uses: actions/checkout@v3 - - - name: Log in to Gitea Registry - run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login gitea.fithwum.tech -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin - - - name: Clone Minecraft repo (with retries) - run: | - GIT_CREDENTIAL="${{ secrets.GIT_TOKEN || secrets.GIT_PASSWORD }}" - for i in {1..5}; do - git clone "https://${{ secrets.GIT_USERNAME }}:${GIT_CREDENTIAL}@gitea.fithwum.tech/fithwum/minecraft.git" upload-repo && break - echo "[WARN] Clone attempt $i failed. Retrying in 10s..." - sleep 10 - done - if [ ! -d upload-repo ]; then - echo "[ERROR] Failed to clone Minecraft repo after retries." - exit 1 - fi - - - name: Build and push image - run: | - IMAGE="$IMAGE_REGISTRY/$IMAGE_ORG/$IMAGE_REPO_MINECRAFT:${{ matrix.version }}" - docker buildx build --platform linux/amd64 --push -t "$IMAGE" "./${{ matrix.version }}" - - generate-changelogs: - needs: build-minecraft-images - runs-on: vm-docker-build2 - steps: - - name: Checkout repo - uses: actions/checkout@v3 - - - name: Create temporary changelog workspace - run: mkdir -p changelogs - - - name: Clone Minecraft repo - run: | - GIT_CREDENTIAL="${{ secrets.GIT_TOKEN || secrets.GIT_PASSWORD }}" - git clone --depth=3 "https://${{ secrets.GIT_USERNAME }}:${GIT_CREDENTIAL}@gitea.fithwum.tech/fithwum/minecraft.git" upload-repo - - - name: Generate changelogs - run: | - for version in $VERSIONS; do - echo "[INFO] Generating changelog for $version" - changelog="changelogs/$version/CHANGES.md" - mkdir -p "$(dirname "$changelog")" - touch "$changelog" - - cd upload-repo - infofile="$version/build-info.json" - last_commit="" - if [ -f "$infofile" ]; then - last_commit=$(jq -r '.commit' "$infofile") - fi - - echo -e "## $(date -u +'%Y-%m-%dT%H:%M:%SZ')\n" > "../$changelog" - if [ -n "$last_commit" ]; then - COMMITS=$(git log "${last_commit}..HEAD" --pretty=format:"- %s (%an)" || true) - fi - if [ -z "$COMMITS" ]; then - echo "[INFO] No new commits since last build. Showing latest 5 instead." - COMMITS=$(git log -n 5 --pretty=format:"- %s (%an)" || true) - fi - echo "$COMMITS" >> "../$changelog" - cd .. - done - - - name: Copy changelogs into repo - run: | - for version in $VERSIONS; do - mkdir -p upload-repo/$version - cp changelogs/$version/CHANGES.md upload-repo/$version/ - done - - - name: Commit and push changelogs (temp branch) - run: | - cd upload-repo - - git config user.name "${{ secrets.GIT_USERNAME }}" - git config user.email "${{ secrets.GIT_EMAIL }}" - - TEMP_BRANCH="tmp-changelog-$(date +%s)" - - # Create temporary branch - git checkout -b "$TEMP_BRANCH" - - # Stage changes - git add */CHANGES.md - - # Nothing changed? - if git diff --cached --quiet; then - echo "[INFO] No changelog changes." - exit 0 - fi - - git commit -m "Update changelogs on $(date -u +'%Y-%m-%dT%H:%M:%SZ') [skip ci]" - - # Push temporary branch - git push origin HEAD:$TEMP_BRANCH - - # Rebase temp branch onto latest master - git fetch origin master - - git checkout "$TEMP_BRANCH" - - if ! git rebase origin/master; then - echo "[WARN] Rebase failed, using merge instead." - git rebase --abort || true - git merge origin/master --no-edit - fi - - git push origin HEAD:$TEMP_BRANCH --force - - # Fast-forward master - git checkout master - git reset --hard origin/master - - git merge --no-ff "$TEMP_BRANCH" \ - -m "Merge changelog updates" - - git push origin master - - git push origin --delete "$TEMP_BRANCH" || true - - generate-build-info: - needs: generate-changelogs - runs-on: vm-docker-build2 - steps: - - name: Checkout repo - uses: actions/checkout@v3 - - - name: Prepare temporary build-info workspace - run: mkdir -p buildinfo - - - name: Clone Minecraft repo - run: | - GIT_CREDENTIAL="${{ secrets.GIT_TOKEN || secrets.GIT_PASSWORD }}" - git clone --depth=1 "https://${{ secrets.GIT_USERNAME }}:${GIT_CREDENTIAL}@gitea.fithwum.tech/fithwum/minecraft.git" upload-repo - - - name: Generate build-info files - run: | - human_size() { - local b=$1 d='' s=0 S=(B KB MB GB TB) - while ((b >= 1024 && s < ${#S[@]}-1)); do - d=$((b % 1024)); b=$((b / 1024)); s=$((s + 1)) - done - printf "%s%s\n" "$b" "${S[$s]}" - } - - for version in $VERSIONS; do - echo "[INFO] Generating build-info.json for $version" - image="${IMAGE_REGISTRY}/${IMAGE_ORG}/${IMAGE_REPO_MINECRAFT}:$version" - infofile="buildinfo/$version/build-info.json" - mkdir -p "$(dirname "$infofile")" - - if ! docker pull "$image"; then - echo "[WARN] Failed to pull $image — setting fields to unknown/0" - digest="unknown" - size_bytes=0 - else - digest=$(docker inspect --format='{{if .RepoDigests}}{{index .RepoDigests 0}}{{else}}unknown{{end}}' "$image" 2>/dev/null || echo "unknown") - size_bytes=$(docker image inspect "$image" --format='{{.Size}}' 2>/dev/null || echo "0") - size_bytes=${size_bytes//[^0-9]/} - if [[ -z "$size_bytes" ]]; then size_bytes=0; fi - fi - - size_human=$(human_size "$size_bytes") - - cd upload-repo - commit=$(git rev-parse HEAD) - cd .. - - jq -n \ - --arg version "$version" \ - --arg commit "$commit" \ - --arg build_time "$(date -u +'%Y-%m-%dT%H:%M:%SZ')" \ - --arg image_tag "$image" \ - --arg digest "$digest" \ - --arg image_size "$size_human" \ - --argjson image_size_bytes "$size_bytes" \ - '{ - version: $version, - commit: $commit, - build_time: $build_time, - image_tag: $image_tag, - digest: $digest, - image_size: $image_size, - image_size_bytes: $image_size_bytes - }' > "$infofile" - done - - - name: Copy build-info.json into repo - run: | - for version in $VERSIONS; do - mkdir -p upload-repo/$version - cp "buildinfo/$version/build-info.json" "upload-repo/$version/" - done - - - name: Commit and push build-info (temp branch) - run: | - cd upload-repo - - git config user.name "${{ secrets.GIT_USERNAME }}" - git config user.email "${{ secrets.GIT_EMAIL }}" - - TEMP_BRANCH="tmp-buildinfo-$(date +%s)" - - # Create temporary branch - git checkout -b "$TEMP_BRANCH" - - # Stage changes - git add */build-info.json - - # Nothing changed? - if git diff --cached --quiet; then - echo "[INFO] No build-info changes." - exit 0 - fi - - git commit -m "Update build-info on $(date -u +'%Y-%m-%dT%H:%M:%SZ') [skip ci]" - - # Push temporary branch - git push origin HEAD:$TEMP_BRANCH - - # Rebase temp branch onto latest master - git fetch origin master - - git checkout "$TEMP_BRANCH" - - if ! git rebase origin/master; then - echo "[WARN] Rebase failed, using merge instead." - git rebase --abort || true - git merge origin/master --no-edit - fi - - git push origin HEAD:$TEMP_BRANCH --force - - # Merge into master - git checkout master - git reset --hard origin/master - - git merge --no-ff "$TEMP_BRANCH" \ - -m "Merge build-info updates" - - git push origin master - - git push origin --delete "$TEMP_BRANCH" || true - - for version in $VERSIONS; do - TAG="build-$version" - - git tag -d "$TAG" 2>/dev/null || true - git push origin ":refs/tags/$TAG" 2>/dev/null || true - - git tag "$TAG" - git push origin "$TAG" --force - done \ No newline at end of file diff --git a/.gitea/workflows/minecraft-build-forge.yml b/.gitea/workflows/minecraft-build-forge.yml deleted file mode 100644 index 75cd3c6..0000000 --- a/.gitea/workflows/minecraft-build-forge.yml +++ /dev/null @@ -1,405 +0,0 @@ -name: minecraft-build-forge - -on: - push: - branches: - - master - paths: - - '.gitea/workflows/minecraft-build-forge.yml' - - 'forge/Dockerfile' - - 'forge/*.sh' - - '!.cache/*' - - '!forge/CHANGES.md' - - '!forge/build-info.json' - schedule: - - cron: '30 21 * * 0' - -env: - IMAGE_REGISTRY: gitea.fithwum.tech - IMAGE_ORG: fithwum - IMAGE_REPO_DEBIAN: debian-base - IMAGE_REPO_MINECRAFT: minecraft - IMAGE_TAG_DEBIAN: bookworm - DIGEST_FILE: .cache/debian-base.digest - VERSIONS: forge - -jobs: - docker-prune: - name: Docker prune (${{ matrix.runner }}) - runs-on: ${{ matrix.runner }} - strategy: - fail-fast: false - matrix: - runner: - - vm-docker-build2 - steps: - - name: Prune unused Docker images - run: | - echo "[INFO] Pruning Docker images on ${{ matrix.runner }}..." - docker image prune -a -f || true - - poll-debian-base-and-detect-changes: - runs-on: vm-docker-build2 - needs: docker-prune - outputs: - digest_changed: ${{ steps.compare_digest.outputs.changed }} - versions_changed: ${{ steps.check_changed_versions.outputs.versions_changed }} - new_versions: ${{ steps.check_new_versions.outputs.new_versions }} - steps: - - name: Checkout repo - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Ensure .cache exists - run: mkdir -p .cache && touch .cache/.gitkeep - - - name: Log in to Gitea Registry - run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login gitea.fithwum.tech -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin - - - name: Get current digest of debian-base image - id: get_digest - run: | - IMAGE="${{ env.IMAGE_REGISTRY }}/${{ env.IMAGE_ORG }}/${{ env.IMAGE_REPO_DEBIAN }}:${{ env.IMAGE_TAG_DEBIAN }}" - docker pull "$IMAGE" > /dev/null - DIGEST=$(docker inspect --format='{{index .RepoDigests 0}}' "$IMAGE") - echo "digest=$DIGEST" >> $GITHUB_OUTPUT - echo "$DIGEST" > .cache/debian-base.digest.new - - - name: Compare with stored digest - id: compare_digest - run: | - CURRENT_DIGEST="${{ steps.get_digest.outputs.digest }}" - LAST_DIGEST="$(cat ${{ env.DIGEST_FILE }} 2>/dev/null || echo '')" - - if [ "$CURRENT_DIGEST" = "$LAST_DIGEST" ]; then - echo "[INFO] Digest unchanged" - echo "changed=false" >> $GITHUB_OUTPUT - exit 0 - fi - - echo "[INFO] Digest changed → updating cache" - echo "$CURRENT_DIGEST" > ${{ env.DIGEST_FILE }} - - git config user.name "${{ secrets.GIT_USERNAME }}" - git config user.email "${{ secrets.GIT_EMAIL }}" - - git add ${{ env.DIGEST_FILE }} - git commit -m "Update base digest to $CURRENT_DIGEST" || true - - # --- Safe rebase with auto conflict resolution --- - git fetch origin master - if ! git rebase --strategy-option=theirs origin/master; then - echo "[WARN] Rebase conflict, auto-resolving by preferring local digest" - git rebase --abort - git fetch origin master - git reset --hard origin/master - echo "$CURRENT_DIGEST" > ${{ env.DIGEST_FILE }} - git add ${{ env.DIGEST_FILE }} - git commit -m "Force-update base digest to $CURRENT_DIGEST (auto-resolved)" - fi - - git push origin HEAD:master - echo "changed=true" >> $GITHUB_OUTPUT - - - name: Detect changed Minecraft versions - id: check_changed_versions - run: | - BEFORE_COMMIT="${{ github.event.before }}" - if [ -z "$BEFORE_COMMIT" ] || ! git cat-file -e "$BEFORE_COMMIT^{commit}" 2>/dev/null; then - BEFORE_COMMIT=$(git rev-parse HEAD~1) - fi - CHANGED=$(git diff --name-only "$BEFORE_COMMIT" HEAD || true) - CHANGED_VERSIONS="" - for version in $VERSIONS; do - echo "$CHANGED" | grep -q "^$version/.*\.\(sh\|Dockerfile\)$" && CHANGED_VERSIONS="$CHANGED_VERSIONS $version" - done - CHANGED_VERSIONS=$(echo "$CHANGED_VERSIONS" | xargs) # trim whitespace - echo "versions_changed=$CHANGED_VERSIONS" >> $GITHUB_OUTPUT - - - name: Detect Minecraft versions without build-info - id: check_new_versions - run: | - NEW_VERSIONS="" - GIT_CREDENTIAL="${{ secrets.GIT_TOKEN || secrets.GIT_PASSWORD }}" - git clone --depth=1 "https://${{ secrets.GIT_USERNAME }}:${GIT_CREDENTIAL}@gitea.fithwum.tech/fithwum/minecraft.git" upload-repo - - for version in $VERSIONS; do - if [ ! -f "upload-repo/$version/build-info.json" ]; then - echo "[INFO] No build-info.json for $version → treating as new" - NEW_VERSIONS="$NEW_VERSIONS $version" - fi - done - - echo "new_versions=$NEW_VERSIONS" >> $GITHUB_OUTPUT - - build-minecraft-images: - runs-on: vm-docker-build2 - needs: - - docker-prune - - poll-debian-base-and-detect-changes - if: | - needs.poll-debian-base-and-detect-changes.outputs.digest_changed == 'true' || - needs.poll-debian-base-and-detect-changes.outputs.versions_changed != '' || - needs.poll-debian-base-and-detect-changes.outputs.new_versions != '' - strategy: - matrix: - version: [forge] - name: Build and Push ${{ matrix.version }} - steps: - - name: Checkout repo - uses: actions/checkout@v3 - - - name: Log in to Gitea Registry - run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login gitea.fithwum.tech -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin - - - name: Clone Minecraft repo (with retries) - run: | - GIT_CREDENTIAL="${{ secrets.GIT_TOKEN || secrets.GIT_PASSWORD }}" - for i in {1..5}; do - git clone "https://${{ secrets.GIT_USERNAME }}:${GIT_CREDENTIAL}@gitea.fithwum.tech/fithwum/minecraft.git" upload-repo && break - echo "[WARN] Clone attempt $i failed. Retrying in 10s..." - sleep 10 - done - if [ ! -d upload-repo ]; then - echo "[ERROR] Failed to clone Minecraft repo after retries." - exit 1 - fi - - - name: Build and push image - run: | - IMAGE="$IMAGE_REGISTRY/$IMAGE_ORG/$IMAGE_REPO_MINECRAFT:${{ matrix.version }}" - docker buildx build --platform linux/amd64 --push -t "$IMAGE" "./${{ matrix.version }}" - - generate-changelogs: - needs: build-minecraft-images - runs-on: vm-docker-build2 - steps: - - name: Checkout repo - uses: actions/checkout@v3 - - - name: Create temporary changelog workspace - run: mkdir -p changelogs - - - name: Clone Minecraft repo - run: | - GIT_CREDENTIAL="${{ secrets.GIT_TOKEN || secrets.GIT_PASSWORD }}" - git clone --depth=3 "https://${{ secrets.GIT_USERNAME }}:${GIT_CREDENTIAL}@gitea.fithwum.tech/fithwum/minecraft.git" upload-repo - - - name: Generate changelogs - run: | - for version in $VERSIONS; do - echo "[INFO] Generating changelog for $version" - changelog="changelogs/$version/CHANGES.md" - mkdir -p "$(dirname "$changelog")" - touch "$changelog" - - cd upload-repo - infofile="$version/build-info.json" - last_commit="" - if [ -f "$infofile" ]; then - last_commit=$(jq -r '.commit' "$infofile") - fi - - echo -e "## $(date -u +'%Y-%m-%dT%H:%M:%SZ')\n" > "../$changelog" - if [ -n "$last_commit" ]; then - COMMITS=$(git log "${last_commit}..HEAD" --pretty=format:"- %s (%an)" || true) - fi - if [ -z "$COMMITS" ]; then - echo "[INFO] No new commits since last build. Showing latest 5 instead." - COMMITS=$(git log -n 5 --pretty=format:"- %s (%an)" || true) - fi - echo "$COMMITS" >> "../$changelog" - cd .. - done - - - name: Copy changelogs into repo - run: | - for version in $VERSIONS; do - mkdir -p upload-repo/$version - cp changelogs/$version/CHANGES.md upload-repo/$version/ - done - - - name: Commit and push changelogs (temp branch) - run: | - cd upload-repo - - git config user.name "${{ secrets.GIT_USERNAME }}" - git config user.email "${{ secrets.GIT_EMAIL }}" - - TEMP_BRANCH="tmp-changelog-$(date +%s)" - - # Create temporary branch - git checkout -b "$TEMP_BRANCH" - - # Stage changes - git add */CHANGES.md - - # Nothing changed? - if git diff --cached --quiet; then - echo "[INFO] No changelog changes." - exit 0 - fi - - git commit -m "Update changelogs on $(date -u +'%Y-%m-%dT%H:%M:%SZ') [skip ci]" - - # Push temporary branch - git push origin HEAD:$TEMP_BRANCH - - # Rebase temp branch onto latest master - git fetch origin master - - git checkout "$TEMP_BRANCH" - - if ! git rebase origin/master; then - echo "[WARN] Rebase failed, using merge instead." - git rebase --abort || true - git merge origin/master --no-edit - fi - - git push origin HEAD:$TEMP_BRANCH --force - - # Fast-forward master - git checkout master - git reset --hard origin/master - - git merge --no-ff "$TEMP_BRANCH" \ - -m "Merge changelog updates" - - git push origin master - - git push origin --delete "$TEMP_BRANCH" || true - - generate-build-info: - needs: generate-changelogs - runs-on: vm-docker-build2 - steps: - - name: Checkout repo - uses: actions/checkout@v3 - - - name: Prepare temporary build-info workspace - run: mkdir -p buildinfo - - - name: Clone Minecraft repo - run: | - GIT_CREDENTIAL="${{ secrets.GIT_TOKEN || secrets.GIT_PASSWORD }}" - git clone --depth=1 "https://${{ secrets.GIT_USERNAME }}:${GIT_CREDENTIAL}@gitea.fithwum.tech/fithwum/minecraft.git" upload-repo - - - name: Generate build-info files - run: | - human_size() { - local b=$1 d='' s=0 S=(B KB MB GB TB) - while ((b >= 1024 && s < ${#S[@]}-1)); do - d=$((b % 1024)); b=$((b / 1024)); s=$((s + 1)) - done - printf "%s%s\n" "$b" "${S[$s]}" - } - - for version in $VERSIONS; do - echo "[INFO] Generating build-info.json for $version" - image="${IMAGE_REGISTRY}/${IMAGE_ORG}/${IMAGE_REPO_MINECRAFT}:$version" - infofile="buildinfo/$version/build-info.json" - mkdir -p "$(dirname "$infofile")" - - if ! docker pull "$image"; then - echo "[WARN] Failed to pull $image — setting fields to unknown/0" - digest="unknown" - size_bytes=0 - else - digest=$(docker inspect --format='{{if .RepoDigests}}{{index .RepoDigests 0}}{{else}}unknown{{end}}' "$image" 2>/dev/null || echo "unknown") - size_bytes=$(docker image inspect "$image" --format='{{.Size}}' 2>/dev/null || echo "0") - size_bytes=${size_bytes//[^0-9]/} - if [[ -z "$size_bytes" ]]; then size_bytes=0; fi - fi - - size_human=$(human_size "$size_bytes") - - cd upload-repo - commit=$(git rev-parse HEAD) - cd .. - - jq -n \ - --arg version "$version" \ - --arg commit "$commit" \ - --arg build_time "$(date -u +'%Y-%m-%dT%H:%M:%SZ')" \ - --arg image_tag "$image" \ - --arg digest "$digest" \ - --arg image_size "$size_human" \ - --argjson image_size_bytes "$size_bytes" \ - '{ - version: $version, - commit: $commit, - build_time: $build_time, - image_tag: $image_tag, - digest: $digest, - image_size: $image_size, - image_size_bytes: $image_size_bytes - }' > "$infofile" - done - - - name: Copy build-info.json into repo - run: | - for version in $VERSIONS; do - mkdir -p upload-repo/$version - cp "buildinfo/$version/build-info.json" "upload-repo/$version/" - done - - - name: Commit and push build-info (temp branch) - run: | - cd upload-repo - - git config user.name "${{ secrets.GIT_USERNAME }}" - git config user.email "${{ secrets.GIT_EMAIL }}" - - TEMP_BRANCH="tmp-buildinfo-$(date +%s)" - - # Create temporary branch - git checkout -b "$TEMP_BRANCH" - - # Stage changes - git add */build-info.json - - # Nothing changed? - if git diff --cached --quiet; then - echo "[INFO] No build-info changes." - exit 0 - fi - - git commit -m "Update build-info on $(date -u +'%Y-%m-%dT%H:%M:%SZ') [skip ci]" - - # Push temporary branch - git push origin HEAD:$TEMP_BRANCH - - # Rebase temp branch onto latest master - git fetch origin master - - git checkout "$TEMP_BRANCH" - - if ! git rebase origin/master; then - echo "[WARN] Rebase failed, using merge instead." - git rebase --abort || true - git merge origin/master --no-edit - fi - - git push origin HEAD:$TEMP_BRANCH --force - - # Merge into master - git checkout master - git reset --hard origin/master - - git merge --no-ff "$TEMP_BRANCH" \ - -m "Merge build-info updates" - - git push origin master - - git push origin --delete "$TEMP_BRANCH" || true - - for version in $VERSIONS; do - TAG="build-$version" - - git tag -d "$TAG" 2>/dev/null || true - git push origin ":refs/tags/$TAG" 2>/dev/null || true - - git tag "$TAG" - git push origin "$TAG" --force - done \ No newline at end of file diff --git a/.gitea/workflows/minecraft-build-neoforged.yml b/.gitea/workflows/minecraft-build-neoforged.yml deleted file mode 100644 index 9d2ad5c..0000000 --- a/.gitea/workflows/minecraft-build-neoforged.yml +++ /dev/null @@ -1,405 +0,0 @@ -name: minecraft-build-neoforged - -on: - push: - branches: - - master - paths: - - '.gitea/workflows/minecraft-build-neoforged.yml' - - 'neoforged/Dockerfile' - - 'neoforged/*.sh' - - '!.cache/*' - - '!neoforged/CHANGES.md' - - '!neoforged/build-info.json' - schedule: - - cron: '30 21 * * 0' - -env: - IMAGE_REGISTRY: gitea.fithwum.tech - IMAGE_ORG: fithwum - IMAGE_REPO_DEBIAN: debian-base - IMAGE_REPO_MINECRAFT: minecraft - IMAGE_TAG_DEBIAN: bookworm - DIGEST_FILE: .cache/debian-base.digest - VERSIONS: neoforged - -jobs: - docker-prune: - name: Docker prune (${{ matrix.runner }}) - runs-on: ${{ matrix.runner }} - strategy: - fail-fast: false - matrix: - runner: - - vm-docker-build2 - steps: - - name: Prune unused Docker images - run: | - echo "[INFO] Pruning Docker images on ${{ matrix.runner }}..." - docker image prune -a -f || true - - poll-debian-base-and-detect-changes: - runs-on: vm-docker-build2 - needs: docker-prune - outputs: - digest_changed: ${{ steps.compare_digest.outputs.changed }} - versions_changed: ${{ steps.check_changed_versions.outputs.versions_changed }} - new_versions: ${{ steps.check_new_versions.outputs.new_versions }} - steps: - - name: Checkout repo - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Ensure .cache exists - run: mkdir -p .cache && touch .cache/.gitkeep - - - name: Log in to Gitea Registry - run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login gitea.fithwum.tech -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin - - - name: Get current digest of debian-base image - id: get_digest - run: | - IMAGE="${{ env.IMAGE_REGISTRY }}/${{ env.IMAGE_ORG }}/${{ env.IMAGE_REPO_DEBIAN }}:${{ env.IMAGE_TAG_DEBIAN }}" - docker pull "$IMAGE" > /dev/null - DIGEST=$(docker inspect --format='{{index .RepoDigests 0}}' "$IMAGE") - echo "digest=$DIGEST" >> $GITHUB_OUTPUT - echo "$DIGEST" > .cache/debian-base.digest.new - - - name: Compare with stored digest - id: compare_digest - run: | - CURRENT_DIGEST="${{ steps.get_digest.outputs.digest }}" - LAST_DIGEST="$(cat ${{ env.DIGEST_FILE }} 2>/dev/null || echo '')" - - if [ "$CURRENT_DIGEST" = "$LAST_DIGEST" ]; then - echo "[INFO] Digest unchanged" - echo "changed=false" >> $GITHUB_OUTPUT - exit 0 - fi - - echo "[INFO] Digest changed → updating cache" - echo "$CURRENT_DIGEST" > ${{ env.DIGEST_FILE }} - - git config user.name "${{ secrets.GIT_USERNAME }}" - git config user.email "${{ secrets.GIT_EMAIL }}" - - git add ${{ env.DIGEST_FILE }} - git commit -m "Update base digest to $CURRENT_DIGEST" || true - - # --- Safe rebase with auto conflict resolution --- - git fetch origin master - if ! git rebase --strategy-option=theirs origin/master; then - echo "[WARN] Rebase conflict, auto-resolving by preferring local digest" - git rebase --abort - git fetch origin master - git reset --hard origin/master - echo "$CURRENT_DIGEST" > ${{ env.DIGEST_FILE }} - git add ${{ env.DIGEST_FILE }} - git commit -m "Force-update base digest to $CURRENT_DIGEST (auto-resolved)" - fi - - git push origin HEAD:master - echo "changed=true" >> $GITHUB_OUTPUT - - - name: Detect changed Minecraft versions - id: check_changed_versions - run: | - BEFORE_COMMIT="${{ github.event.before }}" - if [ -z "$BEFORE_COMMIT" ] || ! git cat-file -e "$BEFORE_COMMIT^{commit}" 2>/dev/null; then - BEFORE_COMMIT=$(git rev-parse HEAD~1) - fi - CHANGED=$(git diff --name-only "$BEFORE_COMMIT" HEAD || true) - CHANGED_VERSIONS="" - for version in $VERSIONS; do - echo "$CHANGED" | grep -q "^$version/.*\.\(sh\|Dockerfile\)$" && CHANGED_VERSIONS="$CHANGED_VERSIONS $version" - done - CHANGED_VERSIONS=$(echo "$CHANGED_VERSIONS" | xargs) # trim whitespace - echo "versions_changed=$CHANGED_VERSIONS" >> $GITHUB_OUTPUT - - - name: Detect Minecraft versions without build-info - id: check_new_versions - run: | - NEW_VERSIONS="" - GIT_CREDENTIAL="${{ secrets.GIT_TOKEN || secrets.GIT_PASSWORD }}" - git clone --depth=1 "https://${{ secrets.GIT_USERNAME }}:${GIT_CREDENTIAL}@gitea.fithwum.tech/fithwum/minecraft.git" upload-repo - - for version in $VERSIONS; do - if [ ! -f "upload-repo/$version/build-info.json" ]; then - echo "[INFO] No build-info.json for $version → treating as new" - NEW_VERSIONS="$NEW_VERSIONS $version" - fi - done - - echo "new_versions=$NEW_VERSIONS" >> $GITHUB_OUTPUT - - build-minecraft-images: - runs-on: vm-docker-build2 - needs: - - docker-prune - - poll-debian-base-and-detect-changes - if: | - needs.poll-debian-base-and-detect-changes.outputs.digest_changed == 'true' || - needs.poll-debian-base-and-detect-changes.outputs.versions_changed != '' || - needs.poll-debian-base-and-detect-changes.outputs.new_versions != '' - strategy: - matrix: - version: [neoforged] - name: Build and Push ${{ matrix.version }} - steps: - - name: Checkout repo - uses: actions/checkout@v3 - - - name: Log in to Gitea Registry - run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login gitea.fithwum.tech -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin - - - name: Clone Minecraft repo (with retries) - run: | - GIT_CREDENTIAL="${{ secrets.GIT_TOKEN || secrets.GIT_PASSWORD }}" - for i in {1..5}; do - git clone "https://${{ secrets.GIT_USERNAME }}:${GIT_CREDENTIAL}@gitea.fithwum.tech/fithwum/minecraft.git" upload-repo && break - echo "[WARN] Clone attempt $i failed. Retrying in 10s..." - sleep 10 - done - if [ ! -d upload-repo ]; then - echo "[ERROR] Failed to clone Minecraft repo after retries." - exit 1 - fi - - - name: Build and push image - run: | - IMAGE="$IMAGE_REGISTRY/$IMAGE_ORG/$IMAGE_REPO_MINECRAFT:${{ matrix.version }}" - docker buildx build --platform linux/amd64 --push -t "$IMAGE" "./${{ matrix.version }}" - - generate-changelogs: - needs: build-minecraft-images - runs-on: vm-docker-build2 - steps: - - name: Checkout repo - uses: actions/checkout@v3 - - - name: Create temporary changelog workspace - run: mkdir -p changelogs - - - name: Clone Minecraft repo - run: | - GIT_CREDENTIAL="${{ secrets.GIT_TOKEN || secrets.GIT_PASSWORD }}" - git clone --depth=3 "https://${{ secrets.GIT_USERNAME }}:${GIT_CREDENTIAL}@gitea.fithwum.tech/fithwum/minecraft.git" upload-repo - - - name: Generate changelogs - run: | - for version in $VERSIONS; do - echo "[INFO] Generating changelog for $version" - changelog="changelogs/$version/CHANGES.md" - mkdir -p "$(dirname "$changelog")" - touch "$changelog" - - cd upload-repo - infofile="$version/build-info.json" - last_commit="" - if [ -f "$infofile" ]; then - last_commit=$(jq -r '.commit' "$infofile") - fi - - echo -e "## $(date -u +'%Y-%m-%dT%H:%M:%SZ')\n" > "../$changelog" - if [ -n "$last_commit" ]; then - COMMITS=$(git log "${last_commit}..HEAD" --pretty=format:"- %s (%an)" || true) - fi - if [ -z "$COMMITS" ]; then - echo "[INFO] No new commits since last build. Showing latest 5 instead." - COMMITS=$(git log -n 5 --pretty=format:"- %s (%an)" || true) - fi - echo "$COMMITS" >> "../$changelog" - cd .. - done - - - name: Copy changelogs into repo - run: | - for version in $VERSIONS; do - mkdir -p upload-repo/$version - cp changelogs/$version/CHANGES.md upload-repo/$version/ - done - - - name: Commit and push changelogs (temp branch) - run: | - cd upload-repo - - git config user.name "${{ secrets.GIT_USERNAME }}" - git config user.email "${{ secrets.GIT_EMAIL }}" - - TEMP_BRANCH="tmp-changelog-$(date +%s)" - - # Create temporary branch - git checkout -b "$TEMP_BRANCH" - - # Stage changes - git add */CHANGES.md - - # Nothing changed? - if git diff --cached --quiet; then - echo "[INFO] No changelog changes." - exit 0 - fi - - git commit -m "Update changelogs on $(date -u +'%Y-%m-%dT%H:%M:%SZ') [skip ci]" - - # Push temporary branch - git push origin HEAD:$TEMP_BRANCH - - # Rebase temp branch onto latest master - git fetch origin master - - git checkout "$TEMP_BRANCH" - - if ! git rebase origin/master; then - echo "[WARN] Rebase failed, using merge instead." - git rebase --abort || true - git merge origin/master --no-edit - fi - - git push origin HEAD:$TEMP_BRANCH --force - - # Fast-forward master - git checkout master - git reset --hard origin/master - - git merge --no-ff "$TEMP_BRANCH" \ - -m "Merge changelog updates" - - git push origin master - - git push origin --delete "$TEMP_BRANCH" || true - - generate-build-info: - needs: generate-changelogs - runs-on: vm-docker-build2 - steps: - - name: Checkout repo - uses: actions/checkout@v3 - - - name: Prepare temporary build-info workspace - run: mkdir -p buildinfo - - - name: Clone Minecraft repo - run: | - GIT_CREDENTIAL="${{ secrets.GIT_TOKEN || secrets.GIT_PASSWORD }}" - git clone --depth=1 "https://${{ secrets.GIT_USERNAME }}:${GIT_CREDENTIAL}@gitea.fithwum.tech/fithwum/minecraft.git" upload-repo - - - name: Generate build-info files - run: | - human_size() { - local b=$1 d='' s=0 S=(B KB MB GB TB) - while ((b >= 1024 && s < ${#S[@]}-1)); do - d=$((b % 1024)); b=$((b / 1024)); s=$((s + 1)) - done - printf "%s%s\n" "$b" "${S[$s]}" - } - - for version in $VERSIONS; do - echo "[INFO] Generating build-info.json for $version" - image="${IMAGE_REGISTRY}/${IMAGE_ORG}/${IMAGE_REPO_MINECRAFT}:$version" - infofile="buildinfo/$version/build-info.json" - mkdir -p "$(dirname "$infofile")" - - if ! docker pull "$image"; then - echo "[WARN] Failed to pull $image — setting fields to unknown/0" - digest="unknown" - size_bytes=0 - else - digest=$(docker inspect --format='{{if .RepoDigests}}{{index .RepoDigests 0}}{{else}}unknown{{end}}' "$image" 2>/dev/null || echo "unknown") - size_bytes=$(docker image inspect "$image" --format='{{.Size}}' 2>/dev/null || echo "0") - size_bytes=${size_bytes//[^0-9]/} - if [[ -z "$size_bytes" ]]; then size_bytes=0; fi - fi - - size_human=$(human_size "$size_bytes") - - cd upload-repo - commit=$(git rev-parse HEAD) - cd .. - - jq -n \ - --arg version "$version" \ - --arg commit "$commit" \ - --arg build_time "$(date -u +'%Y-%m-%dT%H:%M:%SZ')" \ - --arg image_tag "$image" \ - --arg digest "$digest" \ - --arg image_size "$size_human" \ - --argjson image_size_bytes "$size_bytes" \ - '{ - version: $version, - commit: $commit, - build_time: $build_time, - image_tag: $image_tag, - digest: $digest, - image_size: $image_size, - image_size_bytes: $image_size_bytes - }' > "$infofile" - done - - - name: Copy build-info.json into repo - run: | - for version in $VERSIONS; do - mkdir -p upload-repo/$version - cp "buildinfo/$version/build-info.json" "upload-repo/$version/" - done - - - name: Commit and push build-info (temp branch) - run: | - cd upload-repo - - git config user.name "${{ secrets.GIT_USERNAME }}" - git config user.email "${{ secrets.GIT_EMAIL }}" - - TEMP_BRANCH="tmp-buildinfo-$(date +%s)" - - # Create temporary branch - git checkout -b "$TEMP_BRANCH" - - # Stage changes - git add */build-info.json - - # Nothing changed? - if git diff --cached --quiet; then - echo "[INFO] No build-info changes." - exit 0 - fi - - git commit -m "Update build-info on $(date -u +'%Y-%m-%dT%H:%M:%SZ') [skip ci]" - - # Push temporary branch - git push origin HEAD:$TEMP_BRANCH - - # Rebase temp branch onto latest master - git fetch origin master - - git checkout "$TEMP_BRANCH" - - if ! git rebase origin/master; then - echo "[WARN] Rebase failed, using merge instead." - git rebase --abort || true - git merge origin/master --no-edit - fi - - git push origin HEAD:$TEMP_BRANCH --force - - # Merge into master - git checkout master - git reset --hard origin/master - - git merge --no-ff "$TEMP_BRANCH" \ - -m "Merge build-info updates" - - git push origin master - - git push origin --delete "$TEMP_BRANCH" || true - - for version in $VERSIONS; do - TAG="build-$version" - - git tag -d "$TAG" 2>/dev/null || true - git push origin ":refs/tags/$TAG" 2>/dev/null || true - - git tag "$TAG" - git push origin "$TAG" --force - done diff --git a/.gitea/workflows/minecraft-build-quilt.yml b/.gitea/workflows/minecraft-build-quilt.yml deleted file mode 100644 index 9c906f2..0000000 --- a/.gitea/workflows/minecraft-build-quilt.yml +++ /dev/null @@ -1,405 +0,0 @@ -name: minecraft-build-quilt - -on: - push: - branches: - - master - paths: - - '.gitea/workflows/minecraft-build-quilt.yml' - - 'quilt/Dockerfile' - - 'quilt/*.sh' - - '!.cache/*' - - '!quilt/CHANGES.md' - - '!quilt/build-info.json' - schedule: - - cron: '30 21 * * 0' - -env: - IMAGE_REGISTRY: gitea.fithwum.tech - IMAGE_ORG: fithwum - IMAGE_REPO_DEBIAN: debian-base - IMAGE_REPO_MINECRAFT: minecraft - IMAGE_TAG_DEBIAN: bookworm - DIGEST_FILE: .cache/debian-base.digest - VERSIONS: quilt - -jobs: - docker-prune: - name: Docker prune (${{ matrix.runner }}) - runs-on: ${{ matrix.runner }} - strategy: - fail-fast: false - matrix: - runner: - - vm-docker-build2 - steps: - - name: Prune unused Docker images - run: | - echo "[INFO] Pruning Docker images on ${{ matrix.runner }}..." - docker image prune -a -f || true - - poll-debian-base-and-detect-changes: - runs-on: vm-docker-build2 - needs: docker-prune - outputs: - digest_changed: ${{ steps.compare_digest.outputs.changed }} - versions_changed: ${{ steps.check_changed_versions.outputs.versions_changed }} - new_versions: ${{ steps.check_new_versions.outputs.new_versions }} - steps: - - name: Checkout repo - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Ensure .cache exists - run: mkdir -p .cache && touch .cache/.gitkeep - - - name: Log in to Gitea Registry - run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login gitea.fithwum.tech -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin - - - name: Get current digest of debian-base image - id: get_digest - run: | - IMAGE="${{ env.IMAGE_REGISTRY }}/${{ env.IMAGE_ORG }}/${{ env.IMAGE_REPO_DEBIAN }}:${{ env.IMAGE_TAG_DEBIAN }}" - docker pull "$IMAGE" > /dev/null - DIGEST=$(docker inspect --format='{{index .RepoDigests 0}}' "$IMAGE") - echo "digest=$DIGEST" >> $GITHUB_OUTPUT - echo "$DIGEST" > .cache/debian-base.digest.new - - - name: Compare with stored digest - id: compare_digest - run: | - CURRENT_DIGEST="${{ steps.get_digest.outputs.digest }}" - LAST_DIGEST="$(cat ${{ env.DIGEST_FILE }} 2>/dev/null || echo '')" - - if [ "$CURRENT_DIGEST" = "$LAST_DIGEST" ]; then - echo "[INFO] Digest unchanged" - echo "changed=false" >> $GITHUB_OUTPUT - exit 0 - fi - - echo "[INFO] Digest changed → updating cache" - echo "$CURRENT_DIGEST" > ${{ env.DIGEST_FILE }} - - git config user.name "${{ secrets.GIT_USERNAME }}" - git config user.email "${{ secrets.GIT_EMAIL }}" - - git add ${{ env.DIGEST_FILE }} - git commit -m "Update base digest to $CURRENT_DIGEST" || true - - # --- Safe rebase with auto conflict resolution --- - git fetch origin master - if ! git rebase --strategy-option=theirs origin/master; then - echo "[WARN] Rebase conflict, auto-resolving by preferring local digest" - git rebase --abort - git fetch origin master - git reset --hard origin/master - echo "$CURRENT_DIGEST" > ${{ env.DIGEST_FILE }} - git add ${{ env.DIGEST_FILE }} - git commit -m "Force-update base digest to $CURRENT_DIGEST (auto-resolved)" - fi - - git push origin HEAD:master - echo "changed=true" >> $GITHUB_OUTPUT - - - name: Detect changed Minecraft versions - id: check_changed_versions - run: | - BEFORE_COMMIT="${{ github.event.before }}" - if [ -z "$BEFORE_COMMIT" ] || ! git cat-file -e "$BEFORE_COMMIT^{commit}" 2>/dev/null; then - BEFORE_COMMIT=$(git rev-parse HEAD~1) - fi - CHANGED=$(git diff --name-only "$BEFORE_COMMIT" HEAD || true) - CHANGED_VERSIONS="" - for version in $VERSIONS; do - echo "$CHANGED" | grep -q "^$version/.*\.\(sh\|Dockerfile\)$" && CHANGED_VERSIONS="$CHANGED_VERSIONS $version" - done - CHANGED_VERSIONS=$(echo "$CHANGED_VERSIONS" | xargs) # trim whitespace - echo "versions_changed=$CHANGED_VERSIONS" >> $GITHUB_OUTPUT - - - name: Detect Minecraft versions without build-info - id: check_new_versions - run: | - NEW_VERSIONS="" - GIT_CREDENTIAL="${{ secrets.GIT_TOKEN || secrets.GIT_PASSWORD }}" - git clone --depth=1 "https://${{ secrets.GIT_USERNAME }}:${GIT_CREDENTIAL}@gitea.fithwum.tech/fithwum/minecraft.git" upload-repo - - for version in $VERSIONS; do - if [ ! -f "upload-repo/$version/build-info.json" ]; then - echo "[INFO] No build-info.json for $version → treating as new" - NEW_VERSIONS="$NEW_VERSIONS $version" - fi - done - - echo "new_versions=$NEW_VERSIONS" >> $GITHUB_OUTPUT - - build-minecraft-images: - runs-on: vm-docker-build2 - needs: - - docker-prune - - poll-debian-base-and-detect-changes - if: | - needs.poll-debian-base-and-detect-changes.outputs.digest_changed == 'true' || - needs.poll-debian-base-and-detect-changes.outputs.versions_changed != '' || - needs.poll-debian-base-and-detect-changes.outputs.new_versions != '' - strategy: - matrix: - version: [quilt] - name: Build and Push ${{ matrix.version }} - steps: - - name: Checkout repo - uses: actions/checkout@v3 - - - name: Log in to Gitea Registry - run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login gitea.fithwum.tech -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin - - - name: Clone Minecraft repo (with retries) - run: | - GIT_CREDENTIAL="${{ secrets.GIT_TOKEN || secrets.GIT_PASSWORD }}" - for i in {1..5}; do - git clone "https://${{ secrets.GIT_USERNAME }}:${GIT_CREDENTIAL}@gitea.fithwum.tech/fithwum/minecraft.git" upload-repo && break - echo "[WARN] Clone attempt $i failed. Retrying in 10s..." - sleep 10 - done - if [ ! -d upload-repo ]; then - echo "[ERROR] Failed to clone Minecraft repo after retries." - exit 1 - fi - - - name: Build and push image - run: | - IMAGE="$IMAGE_REGISTRY/$IMAGE_ORG/$IMAGE_REPO_MINECRAFT:${{ matrix.version }}" - docker buildx build --platform linux/amd64 --push -t "$IMAGE" "./${{ matrix.version }}" - - generate-changelogs: - needs: build-minecraft-images - runs-on: vm-docker-build2 - steps: - - name: Checkout repo - uses: actions/checkout@v3 - - - name: Create temporary changelog workspace - run: mkdir -p changelogs - - - name: Clone Minecraft repo - run: | - GIT_CREDENTIAL="${{ secrets.GIT_TOKEN || secrets.GIT_PASSWORD }}" - git clone --depth=3 "https://${{ secrets.GIT_USERNAME }}:${GIT_CREDENTIAL}@gitea.fithwum.tech/fithwum/minecraft.git" upload-repo - - - name: Generate changelogs - run: | - for version in $VERSIONS; do - echo "[INFO] Generating changelog for $version" - changelog="changelogs/$version/CHANGES.md" - mkdir -p "$(dirname "$changelog")" - touch "$changelog" - - cd upload-repo - infofile="$version/build-info.json" - last_commit="" - if [ -f "$infofile" ]; then - last_commit=$(jq -r '.commit' "$infofile") - fi - - echo -e "## $(date -u +'%Y-%m-%dT%H:%M:%SZ')\n" > "../$changelog" - if [ -n "$last_commit" ]; then - COMMITS=$(git log "${last_commit}..HEAD" --pretty=format:"- %s (%an)" || true) - fi - if [ -z "$COMMITS" ]; then - echo "[INFO] No new commits since last build. Showing latest 5 instead." - COMMITS=$(git log -n 5 --pretty=format:"- %s (%an)" || true) - fi - echo "$COMMITS" >> "../$changelog" - cd .. - done - - - name: Copy changelogs into repo - run: | - for version in $VERSIONS; do - mkdir -p upload-repo/$version - cp changelogs/$version/CHANGES.md upload-repo/$version/ - done - - - name: Commit and push changelogs (temp branch) - run: | - cd upload-repo - - git config user.name "${{ secrets.GIT_USERNAME }}" - git config user.email "${{ secrets.GIT_EMAIL }}" - - TEMP_BRANCH="tmp-changelog-$(date +%s)" - - # Create temporary branch - git checkout -b "$TEMP_BRANCH" - - # Stage changes - git add */CHANGES.md - - # Nothing changed? - if git diff --cached --quiet; then - echo "[INFO] No changelog changes." - exit 0 - fi - - git commit -m "Update changelogs on $(date -u +'%Y-%m-%dT%H:%M:%SZ') [skip ci]" - - # Push temporary branch - git push origin HEAD:$TEMP_BRANCH - - # Rebase temp branch onto latest master - git fetch origin master - - git checkout "$TEMP_BRANCH" - - if ! git rebase origin/master; then - echo "[WARN] Rebase failed, using merge instead." - git rebase --abort || true - git merge origin/master --no-edit - fi - - git push origin HEAD:$TEMP_BRANCH --force - - # Fast-forward master - git checkout master - git reset --hard origin/master - - git merge --no-ff "$TEMP_BRANCH" \ - -m "Merge changelog updates" - - git push origin master - - git push origin --delete "$TEMP_BRANCH" || true - - generate-build-info: - needs: generate-changelogs - runs-on: vm-docker-build2 - steps: - - name: Checkout repo - uses: actions/checkout@v3 - - - name: Prepare temporary build-info workspace - run: mkdir -p buildinfo - - - name: Clone Minecraft repo - run: | - GIT_CREDENTIAL="${{ secrets.GIT_TOKEN || secrets.GIT_PASSWORD }}" - git clone --depth=1 "https://${{ secrets.GIT_USERNAME }}:${GIT_CREDENTIAL}@gitea.fithwum.tech/fithwum/minecraft.git" upload-repo - - - name: Generate build-info files - run: | - human_size() { - local b=$1 d='' s=0 S=(B KB MB GB TB) - while ((b >= 1024 && s < ${#S[@]}-1)); do - d=$((b % 1024)); b=$((b / 1024)); s=$((s + 1)) - done - printf "%s%s\n" "$b" "${S[$s]}" - } - - for version in $VERSIONS; do - echo "[INFO] Generating build-info.json for $version" - image="${IMAGE_REGISTRY}/${IMAGE_ORG}/${IMAGE_REPO_MINECRAFT}:$version" - infofile="buildinfo/$version/build-info.json" - mkdir -p "$(dirname "$infofile")" - - if ! docker pull "$image"; then - echo "[WARN] Failed to pull $image — setting fields to unknown/0" - digest="unknown" - size_bytes=0 - else - digest=$(docker inspect --format='{{if .RepoDigests}}{{index .RepoDigests 0}}{{else}}unknown{{end}}' "$image" 2>/dev/null || echo "unknown") - size_bytes=$(docker image inspect "$image" --format='{{.Size}}' 2>/dev/null || echo "0") - size_bytes=${size_bytes//[^0-9]/} - if [[ -z "$size_bytes" ]]; then size_bytes=0; fi - fi - - size_human=$(human_size "$size_bytes") - - cd upload-repo - commit=$(git rev-parse HEAD) - cd .. - - jq -n \ - --arg version "$version" \ - --arg commit "$commit" \ - --arg build_time "$(date -u +'%Y-%m-%dT%H:%M:%SZ')" \ - --arg image_tag "$image" \ - --arg digest "$digest" \ - --arg image_size "$size_human" \ - --argjson image_size_bytes "$size_bytes" \ - '{ - version: $version, - commit: $commit, - build_time: $build_time, - image_tag: $image_tag, - digest: $digest, - image_size: $image_size, - image_size_bytes: $image_size_bytes - }' > "$infofile" - done - - - name: Copy build-info.json into repo - run: | - for version in $VERSIONS; do - mkdir -p upload-repo/$version - cp "buildinfo/$version/build-info.json" "upload-repo/$version/" - done - - - name: Commit and push build-info (temp branch) - run: | - cd upload-repo - - git config user.name "${{ secrets.GIT_USERNAME }}" - git config user.email "${{ secrets.GIT_EMAIL }}" - - TEMP_BRANCH="tmp-buildinfo-$(date +%s)" - - # Create temporary branch - git checkout -b "$TEMP_BRANCH" - - # Stage changes - git add */build-info.json - - # Nothing changed? - if git diff --cached --quiet; then - echo "[INFO] No build-info changes." - exit 0 - fi - - git commit -m "Update build-info on $(date -u +'%Y-%m-%dT%H:%M:%SZ') [skip ci]" - - # Push temporary branch - git push origin HEAD:$TEMP_BRANCH - - # Rebase temp branch onto latest master - git fetch origin master - - git checkout "$TEMP_BRANCH" - - if ! git rebase origin/master; then - echo "[WARN] Rebase failed, using merge instead." - git rebase --abort || true - git merge origin/master --no-edit - fi - - git push origin HEAD:$TEMP_BRANCH --force - - # Merge into master - git checkout master - git reset --hard origin/master - - git merge --no-ff "$TEMP_BRANCH" \ - -m "Merge build-info updates" - - git push origin master - - git push origin --delete "$TEMP_BRANCH" || true - - for version in $VERSIONS; do - TAG="build-$version" - - git tag -d "$TAG" 2>/dev/null || true - git push origin ":refs/tags/$TAG" 2>/dev/null || true - - git tag "$TAG" - git push origin "$TAG" --force - done diff --git a/.gitea/workflows/minecraft-build-vanilla.yml b/.gitea/workflows/minecraft-build-vanilla.yml deleted file mode 100644 index 9c922e8..0000000 --- a/.gitea/workflows/minecraft-build-vanilla.yml +++ /dev/null @@ -1,405 +0,0 @@ -name: minecraft-build-vanilla - -on: - push: - branches: - - master - paths: - - '.gitea/workflows/minecraft-build-vanilla.yml' - - 'vanilla/Dockerfile' - - 'vanilla/*.sh' - - '!.cache/*' - - '!vanilla/CHANGES.md' - - '!vanilla/build-info.json' - schedule: - - cron: '30 21 * * 0' - -env: - IMAGE_REGISTRY: gitea.fithwum.tech - IMAGE_ORG: fithwum - IMAGE_REPO_DEBIAN: debian-base - IMAGE_REPO_MINECRAFT: minecraft - IMAGE_TAG_DEBIAN: bookworm - DIGEST_FILE: .cache/debian-base.digest - VERSIONS: vanilla - -jobs: - docker-prune: - name: Docker prune (${{ matrix.runner }}) - runs-on: ${{ matrix.runner }} - strategy: - fail-fast: false - matrix: - runner: - - vm-docker-build2 - steps: - - name: Prune unused Docker images - run: | - echo "[INFO] Pruning Docker images on ${{ matrix.runner }}..." - docker image prune -a -f || true - - poll-debian-base-and-detect-changes: - runs-on: vm-docker-build2 - needs: docker-prune - outputs: - digest_changed: ${{ steps.compare_digest.outputs.changed }} - versions_changed: ${{ steps.check_changed_versions.outputs.versions_changed }} - new_versions: ${{ steps.check_new_versions.outputs.new_versions }} - steps: - - name: Checkout repo - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Ensure .cache exists - run: mkdir -p .cache && touch .cache/.gitkeep - - - name: Log in to Gitea Registry - run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login gitea.fithwum.tech -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin - - - name: Get current digest of debian-base image - id: get_digest - run: | - IMAGE="${{ env.IMAGE_REGISTRY }}/${{ env.IMAGE_ORG }}/${{ env.IMAGE_REPO_DEBIAN }}:${{ env.IMAGE_TAG_DEBIAN }}" - docker pull "$IMAGE" > /dev/null - DIGEST=$(docker inspect --format='{{index .RepoDigests 0}}' "$IMAGE") - echo "digest=$DIGEST" >> $GITHUB_OUTPUT - echo "$DIGEST" > .cache/debian-base.digest.new - - - name: Compare with stored digest - id: compare_digest - run: | - CURRENT_DIGEST="${{ steps.get_digest.outputs.digest }}" - LAST_DIGEST="$(cat ${{ env.DIGEST_FILE }} 2>/dev/null || echo '')" - - if [ "$CURRENT_DIGEST" = "$LAST_DIGEST" ]; then - echo "[INFO] Digest unchanged" - echo "changed=false" >> $GITHUB_OUTPUT - exit 0 - fi - - echo "[INFO] Digest changed → updating cache" - echo "$CURRENT_DIGEST" > ${{ env.DIGEST_FILE }} - - git config user.name "${{ secrets.GIT_USERNAME }}" - git config user.email "${{ secrets.GIT_EMAIL }}" - - git add ${{ env.DIGEST_FILE }} - git commit -m "Update base digest to $CURRENT_DIGEST" || true - - # --- Safe rebase with auto conflict resolution --- - git fetch origin master - if ! git rebase --strategy-option=theirs origin/master; then - echo "[WARN] Rebase conflict, auto-resolving by preferring local digest" - git rebase --abort - git fetch origin master - git reset --hard origin/master - echo "$CURRENT_DIGEST" > ${{ env.DIGEST_FILE }} - git add ${{ env.DIGEST_FILE }} - git commit -m "Force-update base digest to $CURRENT_DIGEST (auto-resolved)" - fi - - git push origin HEAD:master - echo "changed=true" >> $GITHUB_OUTPUT - - - name: Detect changed Minecraft versions - id: check_changed_versions - run: | - BEFORE_COMMIT="${{ github.event.before }}" - if [ -z "$BEFORE_COMMIT" ] || ! git cat-file -e "$BEFORE_COMMIT^{commit}" 2>/dev/null; then - BEFORE_COMMIT=$(git rev-parse HEAD~1) - fi - CHANGED=$(git diff --name-only "$BEFORE_COMMIT" HEAD || true) - CHANGED_VERSIONS="" - for version in $VERSIONS; do - echo "$CHANGED" | grep -q "^$version/.*\.\(sh\|Dockerfile\)$" && CHANGED_VERSIONS="$CHANGED_VERSIONS $version" - done - CHANGED_VERSIONS=$(echo "$CHANGED_VERSIONS" | xargs) # trim whitespace - echo "versions_changed=$CHANGED_VERSIONS" >> $GITHUB_OUTPUT - - - name: Detect Minecraft versions without build-info - id: check_new_versions - run: | - NEW_VERSIONS="" - GIT_CREDENTIAL="${{ secrets.GIT_TOKEN || secrets.GIT_PASSWORD }}" - git clone --depth=1 "https://${{ secrets.GIT_USERNAME }}:${GIT_CREDENTIAL}@gitea.fithwum.tech/fithwum/minecraft.git" upload-repo - - for version in $VERSIONS; do - if [ ! -f "upload-repo/$version/build-info.json" ]; then - echo "[INFO] No build-info.json for $version → treating as new" - NEW_VERSIONS="$NEW_VERSIONS $version" - fi - done - - echo "new_versions=$NEW_VERSIONS" >> $GITHUB_OUTPUT - - build-minecraft-images: - runs-on: vm-docker-build2 - needs: - - docker-prune - - poll-debian-base-and-detect-changes - if: | - needs.poll-debian-base-and-detect-changes.outputs.digest_changed == 'true' || - needs.poll-debian-base-and-detect-changes.outputs.versions_changed != '' || - needs.poll-debian-base-and-detect-changes.outputs.new_versions != '' - strategy: - matrix: - version: [vanilla] - name: Build and Push ${{ matrix.version }} - steps: - - name: Checkout repo - uses: actions/checkout@v3 - - - name: Log in to Gitea Registry - run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login gitea.fithwum.tech -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin - - - name: Clone Minecraft repo (with retries) - run: | - GIT_CREDENTIAL="${{ secrets.GIT_TOKEN || secrets.GIT_PASSWORD }}" - for i in {1..5}; do - git clone "https://${{ secrets.GIT_USERNAME }}:${GIT_CREDENTIAL}@gitea.fithwum.tech/fithwum/minecraft.git" upload-repo && break - echo "[WARN] Clone attempt $i failed. Retrying in 10s..." - sleep 10 - done - if [ ! -d upload-repo ]; then - echo "[ERROR] Failed to clone Minecraft repo after retries." - exit 1 - fi - - - name: Build and push image - run: | - IMAGE="$IMAGE_REGISTRY/$IMAGE_ORG/$IMAGE_REPO_MINECRAFT:${{ matrix.version }}" - docker buildx build --platform linux/amd64 --push -t "$IMAGE" "./${{ matrix.version }}" - - generate-changelogs: - needs: build-minecraft-images - runs-on: vm-docker-build2 - steps: - - name: Checkout repo - uses: actions/checkout@v3 - - - name: Create temporary changelog workspace - run: mkdir -p changelogs - - - name: Clone Minecraft repo - run: | - GIT_CREDENTIAL="${{ secrets.GIT_TOKEN || secrets.GIT_PASSWORD }}" - git clone --depth=3 "https://${{ secrets.GIT_USERNAME }}:${GIT_CREDENTIAL}@gitea.fithwum.tech/fithwum/minecraft.git" upload-repo - - - name: Generate changelogs - run: | - for version in $VERSIONS; do - echo "[INFO] Generating changelog for $version" - changelog="changelogs/$version/CHANGES.md" - mkdir -p "$(dirname "$changelog")" - touch "$changelog" - - cd upload-repo - infofile="$version/build-info.json" - last_commit="" - if [ -f "$infofile" ]; then - last_commit=$(jq -r '.commit' "$infofile") - fi - - echo -e "## $(date -u +'%Y-%m-%dT%H:%M:%SZ')\n" > "../$changelog" - if [ -n "$last_commit" ]; then - COMMITS=$(git log "${last_commit}..HEAD" --pretty=format:"- %s (%an)" || true) - fi - if [ -z "$COMMITS" ]; then - echo "[INFO] No new commits since last build. Showing latest 5 instead." - COMMITS=$(git log -n 5 --pretty=format:"- %s (%an)" || true) - fi - echo "$COMMITS" >> "../$changelog" - cd .. - done - - - name: Copy changelogs into repo - run: | - for version in $VERSIONS; do - mkdir -p upload-repo/$version - cp changelogs/$version/CHANGES.md upload-repo/$version/ - done - - - name: Commit and push changelogs (temp branch) - run: | - cd upload-repo - - git config user.name "${{ secrets.GIT_USERNAME }}" - git config user.email "${{ secrets.GIT_EMAIL }}" - - TEMP_BRANCH="tmp-changelog-$(date +%s)" - - # Create temporary branch - git checkout -b "$TEMP_BRANCH" - - # Stage changes - git add */CHANGES.md - - # Nothing changed? - if git diff --cached --quiet; then - echo "[INFO] No changelog changes." - exit 0 - fi - - git commit -m "Update changelogs on $(date -u +'%Y-%m-%dT%H:%M:%SZ') [skip ci]" - - # Push temporary branch - git push origin HEAD:$TEMP_BRANCH - - # Rebase temp branch onto latest master - git fetch origin master - - git checkout "$TEMP_BRANCH" - - if ! git rebase origin/master; then - echo "[WARN] Rebase failed, using merge instead." - git rebase --abort || true - git merge origin/master --no-edit - fi - - git push origin HEAD:$TEMP_BRANCH --force - - # Fast-forward master - git checkout master - git reset --hard origin/master - - git merge --no-ff "$TEMP_BRANCH" \ - -m "Merge changelog updates" - - git push origin master - - git push origin --delete "$TEMP_BRANCH" || true - - generate-build-info: - needs: generate-changelogs - runs-on: vm-docker-build2 - steps: - - name: Checkout repo - uses: actions/checkout@v3 - - - name: Prepare temporary build-info workspace - run: mkdir -p buildinfo - - - name: Clone Minecraft repo - run: | - GIT_CREDENTIAL="${{ secrets.GIT_TOKEN || secrets.GIT_PASSWORD }}" - git clone --depth=1 "https://${{ secrets.GIT_USERNAME }}:${GIT_CREDENTIAL}@gitea.fithwum.tech/fithwum/minecraft.git" upload-repo - - - name: Generate build-info files - run: | - human_size() { - local b=$1 d='' s=0 S=(B KB MB GB TB) - while ((b >= 1024 && s < ${#S[@]}-1)); do - d=$((b % 1024)); b=$((b / 1024)); s=$((s + 1)) - done - printf "%s%s\n" "$b" "${S[$s]}" - } - - for version in $VERSIONS; do - echo "[INFO] Generating build-info.json for $version" - image="${IMAGE_REGISTRY}/${IMAGE_ORG}/${IMAGE_REPO_MINECRAFT}:$version" - infofile="buildinfo/$version/build-info.json" - mkdir -p "$(dirname "$infofile")" - - if ! docker pull "$image"; then - echo "[WARN] Failed to pull $image — setting fields to unknown/0" - digest="unknown" - size_bytes=0 - else - digest=$(docker inspect --format='{{if .RepoDigests}}{{index .RepoDigests 0}}{{else}}unknown{{end}}' "$image" 2>/dev/null || echo "unknown") - size_bytes=$(docker image inspect "$image" --format='{{.Size}}' 2>/dev/null || echo "0") - size_bytes=${size_bytes//[^0-9]/} - if [[ -z "$size_bytes" ]]; then size_bytes=0; fi - fi - - size_human=$(human_size "$size_bytes") - - cd upload-repo - commit=$(git rev-parse HEAD) - cd .. - - jq -n \ - --arg version "$version" \ - --arg commit "$commit" \ - --arg build_time "$(date -u +'%Y-%m-%dT%H:%M:%SZ')" \ - --arg image_tag "$image" \ - --arg digest "$digest" \ - --arg image_size "$size_human" \ - --argjson image_size_bytes "$size_bytes" \ - '{ - version: $version, - commit: $commit, - build_time: $build_time, - image_tag: $image_tag, - digest: $digest, - image_size: $image_size, - image_size_bytes: $image_size_bytes - }' > "$infofile" - done - - - name: Copy build-info.json into repo - run: | - for version in $VERSIONS; do - mkdir -p upload-repo/$version - cp "buildinfo/$version/build-info.json" "upload-repo/$version/" - done - - - name: Commit and push build-info (temp branch) - run: | - cd upload-repo - - git config user.name "${{ secrets.GIT_USERNAME }}" - git config user.email "${{ secrets.GIT_EMAIL }}" - - TEMP_BRANCH="tmp-buildinfo-$(date +%s)" - - # Create temporary branch - git checkout -b "$TEMP_BRANCH" - - # Stage changes - git add */build-info.json - - # Nothing changed? - if git diff --cached --quiet; then - echo "[INFO] No build-info changes." - exit 0 - fi - - git commit -m "Update build-info on $(date -u +'%Y-%m-%dT%H:%M:%SZ') [skip ci]" - - # Push temporary branch - git push origin HEAD:$TEMP_BRANCH - - # Rebase temp branch onto latest master - git fetch origin master - - git checkout "$TEMP_BRANCH" - - if ! git rebase origin/master; then - echo "[WARN] Rebase failed, using merge instead." - git rebase --abort || true - git merge origin/master --no-edit - fi - - git push origin HEAD:$TEMP_BRANCH --force - - # Merge into master - git checkout master - git reset --hard origin/master - - git merge --no-ff "$TEMP_BRANCH" \ - -m "Merge build-info updates" - - git push origin master - - git push origin --delete "$TEMP_BRANCH" || true - - for version in $VERSIONS; do - TAG="build-$version" - - git tag -d "$TAG" 2>/dev/null || true - git push origin ":refs/tags/$TAG" 2>/dev/null || true - - git tag "$TAG" - git push origin "$TAG" --force - done