Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 45 additions & 18 deletions .github/verify-published-pins.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,28 +6,55 @@ value() { sed -n "s/^$1=//p" gradle.properties | tr -d '\r'; }
require_merged() {
local repo="$1" ref="$2" status
[[ "$ref" =~ ^[a-f0-9]{40}$ ]]
status="$(gh api "repos/MinecraftModDevelopmentMods/$repo/compare/$ref...master-1.20.1" --jq '.status')"
status="$(gh api "repos/MinecraftModDevelopmentMods/$repo/compare/$ref...master-1.20.6" --jq '.status')"
case "$status" in
identical|ahead) ;;
*) echo "::error::$repo $ref is not on upstream master-1.20.1 ($status)."; exit 1 ;;
*) echo "::error::$repo $ref is not on upstream master-1.20.6 ($status)."; exit 1 ;;
esac
}

file_id="$(value poweradvantage_public_file_id)"
expected="$(value poweradvantage_player_sha256)"
if [[ ! "$file_id" =~ ^[1-9][0-9]*$ || ! "$expected" =~ ^[A-F0-9]{64}$ ]]; then
echo '::error::A verified public basePower 1.20.1 file ID and player checksum are required.'
exit 1
fi
require_merged basePower "$(value poweradvantage_source_ref)"
download() {
local url="$1" expected="$2" path="$3"
[[ "$expected" =~ ^[A-F0-9]{64}$ ]]
curl --fail --silent --show-error --location --proto '=https' --proto-redir '=https' \
--retry 3 --output "$path" "$url"
printf '%s %s\n' "$expected" "$path" | sha256sum -c -
}

public_jar() {
local name="$1" project="$2" id="$3" sha="$4" jar="$5"
if [[ ! "$id" =~ ^[1-9][0-9]*$ ]]; then
echo "::error::A verified public $name file ID is required."
exit 1
fi
download "https://www.curseforge.com/api/v1/mods/$project/files/$id/download" "$sha" "$jar"
}

power_ref="$(value poweradvantage_source_ref)"
orespawn_ref="$(value orespawn_source_commit)"
require_merged basePower "$power_ref"
require_merged BaseMetals "$(value basemetals_source_commit)"
require_merged OreSpawn "$orespawn_ref"

inputs="${RUNNER_TEMP:?}/forge50-release-dependencies"
mkdir -p "$inputs"
power="$inputs/basePower-$(value poweradvantage_version).jar"
metals="$inputs/BaseMetals-$(value basemetals_version).jar"
orespawn="$inputs/OreSpawn-$(value orespawn_version).jar"
public_jar basePower 1780140 "$(value poweradvantage_public_file_id)" "$(value poweradvantage_deobf_sha256)" "$power"
public_jar BaseMetals 240967 "$(value basemetals_public_file_id)" "$(value basemetals_deobf_sha256)" "$metals"
public_jar OreSpawn 245586 "$(value orespawn_public_file_id)" "$(value orespawn_deobf_sha256)" "$orespawn"

player="${RUNNER_TEMP:?}/basePower-public-player.jar"
curl --fail --silent --show-error --location --proto '=https' --proto-redir '=https' \
--output "$player" "https://www.curseforge.com/api/v1/mods/1780140/files/$file_id/download"
read -r actual _ < <(sha256sum < "$player")
if [[ "${actual^^}" != "$expected" ]]; then
echo "::error::Public basePower file $file_id SHA-256 is ${actual^^}, expected $expected."
exit 1
fi
printf 'power_player=%s\n' "$player" >> "${GITHUB_OUTPUT:?}"
installer="$inputs/forge-1.20.6-50.2.0-installer.jar"
download 'https://maven.minecraftforge.net/net/minecraftforge/forge/1.20.6-50.2.0/forge-1.20.6-50.2.0-installer.jar' \
"$(value forge_installer_sha256)" "$installer"
{
printf 'power_ref=%s\n' "$power_ref"
printf 'orespawn_ref=%s\n' "$orespawn_ref"
} >> "${GITHUB_OUTPUT:?}"
{
printf 'POWER_PLAYER=%s\n' "$power"
printf 'METALS_PLAYER=%s\n' "$metals"
printf 'ORESPAWN_PLAYER=%s\n' "$orespawn"
printf 'FORGE_INSTALLER=%s\n' "$installer"
} >> "${GITHUB_ENV:?}"
146 changes: 46 additions & 100 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,173 +1,119 @@
name: baseSteam 1.20 CI
name: baseSteam 1.20.6 CI

on:
push:
branches: [master-1.20.1, feature/basesteam-1.20.1-port, feature/prepare-basesteam-1.20.1]
branches: [master-1.20.6, 'feature/**']
pull_request:
branches: [master-1.20.1]
branches: [master-1.20.6]

permissions:
contents: read

concurrency:
group: basesteam-1.20-${{ github.workflow }}-${{ github.ref }}
group: basesteam-1.20.6-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
build:
name: Build, test, and audit
runs-on: ubuntu-latest
timeout-minutes: 105
timeout-minutes: 75
steps:
- name: Check out baseSteam
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
- name: Verify merged dependency pins and public basePower bytes
- name: Use canonical LF dependency inputs
run: git config --global core.autocrlf false
- name: Verify merged and public dependency pins
id: public-pins
env:
GH_TOKEN: ${{ github.token }}
run: bash .github/verify-published-pins.sh
- name: Validate coordinated dependency pins
shell: bash
run: |
set -euo pipefail
power_ref=$(sed -n 's/^poweradvantage_source_ref=//p' gradle.properties | tr -d '\r')
power_hash=$(sed -n 's/^poweradvantage_deobf_sha256=//p' gradle.properties | tr -d '\r')
if [[ ! "$power_ref" =~ ^[a-f0-9]{40}$ || ! "$power_hash" =~ ^[A-F0-9]{64}$ ]]; then
echo "::error::The exact basePower 1.20.1 dependency pin is pending."
exit 1
fi
bm_ref=$(sed -n 's/^basemetals_source_commit=//p' gradle.properties | tr -d '\r')
bm_hash=$(sed -n 's/^basemetals_deobf_sha256=//p' gradle.properties | tr -d '\r')
if [[ ! "$bm_ref" =~ ^[a-f0-9]{40}$ || ! "$bm_hash" =~ ^[A-F0-9]{64}$ ]]; then
echo "::error::The exact Base Metals 1.20.1 dependency pin is pending."
exit 1
fi
os_ref=$(sed -n 's/^orespawn_source_commit=//p' gradle.properties | tr -d '\r')
os_hash=$(sed -n 's/^orespawn_deobf_sha256=//p' gradle.properties | tr -d '\r')
if [[ ! "$os_ref" =~ ^[a-f0-9]{40}$ || ! "$os_hash" =~ ^[A-F0-9]{64}$ ]]; then
echo "::error::The exact OreSpawn 1.20.1 dependency pin is pending."
exit 1
fi
echo "ORESPAWN_SOURCE_REF=$os_ref" >> "$GITHUB_ENV"
echo "POWERADVANTAGE_SOURCE_REF=$power_ref" >> "$GITHUB_ENV"
echo "BASEMETALS_SOURCE_REF=$bm_ref" >> "$GITHUB_ENV"
- name: Check out pinned OreSpawn
- name: Check out pinned OreSpawn tool source
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
repository: MinecraftModDevelopmentMods/OreSpawn
ref: ${{ env.ORESPAWN_SOURCE_REF }}
ref: ${{ steps.public-pins.outputs.orespawn_ref }}
path: .ci-dependencies/OreSpawn
- name: Use canonical LF dependency inputs
# Use the same source bytes on hosted and local dependency builds.
run: git config --global core.autocrlf false
- name: Check out pinned Base Metals
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
repository: MinecraftModDevelopmentMods/BaseMetals
ref: ${{ env.BASEMETALS_SOURCE_REF }}
path: .ci-dependencies/BaseMetals
- name: Check out basePower 1.20.1
- name: Check out released basePower source
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
repository: MinecraftModDevelopmentMods/basePower
ref: ${{ env.POWERADVANTAGE_SOURCE_REF }}
ref: ${{ steps.public-pins.outputs.power_ref }}
path: .ci-dependencies/basePower
- name: Install pinned Java 25 Mavenizer runtime
- name: Install Java 25 for Mavenizer
uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5
with:
distribution: temurin
java-version: '25.0.3+9.0.LTS'
- name: Install Java 8 for legacy build utilities
- name: Install Java 8 for the launcher helper
uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5
with:
distribution: temurin
java-version: '8.0.502+7'
- name: Install Java 17 for Gradle
- name: Install Java 21 for Gradle and production
uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5
with:
distribution: temurin
java-version: '17.0.1+12'
java-version: '21.0.7+6.0.LTS'
- name: Use pinned build toolchains
# These are Gradle project properties, not JVM system properties.
shell: bash
run: >-
echo "MMD_GRADLE_TOOLCHAINS=-Porg.gradle.java.installations.paths=$JAVA_HOME,$JAVA_HOME_8_X64,$JAVA_HOME_25_X64
-Porg.gradle.java.installations.auto-detect=false
-Porg.gradle.java.installations.auto-download=false" >> "$GITHUB_ENV"
- name: Set up Gradle
uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6
- name: Build 1.20.1 dependency chain
id: dependencies
- name: Verify the Forge 50 build inputs
shell: bash
env:
ORESPAWN_REF: ${{ steps.public-pins.outputs.orespawn_ref }}
POWER_REF: ${{ steps.public-pins.outputs.power_ref }}
run: |
set -euo pipefail
orespawn="$GITHUB_WORKSPACE/.ci-dependencies/OreSpawn"
basemetals="$GITHUB_WORKSPACE/.ci-dependencies/BaseMetals"
power="$GITHUB_WORKSPACE/.ci-dependencies/basePower"
test "$(git -C "$orespawn" rev-parse HEAD)" = "$ORESPAWN_SOURCE_REF"
test "$(git -C "$power" rev-parse HEAD)" = "$POWERADVANTAGE_SOURCE_REF"
test "$(git -C "$basemetals" rev-parse HEAD)" = "$BASEMETALS_SOURCE_REF"
test "$(git -C "$orespawn" rev-parse HEAD)" = "$ORESPAWN_REF"
test "$(git -C "$power" rev-parse HEAD)" = "$POWER_REF"
mavenizer="$orespawn/ci-fixtures/tools/minecraft-mavenizer-0.5.21-orespawn-compat.jar"
printf '%s %s\n' '416DCA4797BC55826F0DDCF03FDC405F1990FC15C2133FA27A1F143BF7976177' "$mavenizer" | sha256sum -c -
(cd "$orespawn" && ./gradlew $MMD_GRADLE_TOOLCHAINS assemble --no-daemon --stacktrace)
(cd "$basemetals" && ./gradlew $MMD_GRADLE_TOOLCHAINS assemble --no-daemon --stacktrace)
osjar="$orespawn/build/libs-dev/OreSpawn-4.1.0.120011-deobf.jar"
bm_version=$(sed -n 's/^basemetals_version=//p' "$GITHUB_WORKSPACE/gradle.properties" | tr -d '\r')
bmjar="$basemetals/build/libs-dev/BaseMetals-$bm_version-deobf.jar"
(cd "$power" && ./gradlew $MMD_GRADLE_TOOLCHAINS jar unitBootstrapJar verifyReleaseDependencies \
"-Pforge47MavenizerJar=$mavenizer" \
-PbaseMetalsDeobfJar="$bmjar" -PoreSpawnDeobfJar="$osjar" \
--no-daemon --stacktrace)
powerjar="$power/build/libs-dev/basePower-2.4.12.120011-deobf.jar"
bootstrap="$power/build/unit-bootstrap/forge-native-unit-bootstrap.jar"
test -f "$osjar" && test -f "$bmjar" && test -f "$powerjar" && test -f "$bootstrap"
echo "orespawn=$osjar" >> "$GITHUB_OUTPUT"
echo "basemetals=$bmjar" >> "$GITHUB_OUTPUT"
echo "orespawn_player=$orespawn/build/libs/OreSpawn-4.1.0.120011.jar" >> "$GITHUB_OUTPUT"
echo "basemetals_player=$basemetals/build/libs/BaseMetals-$bm_version.jar" >> "$GITHUB_OUTPUT"
echo "power=$powerjar" >> "$GITHUB_OUTPUT"
echo "bootstrap=$bootstrap" >> "$GITHUB_OUTPUT"
echo "mavenizer=$mavenizer" >> "$GITHUB_OUTPUT"
- name: Verify source layout and recipe unlocks
printf '%s %s\n' '4B14145595E900F178A082F2253A756F63897E6F61C2B8B5E7C819B82CD79E8C' "$mavenizer" | sha256sum -c -
echo "MAVENIZER=$mavenizer" >> "$GITHUB_ENV"
- name: Build the released basePower test bootstrap
shell: bash
run: |
node tools/verify-native-port.js
node tools/generate-recipe-unlocks.js --check
set -euo pipefail
power="$GITHUB_WORKSPACE/.ci-dependencies/basePower"
(cd "$power" && bash ./gradlew $MMD_GRADLE_TOOLCHAINS unitBootstrapJar \
"-Pforge50MavenizerJar=$MAVENIZER" "-PbaseMetalsDeobfJar=$METALS_PLAYER" "-PoreSpawnDeobfJar=$ORESPAWN_PLAYER" --no-daemon)
echo "POWER_BOOTSTRAP=$power/build/unit-bootstrap/forge-native-unit-bootstrap.jar" >> "$GITHUB_ENV"
echo "POWER_BOOTSTRAP_SOURCE=$power/test-rig/unit-bootstrap/ForgeCapabilityBootstrap.java" >> "$GITHUB_ENV"
echo "POWER_REGISTRY_SOURCE=$power/test-rig/unit-support/zone/moddev/mc/advantageworks/unit/ForgeUnitRegistries.java" >> "$GITHUB_ENV"
- name: Build and audit release artifacts
run: >-
./gradlew $MMD_GRADLE_TOOLCHAINS clean check build javadoc verifyReleaseDependencies verifyPlayerDependencies verifyReleaseArtifacts
writeReleaseChecksums verifyEclipseProductionClasspath
"-Pforge47MavenizerJar=${{ steps.dependencies.outputs.mavenizer }}"
"-PpowerAdvantagePlayerJar=${{ steps.public-pins.outputs.power_player }}"
"-PbaseMetalsPlayerJar=${{ steps.dependencies.outputs.basemetals_player }}"
"-PoreSpawnPlayerJar=${{ steps.dependencies.outputs.orespawn_player }}"
-PforgeCapabilityBootstrapJar=${{ steps.dependencies.outputs.bootstrap }}
-PpowerAdvantageDeobfJar=${{ steps.dependencies.outputs.power }}
-PbaseMetalsDeobfJar=${{ steps.dependencies.outputs.basemetals }}
-PoreSpawnDeobfJar=${{ steps.dependencies.outputs.orespawn }}
--no-daemon --stacktrace
shell: bash
run: |
./gradlew $MMD_GRADLE_TOOLCHAINS clean check build javadoc verifyReleaseDependencies verifyReleaseArtifacts \
writeReleaseChecksums verifyEclipseProductionClasspath --no-build-cache --no-daemon --stacktrace \
"-Pforge50MavenizerJar=$MAVENIZER" "-PpowerAdvantageDeobfJar=$POWER_PLAYER" \
"-PbaseMetalsDeobfJar=$METALS_PLAYER" "-PoreSpawnDeobfJar=$ORESPAWN_PLAYER" \
"-PforgeCapabilityBootstrapJar=$POWER_BOOTSTRAP" "-PforgeCapabilityBootstrapSource=$POWER_BOOTSTRAP_SOURCE" \
"-PforgeUnitRegistriesSource=$POWER_REGISTRY_SOURCE"
- name: Upload audited release candidate
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: baseSteam-1.20.1-${{ github.sha }}
name: baseSteam-1.20.6-${{ github.sha }}
if-no-files-found: error
retention-days: 30
path: |
build/libs/baseSteam-2.2.13.120011.jar
build/libs/baseSteam-2.2.13.120011-sources.jar
build/libs/baseSteam-2.2.13.120011-javadoc.jar
build/libs/baseSteam-2.2.14.120061.jar
build/libs/baseSteam-2.2.14.120061-sources.jar
build/libs/baseSteam-2.2.14.120061-javadoc.jar
build/release/SHA256SUMS
CHANGELOG.txt
- name: Upload diagnostics on failure
if: failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: baseSteam-1.20.1-diagnostics-${{ github.sha }}
name: baseSteam-1.20.6-diagnostics-${{ github.sha }}
if-no-files-found: ignore
retention-days: 14
path: |
build/test-results/**
build/reports/**
build/*-run/logs/**
build/problems/**
.ci-dependencies/basePower/build/reports/**
.ci-dependencies/basePower/build/libs-dev/*.jar
Loading
Loading