diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..505e18d --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,69 @@ +name: Publish to Maven Central Repository + +on: + push: + branches: + - master + +jobs: + publish: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + - name: Extract version from build.gradle.kts + id: get_version + run: echo "::set-output name=VERSION::$(./gradlew -q printVersion)" + + - name: Create Git tag + env: + VERSION: ${{ steps.get_version.outputs.VERSION }} + run: | + git config --global user.name "github-actions[bot]" + git config --global user.email "github-actions[bot]@users.noreply.github.com" + git tag -a "v${VERSION}" -m "Release version ${VERSION}" + git push --force origin "v${VERSION}" + + - name: Verify GPG key import + run: | + gpg --list-keys + env: + GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }} + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} + + - name: Set up GPG + run: | + # Create gpg directory + mkdir -p ~/.gnupg/ + chmod 700 ~/.gnupg/ + + # Configure GPG + echo "use-agent" > ~/.gnupg/gpg.conf + echo "pinentry-mode loopback" >> ~/.gnupg/gpg.conf + + # Import private key + echo -n "$GPG_PRIVATE_KEY" > private.gpg + gpg --batch --import private.gpg + rm private.gpg + + # Trust the key + echo -n "057F00512A25D4A1:6:" | gpg --batch --import-ownertrust + env: + GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }} + + - name: Sign all publications + run: ./gradlew signAllPublications + env: + ORG_GRADLE_PROJECT_signingKey: ${{ secrets.GPG_PRIVATE_KEY }} + ORG_GRADLE_PROJECT_signingPassword: ${{ secrets.GPG_PASSPHRASE }} + + - name: Publish to Maven Central + env: + OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} + OSSRH_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} + run: ./gradlew publishAllPublicationsToMavenCentralRepository diff --git a/LICENSE b/LICENSE index e97da5b..17d54ff 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020~2025 Hectodata co,. Ltd +Copyright (c) 2024~2025 Hectodata co,. Ltd Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/build.gradle.kts b/build.gradle.kts index ad66ffa..2f34332 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,14 +1,66 @@ +import com.vanniktech.maven.publish.JavaLibrary +import com.vanniktech.maven.publish.JavadocJar +import com.vanniktech.maven.publish.SonatypeHost + plugins { java + signing + id("com.vanniktech.maven.publish") version "0.30.0" } + group = "io.codef.api" -version = "2.0.0-ALPHA-01" +version = "2.0.0-alpha+001" + +signing { + useGpgCmd() + sign(publishing.publications) +} repositories { mavenCentral() } +mavenPublishing { + configure(JavaLibrary(JavadocJar.Javadoc(), true)) + publishToMavenCentral(SonatypeHost.CENTRAL_PORTAL) + + coordinates("io.codef.api", "easycodef-jdk", version.toString()) + pom { + url = "api.codef.io" + name = "easycodef-jdk-v2" + description = "Advanced EasyCodef Library for JDK" + inceptionYear = "2024" + + licenses { + license { + name = "MIT License" + url = "https://opensource.org/licenses/MIT" + distribution = "https://opensource.org/licenses/MIT" + } + } + developers { + developer { + id = "happybean" + name = "Haebin Byeon" + email = "happybean@hecto.co.kr" + } + } + + scm { + connection = "scm:git:git@github.com:codef-io/easycodef-jdk-v2.git" + developerConnection = "scm:git:ssh://github.com/codef-io/easycodef-jdk-v2.git" + url = "https://github.com/codef-io/easycodef-jdk-v2" + } + + issueManagement { + system = "GitHub" + url = "https://github.com/codef-io/easycodef-jdk-v2/issues" + } + } +} + + dependencies { /** @@ -40,16 +92,19 @@ dependencies { testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.11.3") } + java { toolchain { - languageVersion = JavaLanguageVersion.of(17) + languageVersion.set(JavaLanguageVersion.of(17)) } } -tasks.withType().configureEach { - options.compilerArgs.add("-Xlint:all") +tasks.test { + useJUnitPlatform() } -tasks.named("test") { - useJUnitPlatform() +tasks.register("printVersion") { + doLast { + println(project.version) + } } \ No newline at end of file diff --git a/private.gpg b/private.gpg new file mode 100644 index 0000000..926fe36 --- /dev/null +++ b/private.gpg @@ -0,0 +1,107 @@ +-----BEGIN PGP PRIVATE KEY BLOCK----- + +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 +=ejRz +-----END PGP PRIVATE KEY BLOCK----- diff --git a/src/main/java/io/codef/api/CodefException.java b/src/main/java/io/codef/api/CodefException.java index f491000..a21f2b5 100644 --- a/src/main/java/io/codef/api/CodefException.java +++ b/src/main/java/io/codef/api/CodefException.java @@ -1,7 +1,12 @@ package io.codef.api; +import java.io.Serial; + public class CodefException extends RuntimeException { + @Serial + private static final long serialVersionUID = 1L; + private static final String LOG_WITH_CAUSE_FORMAT = "%s\n→ %s\n\n"; private final CodefError codefError; diff --git a/src/test/java/io/codef/api/EasyCodefTokenTest.java b/src/test/java/io/codef/api/EasyCodefTokenTest.java index dfce55d..aa99dcc 100644 --- a/src/test/java/io/codef/api/EasyCodefTokenTest.java +++ b/src/test/java/io/codef/api/EasyCodefTokenTest.java @@ -9,5 +9,6 @@ public class EasyCodefTokenTest { @Test public void usageExample() { + } }