Merge pull request #9 from SinTh0r4s/buildscript-versioning-and-migration-zip

embed build script version in its file; add zip-packages job to CI; split workflows
This commit is contained in:
Johann Bernhardt authored and GitHub committed 2021-11-15 22:00:57 +01:00
commit ffe697dd74
11 files changed
+252 -44

No files matched your search

+10
View File
@@ -0,0 +1,10 @@
if [ ! -z $(git diff --name-only HEAD HEAD~1 | grep build.gradle) ]; then
new_version="$(git log -n1 --format=format:"%H")"
sed --in-place "s!^//version:.*!//version: $new_version!g" build.gradle
git add build.gradle
git commit -m "[ci skip] update build script version to $new_version"
git push
echo "Updated buildscript version to $new_version";
else
echo "Ignored buildscript version update: no changes detected"
fi
@@ -0,0 +1,24 @@
# This workflow only meant for the source mod you shouldn't bring it into your own project
name: Buildscript maintenance
on:
push:
branches: [ master, main ]
jobs:
buildscript-maintenance:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 2
- name: setup git config
run: |
git config user.name "GitHub CI Bot"
git config user.email "<>"
- name: Ensure build script version is up to date
run: .github/scripts/update-version.sh
+71
View File
@@ -0,0 +1,71 @@
# This workflow only meant for the source mod you shouldn't bring it into your own project
name: Release packages
on:
push:
branches: [ master, main ]
jobs:
zip-packages:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Zip starter
uses: montudor/action-zip@v1
with:
args: >
zip -r starter.zip . \
\
-x "*.git/*" \
\
-x ".github/scripts/update-version.sh" \
-x ".github/workflows/buildscript-maintenance.yml" \
-x ".github/workflows/package-release.yml" \
\
-x "*docs/*" \
-x "README.md" \
-x "LICENSE" \
\
-x "starter.zip" \
-x "migration.zip"
- name: Publish starter package
uses: "marvinpinto/action-automatic-releases@latest"
with:
repo_token: "${{ secrets.GITHUB_TOKEN }}"
automatic_release_tag: "latest-starer"
prerelease: true
title: "Latest starter package"
files: "starter.zip"
- name: Zip migration
uses: montudor/action-zip@v1
with:
args: >
zip -r migration.zip . \
\
-x "*.git/*" \
\
-x ".github/scripts/update-version.sh" \
-x ".github/workflows/buildscript-maintenance.yml" \
-x ".github/workflows/package-release.yml" \
\
-x "*docs/*" \
-x "*src/*" \
-x "LICENSE" \
-x "README.md" \
\
-x "starter.zip" \
-x "migration.zip"
- name: Publish migration package
uses: "marvinpinto/action-automatic-releases@latest"
with:
repo_token: "${{ secrets.GITHUB_TOKEN }}"
automatic_release_tag: "latest-migration"
prerelease: true
title: "Latest migration package"
files: "migration.zip"
+32
View File
@@ -0,0 +1,32 @@
# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle
name: Build pull request
on:
pull_request:
branches: [ master, main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Set up JDK 8
uses: actions/setup-java@v2
with:
java-version: '8'
distribution: 'adopt'
cache: gradle
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Setup the workspace
run: ./gradlew setupCIWorkspace
- name: Build the mod
run: ./gradlew build
@@ -1,13 +1,11 @@
# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle
name: Java CI with Gradle
name: Build and release main branch
on:
push:
branches: [ master, main ]
pull_request:
branches: [ master, main ]
jobs:
build:
+21
View File
@@ -0,0 +1,21 @@
MIT License
Copyright (c) <year> <copyright holders>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+7 -6
View File
@@ -16,12 +16,13 @@ We all have been there! Check out our [FAQ](https://github.com/SinTh0r4s/Example
### Getting started
Creating mod from scratch:
1. Fork this repository (you can keep the fork to simplify merging any build script updates in the future)
2. Clone repository
3. Replace placeholders (edit values in gradle.properties, change example package and class names, etc.)
4. Run `./gradlew setupDecompWorkspace` (if build fails with `Could not find :forgeBin:1.7.10-10.13.4.1614-1.7.10.` this should fix it)
5. Make sure to checkout the rest sections of this file.
6. You are good to go!
1. Unzip [project starter](https://github.com/SinTh0r4s/ExampleMod1.7.10/releases/download/latest-starer/starter.zip) into project directory.
2. Replace placeholders in LICENSE-template and rename it to LICENSE, or remove LICENSE-template and put any other license you like on your code. This is an permissive OSS project and we encourage you participate in OSS movement by having permissive license like one in template. You can find out pros and cons of OSS software in [this article](https://www.freecodecamp.org/news/what-is-great-about-developing-open-source-and-what-is-not/)
3. Ensure your project is under VCS. For example initialise git repository by running `git init; git commit --message "initialized repository"`.
4. Replace placeholders (edit values in gradle.properties, change example package and class names, etc.)
5. Run `./gradlew setupDecompWorkspace` (if build fails with `Could not find :forgeBin:1.7.10-10.13.4.1614-1.7.10.` this should fix it)
6. Make sure to check out the rest sections of this file.
7. You are good to go!
We also have described guidelines for existing mod [migration](docs/migration.md) and [porting](docs/porting.md)
+80 -27
View File
@@ -1,3 +1,4 @@
//version: 04059a9fcbe502f677c7e2e757f97699da5f049f
/*
DO NOT CHANGE THIS FILE!
@@ -7,6 +8,7 @@ Please check https://github.com/SinTh0r4s/ExampleMod1.7.10/blob/main/build.gradl
import com.github.jengelman.gradle.plugins.shadow.tasks.ConfigureShadowRelocation
import java.util.concurrent.TimeUnit
buildscript {
@@ -25,7 +27,7 @@ buildscript {
}
}
dependencies {
classpath 'com.github.GTNH2:ForgeGradle:FG_1.2-SNAPSHOT'
classpath 'com.github.TheElan:ForgeGradle:8816f1d388'
}
}
@@ -46,37 +48,33 @@ idea {
}
}
checkPropertyExists("modName")
checkPropertyExists("modId")
checkPropertyExists("modGroup")
checkPropertyExists("autoUpdateBuildScript")
checkPropertyExists("minecraftVersion")
checkPropertyExists("forgeVersion")
checkPropertyExists("replaceGradleTokenInFile")
checkPropertyExists("gradleTokenModId")
checkPropertyExists("gradleTokenModName")
checkPropertyExists("gradleTokenVersion")
checkPropertyExists("gradleTokenGroupName")
checkPropertyExists("apiPackage")
checkPropertyExists("accessTransformersFile")
checkPropertyExists("usesMixins")
checkPropertyExists("mixinPlugin")
checkPropertyExists("mixinsPackage")
checkPropertyExists("coreModClass")
checkPropertyExists("containsMixinsAndOrCoreModOnly")
checkPropertyExists("usesShadowedDependencies")
checkPropertyExists("developmentEnvironmentUserName")
if(JavaVersion.current() != JavaVersion.VERSION_1_8) {
throw new GradleException("This project requires Java 8, but it's running on " + JavaVersion.current())
}
def checkPropertyExsists(String propertyName) {
def checkPropertyExists(String propertyName) {
if (project.hasProperty(propertyName) == false) {
throw new GradleException("This project requires a property \"" + propertyName + "\"! Please add it your \"gradle.properties\". You can find all properties and their description here: https://github.com/SinTh0r4s/ExampleMod1.7.10/blob/main/gradle.properties")
}
}
checkPropertyExsists("modName")
checkPropertyExsists("modId")
checkPropertyExsists("modGroup")
checkPropertyExsists("minecraftVersion")
checkPropertyExsists("forgeVersion")
checkPropertyExsists("replaceGradleTokenInFile")
checkPropertyExsists("gradleTokenModId")
checkPropertyExsists("gradleTokenModName")
checkPropertyExsists("gradleTokenVersion")
checkPropertyExsists("gradleTokenGroupName")
checkPropertyExsists("apiPackage")
checkPropertyExsists("accessTransformersFile")
checkPropertyExsists("usesMixins")
checkPropertyExsists("mixinPlugin")
checkPropertyExsists("mixinsPackage")
checkPropertyExsists("coreModClass")
checkPropertyExsists("containsMixinsAndOrCoreModOnly")
checkPropertyExsists("usesShadowedDependencies")
checkPropertyExsists("developmentEnvironmentUserName")
String targetPackage = "src/main/java/" + modGroup.toString().replaceAll("\\.", "/")
if(new File(targetPackage).exists() == false) {
throw new GradleException("Could not resolve \"modGroup\"! Could not find " + targetPackage)
@@ -441,7 +439,6 @@ task apiJar(type: Jar) {
getArchiveClassifier().set('api')
}
artifacts {
archives sourcesJar
archives devJar
@@ -449,3 +446,59 @@ artifacts {
archives apiJar
}
}
// Updating
task updateBuildScript {
doLast {
if (updateBuildScript()) return
print("Build script already up-to-date!")
}
}
if (isNewBuildScriptVersionAvailable()) {
if (autoUpdateBuildScript.toBoolean()) {
updateBuildScript()
} else {
println("Build script update available! Run 'gradle updateBuildScript'")
}
}
static URL availableBuildScriptUrl() {
new URL("https://raw.githubusercontent.com/SinTh0r4s/ExampleMod1.7.10/main/build.gradle")
}
static boolean updateBuildScript() {
if (isNewBuildScriptVersionAvailable()) {
def buildscriptFile = new File("build.gradle")
availableBuildScriptUrl().withInputStream { i -> buildscriptFile.withOutputStream { it << i } }
print("Build script updated. Please REIMPORT the project or RESTART your IDE!")
return true
}
return false
}
static boolean isNewBuildScriptVersionAvailable() {
Map parameters = ["connectTimeout": 2000, "readTimeout": 2000]
String currentBuildScript = new File("build.gradle").getText()
String currentBuildScriptHash = getVersionHash(currentBuildScript)
String availableBuildScript = availableBuildScriptUrl().newInputStream(parameters).getText()
String availableBuildScriptHash = getVersionHash(availableBuildScript)
boolean isUpToDate = currentBuildScriptHash.empty || availableBuildScriptHash.empty || currentBuildScriptHash == availableBuildScriptHash
return !isUpToDate
}
static String getVersionHash(String buildScriptContent) {
String versionLine = buildScriptContent.find("^//version: [a-z0-9]*")
if(versionLine != null) {
return versionLine.split(": ").last()
}
return ""
}
configure(updateBuildScript) {
group = 'forgegradle'
description = 'Updates the build script to the latest version'
}
+2 -7
View File
@@ -5,15 +5,10 @@ Migration for the typical mod which doesn't use anything special but Minecraft f
For core plugin, Mixins, shadowing, access transformers, ASM or etc. you'll need to do some extra steps.
If they are missing in this document - we will gladly receive your suggestions/contribution.
1. Copy and replace all files from template to your repository, but:
1. `build.gradle`
2. `src`
3. `LICENSE`
4. `README.md`
5. `build.gradle(.kts)`
1. Copy and replace all files from [template](https://github.com/SinTh0r4s/ExampleMod1.7.10/releases/download/latest-migration/migration.zip) to your repository, but `build.gradle`
2. Copy all repositories from your `build.gradle(.kts)` to `repositories.gradle`
3. Copy all dependencies from your `build.gradle(.kts)` to `dependecies.gradle`
4. replace your `build.gradle(.kts)` with `build.gradle` from template. In case you have written some custom tasks/configurations not present in the template - you'll best to move them to separate file and link it in this, like for example it does this with `dependencies.gradle`
4. replace your `build.gradle(.kts)` with `build.gradle` from template. In case you have written some custom tasks/configurations not present in the template - move them into `addon.gradle`. It will automatically be integrated if present.
5. Adapt `gradle.properties` to your mod
6. Ensure `src/main/resources/mcmod.info` contains `${modId}`, `${modName}`. `${modVersion}` and `${minecraftVersion}`
7. Re-import the project to your IDE (e.g. restart with clean caches in IntelliJ IDEA)
+3
View File
@@ -9,6 +9,9 @@ modGroup = com.myname.mymodid
# The build script relies on git to provide a version via tags. It is super easy and will enable you to always know the
# code base or your binary. Check out this tutorial: https://blog.mattclemente.com/2017/10/13/versioning-with-git-tags/
# Will update your build.gradle automatically whenever an update is available
autoUpdateBuildScript = false
minecraftVersion = 1.7.10
forgeVersion = 10.13.4.1614
+1 -1
View File
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.9.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists