diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index dd1169eae..05578a5a3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,47 +1,82 @@ -name: build +name: Build on: [ pull_request, push ] jobs: - build: - strategy: - matrix: - java: [ - 17 # Current Java LTS & minimum supported by Minecraft - ] - os: [ ubuntu-latest ] - runs-on: ${{ matrix.os }} - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Validate Gradle Wrapper - uses: gradle/actions/wrapper-validation@v3 - - name: Gradle Cache - uses: actions/cache@v4 - with: - path: | - ~/.gradle/caches - ~/.gradle/wrapper - .gradle/loom-cache - build/ - key: ${{ runner.os }}-jdk${{ matrix.java }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle.properties', '**/gradle-wrapper.properties', '.github/workflows/build.yml') }} - - name: Setup JDK ${{ matrix.java }} - uses: actions/setup-java@v4 - with: - distribution: 'temurin' - java-version: ${{ matrix.java }} - - name: Make Gradle Wrapper Executable - if: ${{ runner.os != 'Windows' }} - run: chmod +x ./gradlew - - name: Build - # doesn't actually publish, as no secrets are passed in, just makes sure that publishing works - run: ./gradlew publish --no-daemon - - name: Capture Build Artifacts - if: ${{ runner.os == 'Linux' && matrix.java == '17' }} - uses: actions/upload-artifact@v4 - with: - name: Artifacts - path: | - common/build/libs/ - fabric/build/libs/ - forge/build/libs/ + build: + runs-on: ubuntu-latest + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Setup Java + run: echo "JAVA_HOME=$JAVA_HOME_17_X64" >> "$GITHUB_ENV" + + - name: Loom Cache + uses: actions/cache@v4 + with: + path: "**/.gradle/loom-cache" + key: "${{ runner.os }}-gradle-${{ hashFiles('**/libs.versions.*', '**/*.gradle*', '**/gradle-wrapper.properties') }}" + restore-keys: "${{ runner.os }}-gradle-" + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v3 + with: + gradle-home-cache-cleanup: true + cache-read-only: ${{ !endsWith(github.ref_name, '/dev') }} + + - name: Validate Gradle Wrapper Integrity + uses: gradle/wrapper-validation-action@v2 + + - name: Build + # doesn't actually publish, as no secrets are passed in, just makes sure that publishing works + run: ./gradlew :forge:remapTestmodJar :fabric:remapTestmodJar publish --no-daemon + + - name: Capture Build Artifacts + uses: actions/upload-artifact@v4 + with: + name: Artifacts + path: | + common/build/libs/ + fabric/build/libs/ + fabric/build/devlibs/ + forge/build/libs/ + forge/build/devlibs/ + + test: + strategy: + matrix: + loader: [ forge, fabric ] + needs: build + runs-on: ubuntu-latest + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Download build artifact + uses: actions/download-artifact@v4 + with: + name: Artifacts + + - name: Setup Environment Variables + run: | + echo "MOD_VERSION=$(grep '^mod_version =' gradle.properties | cut -d'=' -f2 | tr -d ' ')" >> "$GITHUB_ENV" + echo "MINECRAFT_VERSION=$(grep '^minecraft_version =' gradle.properties | cut -d'=' -f2 | tr -d ' ')" >> "$GITHUB_ENV" + echo "FABRIC_API_VERSION=$(grep '^fabric_api_version =' gradle.properties | cut -d'=' -f2 | tr -d ' ' | sed 's/+.*//')" >> "$GITHUB_ENV" + + - name: Move Test Mod and Flywheel into run/mods + run: | + mkdir -p run/mods + cp ${{ matrix.loader }}/build/libs/flywheel-${{ matrix.loader }}-${{ env.MINECRAFT_VERSION }}-${{ env.MOD_VERSION }}.jar run/mods + cp ${{ matrix.loader }}/build/devlibs/flywheel-${{ matrix.loader }}-${{ env.MINECRAFT_VERSION }}-${{ env.MOD_VERSION }}-testmod.jar run/mods + + # Lock to a specific commit, it would be bad if the tag is re-pushed with unwanted changes + - name: Run the MC client + uses: 3arthqu4ke/mc-runtime-test@e72f8fe1134aabf6fc749a2a8c09bb56dd7d283e + with: + mc: ${{ env.MINECRAFT_VERSION }} + modloader: ${{ matrix.loader }} + regex: .*${{ matrix.loader }}.* + mc-runtime-test: none + java: 17 + fabric-api: ${{ matrix.loader == 'fabric' && env.FABRIC_API_VERSION || 'none' }} diff --git a/buildSrc/src/main/kotlin/dev/engine_room/gradle/subproject/SubprojectPlugin.kt b/buildSrc/src/main/kotlin/dev/engine_room/gradle/subproject/SubprojectPlugin.kt index 6c3230f0d..e982ea04d 100644 --- a/buildSrc/src/main/kotlin/dev/engine_room/gradle/subproject/SubprojectPlugin.kt +++ b/buildSrc/src/main/kotlin/dev/engine_room/gradle/subproject/SubprojectPlugin.kt @@ -4,6 +4,7 @@ import dev.engine_room.gradle.jarset.JarSetExtension import dev.engine_room.gradle.nullability.PackageInfosExtension import dev.engine_room.gradle.transitive.TransitiveSourceSetsExtension import net.fabricmc.loom.api.LoomGradleExtensionAPI +import net.fabricmc.loom.task.RemapJarTask import org.gradle.api.JavaVersion import org.gradle.api.Plugin import org.gradle.api.Project @@ -11,6 +12,7 @@ import org.gradle.api.plugins.BasePluginExtension import org.gradle.api.plugins.JavaPluginExtension import org.gradle.api.publish.PublishingExtension import org.gradle.api.publish.tasks.GenerateModuleMetadata +import org.gradle.api.tasks.SourceSetContainer import org.gradle.api.tasks.bundling.AbstractArchiveTask import org.gradle.api.tasks.compile.JavaCompile import org.gradle.api.tasks.javadoc.Javadoc @@ -18,6 +20,7 @@ import org.gradle.jvm.tasks.Jar import org.gradle.jvm.toolchain.JavaLanguageVersion import org.gradle.kotlin.dsl.* import org.gradle.language.jvm.tasks.ProcessResources +import java.io.File class SubprojectPlugin: Plugin { override fun apply(project: Project) { @@ -32,6 +35,9 @@ class SubprojectPlugin: Plugin { setupDependencies(project) configureTasks(project) setupPublishing(project) + + if (project.path != ":common") + setupTestMod(project) } private fun setBaseProperties(project: Project) { @@ -164,6 +170,26 @@ class SubprojectPlugin: Plugin { } } } + + private fun setupTestMod(project: Project) { + val sourceSets = project.extensions.getByName("sourceSets") as SourceSetContainer + + val testmodJar = project.tasks.register("testmodJar") { + from (sourceSets["testmod"].output) + val file = File(project.layout.buildDirectory.asFile.get(), "devlibs"); + destinationDirectory.set(file) + archiveClassifier = "testmod" + } + + val remapTestmodJar = project.tasks.register("remapTestmodJar") { + dependsOn(testmodJar) + inputFile.set(testmodJar.get().archiveFile) + archiveClassifier = "testmod" + addNestedDependencies = false + classpath.from(sourceSets["testmod"].compileClasspath) + } + project.tasks["build"].dependsOn(remapTestmodJar) + } } val processResourcesExpandFiles = listOf("pack.mcmeta", "fabric.mod.json", "META-INF/mods.toml") diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index 865773be5..9922f335e 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -12,6 +12,10 @@ val lib = sourceSets.create("lib") val backend = sourceSets.create("backend") val stubs = sourceSets.create("stubs") val main = sourceSets.getByName("main") +val testmod = sourceSets.create("testmod") { + compileClasspath += main.compileClasspath + runtimeClasspath += main.runtimeClasspath +} transitiveSourceSets { compileClasspath = main.compileClasspath diff --git a/fabric/src/testmod/java/dev/engine_room/flywheel/FlywheelTestModClient.java b/fabric/src/testmod/java/dev/engine_room/flywheel/FlywheelTestModClient.java new file mode 100644 index 000000000..070fa1c16 --- /dev/null +++ b/fabric/src/testmod/java/dev/engine_room/flywheel/FlywheelTestModClient.java @@ -0,0 +1,22 @@ +package dev.engine_room.flywheel; + +import org.spongepowered.asm.mixin.MixinEnvironment; + +import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; + +public class FlywheelTestModClient implements ClientModInitializer { + private int ticks = 0; + + @Override + public void onInitializeClient() { + if (Boolean.getBoolean("flywheel.autoTest")) { + ClientTickEvents.END_CLIENT_TICK.register(client -> { + if (++ticks == 50) { + MixinEnvironment.getCurrentEnvironment().audit(); + client.stop(); + } + }); + } + } +} diff --git a/fabric/src/testmod/resources/fabric.mod.json b/fabric/src/testmod/resources/fabric.mod.json new file mode 100644 index 000000000..e7059786b --- /dev/null +++ b/fabric/src/testmod/resources/fabric.mod.json @@ -0,0 +1,13 @@ +{ + "schemaVersion": 1, + "id": "${mod_id}-testmod", + "name": "${mod_name} Test Mod", + "version": "1.0.0", + "environment": "*", + "license": "${mod_license}", + "entrypoints": { + "client": [ + "dev.engine_room.flywheel.FlywheelTestModClient" + ] + } +} diff --git a/forge/build.gradle.kts b/forge/build.gradle.kts index d1c6b3617..06e4a2619 100644 --- a/forge/build.gradle.kts +++ b/forge/build.gradle.kts @@ -12,6 +12,10 @@ val lib = sourceSets.create("lib") val backend = sourceSets.create("backend") val stubs = sourceSets.create("stubs") val main = sourceSets.getByName("main") +val testmod = sourceSets.create("testmod") { + compileClasspath += main.compileClasspath + runtimeClasspath += main.runtimeClasspath +} transitiveSourceSets { compileClasspath = main.compileClasspath diff --git a/forge/src/testmod/java/dev/engine_room/flywheel/FlywheelTestModClient.java b/forge/src/testmod/java/dev/engine_room/flywheel/FlywheelTestModClient.java new file mode 100644 index 000000000..cb2b9513f --- /dev/null +++ b/forge/src/testmod/java/dev/engine_room/flywheel/FlywheelTestModClient.java @@ -0,0 +1,30 @@ +package dev.engine_room.flywheel; + +import org.spongepowered.asm.mixin.MixinEnvironment; + +import net.minecraft.client.Minecraft; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; + +@Mod("flywheel-testmod") +public class FlywheelTestModClient { + private int ticks = 0; + + public FlywheelTestModClient() { + if (Boolean.getBoolean("flywheel.autoTest")) { + IEventBus modEventBus = FMLJavaModLoadingContext.get() + .getModEventBus(); + + modEventBus.addListener((TickEvent.ClientTickEvent e) -> { + if (e.phase == TickEvent.Phase.END) { + if (++ticks == 50) { + MixinEnvironment.getCurrentEnvironment().audit(); + Minecraft.getInstance().stop(); + } + } + }); + } + } +} diff --git a/forge/src/testmod/resources/META-INF/mods.toml b/forge/src/testmod/resources/META-INF/mods.toml new file mode 100644 index 000000000..52d518889 --- /dev/null +++ b/forge/src/testmod/resources/META-INF/mods.toml @@ -0,0 +1,8 @@ +modLoader = "javafml" +loaderVersion = "[0,)" +license = "${mod_license}" + +[[mods]] +modId = "${mod_id}-testmod" +version = "1.0.0" +displayName = "${mod_name} Test Mod"