Skip to content

Commit

Permalink
Add new build publisher with discord webhook
Browse files Browse the repository at this point in the history
  • Loading branch information
Prospector committed Apr 11, 2020
1 parent 237bd94 commit 8f5ddbe
Show file tree
Hide file tree
Showing 3 changed files with 217 additions and 9 deletions.
2 changes: 1 addition & 1 deletion Jenkinsfile
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ pipeline {
sh "rm -rf build/libs/"
sh "chmod +x gradlew"
sh "./gradlew clean --stacktrace"
sh "./gradlew build publish --refresh-dependencies --stacktrace"
sh "./gradlew buildAndAttemptRelease publish --refresh-dependencies --stacktrace"

archiveArtifacts artifacts: '**/build/libs/*.jar', fingerprint: true
}
Expand Down
188 changes: 181 additions & 7 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ plugins {
id 'eclipse'
id 'fabric-loom' version '0.2.7-SNAPSHOT'
id 'com.matthewprenger.cursegradle' version '1.4.0'
id 'net.dumbcode.gradlehook' version '1.3.1'
}

sourceCompatibility = 1.8
Expand Down Expand Up @@ -82,18 +83,124 @@ publishing {
}
}

import com.matthewprenger.cursegradle.CurseArtifact

def fullChangelogBuilder = StringBuilder.newInstance()
def curseReleaseType = "release"
def releaseChangelog = ""
def stabilitySuffix = ""

task buildAndAttemptRelease {

}

buildAndAttemptRelease {
def changes = StringBuilder.newInstance()
def proc = "git log --max-count=$project.changelog_max_commit_search --pretty=format:\"%s\"".execute()
def latestCommit = true
def release = false
def cancel = false
def releaseType = project.default_release_type

proc.in.eachLine { line -> // Loops over the lines the git log command returns
if (cancel) {
return
}
if (latestCommit) {
if (line.toString().contains("#release")) {
if (line.toString().contains("#release stable")) {
releaseType = "stable"
} else if (line.toString().contains("#release beta")) {
releaseType = "beta"
curseReleaseType = "beta"
stabilitySuffix = " (Beta)"
} else if (line.toString().contains("#release alpha")) {
releaseType = "alpha"
curseReleaseType = "alpha"
stabilitySuffix = " (Alpha)"
}
release = true
}
}
if (!latestCommit && line.toString().contains("#release")) {
// Cancel if it finds another release (that isn't the first one)
cancel = true
return
}
if (release) {
if (project.changelog_type == "commit_change_tags") {
def splitLine = line.split(/\#change /)
def firstSplit = true
splitLine.each { string ->
if (firstSplit) {
firstSplit = false
return
}
if (string.startsWith("\"")) {
try {
def matches = string =~ /"(.*)"/
def message = matches[0][1]
if (!message.isAllWhitespace()) {
if (changes.length() == 0) {
changes << "- $message"
} else {
changes << "\n- $message"
}
}
} catch (Exception e) {
println "Exception adding changelog message: $string"
}
}
}
} else if (project.changelog_type == "literal_commits") {
if (project.changelog_hide_unimportant_commits.toBoolean() && line.startsWith("Merge") && line.contains("branch")) {
return
}
if (changes.length() == 0) {
changes << "- $line"
} else {
changes << "\n- $line"
}
}
}
if (latestCommit) {
latestCommit = false
}
}
proc.err.eachLine { line -> println line }
proc.waitFor()
if (release) {
println "This build IS scheduled to be released"
releaseChangelog = changes.toString()
dependsOn tasks.getByName("curseforge")
} else {
println "This build is NOT scheduled to be released"
}
dependsOn build
}

curseforge {
apiKey = project.hasProperty("curseforge_api_key") ? curseforge_api_key : "###" //In the GRADLE_USER_HOME /.gradle/gradle.properties file
apiKey = project.hasProperty('terraformersmc_curse_api_key') ? project.property('terraformersmc_curse_api_key') : "###"
project {
id = '373138'
releaseType = 'beta'
addGameVersion project.curse_version
addGameVersion "Java 8"
addGameVersion "Fabric"
id = project.curseforge_id
releaseType = curseReleaseType
project.curseforge_game_versions.split(", ").each {
String gameVersion -> addGameVersion gameVersion
}
changelog = releaseChangelog
mainArtifact(file("${project.buildDir}/libs/${archivesBaseName}-${version}.jar"))
addArtifact sourcesJar
relations {
requiredDependency 'fabric-api'
if (!project.curseforge_required_dependencies.isEmpty()) {
project.curseforge_required_dependencies.split(", ").each {
String dep -> requiredDependency dep
}
}
if (!project.curseforge_optional_dependencies.isEmpty()) {
project.curseforge_optional_dependencies.split(", ").each {
String dep -> optionalDependency dep
}
}
}
afterEvaluate {
uploadTask.dependsOn(remapJar)
Expand All @@ -103,3 +210,70 @@ curseforge {
forgeGradleIntegration = false
}
}

tasks.getByName("curseforge").doLast {
if (project.hasProperty('terraformersmc_announcements_webhook')) {
println "Preparing webhook"
def fileId = (tasks.getByName("curseforge$curseforge_id").property("mainArtifact") as CurseArtifact).fileID
def curseforge_download = "https://www.curseforge.com/minecraft/mc-mods/$project.curseforge_slug/files/$fileId"
def github_download = "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
def release_url = curseforge_download
def discordChangelog = createDiscordChangelog(release_url)

def result = DiscordBuilder.createForm {
if (project.use_project_username.toBoolean()) {
avatar_url = project.project_logo
username = project.project_name
}
embed {
color = Integer.decode(project.project_color)
author {
name = project.project_name + stabilitySuffix
url = project.project_url
}
thumbnail { url = project.project_logo }
title = "$project.project_name v$project.mod_version for $project.minecraft_version Released"
url = release_url
field {
name = "Changes:"
value = discordChangelog
}
field {
name = "Downloads:"
value = "[$curseforge_emote CurseForge]($curseforge_download)"
}
footer {
text = "A $project.loader_name Mod"
icon_url = project.loader_icon
}
}
}.send(project.property('terraformersmc_announcements_webhook'))

println "Discord Webhook Response: " + result.responseCode
}
}

// Truncates changelogs for the Discord Webhook
ext.createDiscordChangelog = { fullChangelogUrl ->
def webhookChangelog = StringBuilder.newInstance()
def changelogLines = releaseChangelog.split("\n")
def maxLines = Integer.decode(project.discord_webhook_changelog_line_limit)
if (changelogLines.length <= maxLines) {
return releaseChangelog
} else {
def lines = 0
changelogLines.find { line ->
if (webhookChangelog.length() == 0) {
webhookChangelog << line
} else {
webhookChangelog << "\n$line"
}
lines++
if (lines >= maxLines) {
webhookChangelog << "\n(+ " + (changelogLines.length - lines) + " more) See [Full Changelog]($fullChangelogUrl)"
return true;
}
}
}
return webhookChangelog.toString()
}
36 changes: 35 additions & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,38 @@ minecraft_version=20w15a
yarn_mappings=20w15a+build.1
loader_version=0.8.2+build.194
fabric_version=0.5.9+build.319-1.16
curse_version=1.16-Snapshot

# Project Metadata
project_name=Campanion
project_url=https://www.curseforge.com/minecraft/mc-mods/campanion
project_logo=https://media.forgecdn.net/avatars/262/472/637220914684106444.png
project_color=0xAC1A20
# default_release_type can be stable, beta, or alpha
default_release_type=beta

# CurseForge Metadata
curseforge_slug=campanion
curseforge_id=373138
curseforge_game_versions=1.16-Snapshot, Fabric
curseforge_required_dependencies=fabric-api
curseforge_optional_dependencies=

# Mod Loader Metadata
loader_icon=https://fabricmc.net/assets/logo.png
loader_name=Fabric

# Discord Emotes
project_emote=<:campanion:696902653497573407>
curseforge_emote=<:curseforge:698031288845729802>
github_emote=<:github:698031289223217152>

# Webhook Options
use_project_username=false

# Changelog Options
# changelog_type can either be literal_commits or commit_change_tags
changelog_type=commit_change_tags
# changelog_hide_unimportant_commits tries to hide Merge commits at the moment
changelog_hide_unimportant_commits=true
changelog_max_commit_search=200
discord_webhook_changelog_line_limit=10

0 comments on commit 8f5ddbe

Please sign in to comment.