diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 07049f373..d968f32d2 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,7 +1,21 @@ name: Release LITIENGINE on: - workflow_dispatch + workflow_dispatch: + inputs: + incrementVersion: + type: choice + description: "increment version?" + required: true + default: 'none' + options: + - none + - patch + - minor + - major + schedule: + # Midnight every day + - cron: "0 0 * * *" jobs: gradle: @@ -13,36 +27,38 @@ jobs: steps: - uses: actions/checkout@v3 with: - fetch-depth: 10 + fetch-depth: 0 - name: Set up JDK 19 uses: actions/setup-java@v3 with: distribution: temurin java-version: 19 - - - name: Prepare & publish release + - name: Print project version + uses: gradle/gradle-build-action@v2 + with: + arguments: printGitSemVer + - name: Increment patch version + if: inputs.incrementVersion == 'patch' + uses: gradle/gradle-build-action@v2 + with: + arguments: incrementPatchVersion + - name: Increment minor version + if: inputs.incrementVersion == 'minor' + uses: gradle/gradle-build-action@v2 + with: + arguments: incrementMinorVersion + - name: Increment major version + if: inputs.incrementVersion == 'major' + uses: gradle/gradle-build-action@v2 + with: + arguments: incrementMajorVersion + - name: Publish uses: gradle/gradle-build-action@v2 env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - GPG_SIGNING_KEY: ${{ secrets.GPG_SIGNING_KEY }} - GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - NEXUS_USERNAME: ${{ secrets.OSSRH_USERNAME }} - NEXUS_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} + ORG_GRADLE_PROJECT_sonatypeUsername: ${{ secrets.OSSRH_USERNAME }} + ORG_GRADLE_PROJECT_sonatypePassword: ${{ secrets.OSSRH_PASSWORD }} + ORG_GRADLE_PROJECT_signingKey: ${{ secrets.PGP_SECRET }} + ORG_GRADLE_PROJECT_signingPassword: ${{ secrets.PGP_PASSPHRASE }} with: arguments: | - prepareVote - publishRelease - --info - -x test - -Prc=1 - -Pgh - -Prelease=true - -PskipJavadoc - -PskipSpotless - -PghGitSourceUsername=gurkenlabs - -PghGitSourcePassword=$GITHUB_TOKEN - -PghNexusUsername=$NEXUS_USERNAME - -PghNexusPassword=$NEXUS_PASSWORD - -PuseInMemoryKey=true - -Psigning.inMemoryKey=$GPG_SIGNING_KEY - -Psigning.password=$GPG_PASSPHRASE + publishToSonatype closeSonatypeStagingRepository diff --git a/.github/workflows/snapshot.yml b/.github/workflows/snapshot.yml deleted file mode 100644 index ae25d1323..000000000 --- a/.github/workflows/snapshot.yml +++ /dev/null @@ -1,55 +0,0 @@ -name: Build nightly SNAPSHOT - -on: - workflow_dispatch: - schedule: - # Midnight every day - - cron: "0 0 * * *" - push: - # Rerun if workflow changes - branches: - - 'master' - - 'snapshot-test' - paths: - - '**/snapshot.yml' - -jobs: - gradle: - if: github.repository_owner == 'gurkenlabs' - name: Publish nightly snapshot - runs-on: ubuntu-latest - permissions: - contents: read - packages: read - steps: - - uses: actions/checkout@v3 - with: - fetch-depth: 10 - - name: Set up JDK 19 - uses: actions/setup-java@v3 - with: - distribution: temurin - java-version: 19 - - name: Publish - uses: gradle/gradle-build-action@v2 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - GPG_SIGNING_KEY: ${{ secrets.GPG_SIGNING_KEY }} - GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - NEXUS_USERNAME: ${{ secrets.OSSRH_USERNAME }} - NEXUS_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} - with: - arguments: | - prepareVote - -Prc=1 - -Pgh - -Prelease=false - -PskipJavadoc - -PskipSpotless - -PghGitSourceUsername=gurkenlabs - -PghGitSourcePassword=$GITHUB_TOKEN - -PghNexusUsername=$NEXUS_USERNAME - -PghNexusPassword=$NEXUS_PASSWORD - -PuseInMemoryKey=true - -Psigning.inMemoryKey=$GPG_SIGNING_KEY - -Psigning.password=$GPG_PASSPHRASE diff --git a/build.gradle b/build.gradle index 55bd1f8a2..30f9576a9 100644 --- a/build.gradle +++ b/build.gradle @@ -1,14 +1,28 @@ plugins { + id "java" alias libs.plugins.spotless alias libs.plugins.versions alias libs.plugins.dependencyCheck alias libs.plugins.grgit alias libs.plugins.semanticVersioning - id "java" + alias libs.plugins.nexusPublish } +apply from: "$rootDir/gradle/licensing.gradle" apply from: "$rootDir/gradle/versioning.gradle" subprojects { project.version = rootProject.version } + +group = gurkenlabs_group + +nexusPublishing { + useStaging.set(!isSnapshotVersion()) + repositories { + sonatype { + username = project.findProperty('sonatypeUsername') ?: project.findProperty('OSSRH_USERNAME') ?: '' + password = project.findProperty('sonatypePassword') ?: project.findProperty('OSSRH_PASSWORD') ?: '' + } + } +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a9a7bde26..f5cae3021 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -36,6 +36,7 @@ junit = ["junit-api", "junit-params", "junit-engine"] [plugins] beryxRuntime = "org.beryx.runtime:1.13.0" +nexusPublish = "io.github.gradle-nexus.publish-plugin:1.3.0" sonarQube = "org.sonarqube:4.0.0.2929" spotless = "com.diffplug.spotless:6.17.0" versions = "com.github.ben-manes.versions:0.46.0" diff --git a/gradle/licensing.gradle b/gradle/licensing.gradle index 9845b3326..5843e7050 100644 --- a/gradle/licensing.gradle +++ b/gradle/licensing.gradle @@ -1,25 +1,27 @@ +ext.LITIENGINE_artifact = "litiengine" ext.LITIENGINE_name = "LITIENGINE" ext.LITIENGINE_description = "The FOSS 2D Java game engine." +ext.LITIENGINE_url = "https://litiengine.com/" +ext.LITIENGINE_scm_url = "https://github.com/gurkenlabs/litiengine" +ext.LITIENGINE_scm_con = "scm:https://github.com/gurkenlabs/litiengine.git" +ext.LITIENGINE_scm_devCon = "scm:git@github.com:gurkenlabs/litiengine.git" + +ext.MIT_name = "MIT" +ext.MIT_url = "https://mit-license.org/" + +ext.utiLITI_artifact = "utiliti" ext.utiLITI_name = "utiLITI" ext.utiLITI_description = "$utiLITI_name is the official project / asset manager and map editor for $LITIENGINE_name." + +ext.gurkenlabs_group = "de.gurkenlabs" ext.gurkenlabs_name = "gurkenlabs" ext.gurkenlabs_description = "Two Bavarian brothers, one goal: Create the purest, most comprehensible Java 2D game engine out there." ext.gurkenlabs_url = "https://gurkenlabs.de/" ext.copyright = "2014-${Calendar.getInstance().get(Calendar.YEAR)} $gurkenlabs_name" -tasks.register("createLicenseProperties") { - dependsOn processResources - doLast { - new File("$buildDir/resources/main/licensing.properties").withWriter { w -> - Properties p = new Properties() - p['copyright'] = copyright.toString() - p['website'] = gurkenlabs_url - p['version'] = version - p.store w, null - } - } -} -classes { - dependsOn createLicenseProperties -} - +ext.steffen_id = "sQn" +ext.steffen_mail = "steffen@gurkenlabs.de" +ext.steffen_name = "Steffen Wilke" +ext.matthias_id = "nightm4re" +ext.matthias_mail = "matthias@gurkenlabs.de" +ext.matthias_name = "Matthias Wilke" diff --git a/gradle/publishing.gradle b/gradle/publishing.gradle new file mode 100644 index 000000000..b52688db3 --- /dev/null +++ b/gradle/publishing.gradle @@ -0,0 +1,55 @@ +apply plugin: "maven-publish" +apply plugin: "signing" + +java { + withSourcesJar() + withJavadocJar() +} + +publishing { + publications { + mavenJava(MavenPublication) { + groupId = gurkenlabs_group + artifactId = LITIENGINE_artifact + version = project.version + from components.java + pom { + name.set(LITIENGINE_name) + description.set(LITIENGINE_description) + url.set(LITIENGINE_url) + licenses { + license { + name.set(MIT_name) + url.set(MIT_url) + } + } + developers { + developer { + id.set(steffen_id) + name.set(steffen_name) + email.set(steffen_mail) + } + developer { + id.set(matthias_id) + name.set(matthias_name) + email.set(matthias_mail) + } + } + scm { + connection.set(LITIENGINE_scm_con) + developerConnection.set(LITIENGINE_scm_devCon) + url.set(LITIENGINE_scm_url) + } + } + } + } +} + +signing { + if (project.hasProperty("signingKey")) { + useInMemoryPgpKeys(findProperty("signingKey"), findProperty("signingPassword")) + } else { + useGpgCmd() + } + sign(publishing.publications.mavenJava) +} diff --git a/gradle/versioning.gradle b/gradle/versioning.gradle index 9626411f6..97f804b7c 100644 --- a/gradle/versioning.gradle +++ b/gradle/versioning.gradle @@ -91,7 +91,7 @@ def getLatestTag() { getSortedGitTags().last().name } -def isSnapshotVersion() { +ext.isSnapshotVersion = { -> project.version.toString().contains("dev") || project.version.toString().contains("noTag") } diff --git a/litiengine/build.gradle b/litiengine/build.gradle index 883ff5aa4..958e3a766 100644 --- a/litiengine/build.gradle +++ b/litiengine/build.gradle @@ -1,7 +1,5 @@ plugins { id "java-library" - id "signing" - id "maven-publish" alias libs.plugins.sonarQube } @@ -15,5 +13,6 @@ dependencies { } apply from: "$rootDir/gradle/encoding.gradle" -apply from: "$rootDir/gradle/testing.gradle" +apply from: "$rootDir/gradle/publishing.gradle" apply from: "$rootDir/gradle/sonarqube.gradle" +apply from: "$rootDir/gradle/testing.gradle" diff --git a/settings.gradle b/settings.gradle index e2f45130b..75b199e84 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,4 +1,3 @@ - pluginManagement { repositories { gradlePluginPortal() diff --git a/utiliti/build.gradle b/utiliti/build.gradle index 4d74ba45b..333d11063 100644 --- a/utiliti/build.gradle +++ b/utiliti/build.gradle @@ -7,7 +7,6 @@ plugins { } apply from: "$rootDir/gradle/encoding.gradle" -apply from: "$rootDir/gradle/licensing.gradle" apply from: "$rootDir/gradle/testing.gradle" sourceSets { @@ -65,3 +64,19 @@ runtime { } } } + +tasks.register("createLicenseProperties") { + dependsOn processResources + doLast { + new File("$buildDir/resources/main/licensing.properties").withWriter { w -> + Properties p = new Properties() + p['copyright'] = copyright.toString() + p['website'] = gurkenlabs_url + p['version'] = version + p.store w, null + } + } +} +classes { + dependsOn createLicenseProperties +}