From ddc9988b39ba152c4c6b3794d93d703195daa92d Mon Sep 17 00:00:00 2001 From: "firecrawl-spring[bot]" <254786068+firecrawl-spring[bot]@users.noreply.github.com> Date: Sun, 1 Mar 2026 08:47:19 -0500 Subject: [PATCH 1/3] feat(java-sdk): add Maven Central publish workflow (#2947) * feat(java-sdk): add Maven Central publish workflow - Add signing plugin and OSSRH repository config to build.gradle.kts - Add publish-java-sdk.yml workflow that auto-publishes on version bump - Add Java support to version check script (reads build.gradle.kts, checks Maven Central) Required secrets: MAVEN_USERNAME, MAVEN_PASSWORD, GPG_SIGNING_KEY, GPG_SIGNING_PASSWORD Co-Authored-By: micahstairs * fix(java-sdk): switch to Central Portal publishing via vanniktech plugin The legacy OSSRH endpoints (s01.oss.sonatype.org) don't work with the new Central Portal (central.sonatype.com). Switch to the vanniktech maven-publish plugin which has native Central Portal support. - Replace manual maven-publish + signing with com.vanniktech.maven.publish - Use SonatypeHost.CENTRAL_PORTAL target - Update workflow env vars to match plugin conventions - Publish command: publishAndReleaseToMavenCentral Co-Authored-By: micahstairs * Apply suggestion from @cubic-dev-ai[bot] Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> * chore(java-sdk): update GitHub org from mendableai to firecrawl Co-Authored-By: micahstairs * chore: fix example output in version check script docstring Co-Authored-By: micahstairs --------- Co-authored-by: firecrawl-spring[bot] <254786068+firecrawl-spring[bot]@users.noreply.github.com> Co-authored-by: micahstairs Co-authored-by: Micah Stairs Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> --- .../scripts/check_version_has_incremented.py | 38 ++++++++++- .github/workflows/publish-java-sdk.yml | 68 +++++++++++++++++++ apps/java-sdk/README.md | 2 +- apps/java-sdk/build.gradle.kts | 48 +++++++------ 4 files changed, 131 insertions(+), 25 deletions(-) create mode 100644 .github/workflows/publish-java-sdk.yml diff --git a/.github/scripts/check_version_has_incremented.py b/.github/scripts/check_version_has_incremented.py index 251e955275..34c56d8387 100644 --- a/.github/scripts/check_version_has_incremented.py +++ b/.github/scripts/check_version_has_incremented.py @@ -8,11 +8,16 @@ Published version: 0.0.21 true -python .github/scripts/check_version_has_incremented.py python ./apps/python-sdk/firecrawl firecrawl-py +python .github/scripts/check_version_has_incremented.py python ./apps/python-sdk/firecrawl firecrawl-py Local version: 0.0.11 Published version: 0.0.11 false +python .github/scripts/check_version_has_incremented.py java ./apps/java-sdk com.firecrawl:firecrawl-java +Local version: 1.0.0 +Published version: 0.0.0 (0.0.0 means not yet published on Maven Central) +true + """ import json import os @@ -53,6 +58,30 @@ def get_npm_version(package_name: str) -> str: version = response.json()['version'] return version.strip() +def get_gradle_version(file_path: str) -> str: + """Extract version string from build.gradle.kts.""" + build_file = Path(file_path).read_text() + version_match = re.search(r'^version\s*=\s*["\']([^"\']*)["\']', build_file, re.M) + if version_match: + return version_match.group(1).strip() + raise RuntimeError("Unable to find version string in build.gradle.kts.") + +def get_maven_central_version(package_name: str) -> str: + """Get latest version of Java package from Maven Central. package_name should be groupId:artifactId.""" + group_id, artifact_id = package_name.split(":") + group_path = group_id.replace(".", "/") + url = f"https://repo1.maven.org/maven2/{group_path}/{artifact_id}/maven-metadata.xml" + response = requests.get(url) + if response.status_code == 404: + return "0.0.0" + response.raise_for_status() + version_match = re.search(r"(.*?)", response.text) + if not version_match: + version_match = re.search(r"(.*?)", response.text) + if version_match: + return version_match.group(1).strip() + return "0.0.0" + # def get_rust_version(file_path: str) -> str: # """Extract version string from Cargo.toml.""" # cargo_toml = toml.load(file_path) @@ -87,6 +116,11 @@ def is_version_incremented(local_version: str, published_version: str) -> bool: current_version = get_js_version(os.path.join(package_path, 'package.json')) # Get published version from npm published_version = get_npm_version(package_name) + elif package_type == "java": + # Get current version from build.gradle.kts + current_version = get_gradle_version(os.path.join(package_path, 'build.gradle.kts')) + # Get published version from Maven Central + published_version = get_maven_central_version(package_name) # if package_type == "rust": # # Get current version from Cargo.toml # current_version = get_rust_version(os.path.join(package_path, 'Cargo.toml')) @@ -94,7 +128,7 @@ def is_version_incremented(local_version: str, published_version: str) -> bool: # published_version = get_crates_version(package_name) else: - raise ValueError("Invalid package type. Use 'python' or 'js'.") + raise ValueError("Invalid package type. Use 'python', 'js', or 'java'.") # Print versions for debugging # print(f"Local version: {current_version}") diff --git a/.github/workflows/publish-java-sdk.yml b/.github/workflows/publish-java-sdk.yml new file mode 100644 index 0000000000..fe464ae3d5 --- /dev/null +++ b/.github/workflows/publish-java-sdk.yml @@ -0,0 +1,68 @@ +name: Publish Java SDK + +on: + push: + branches: + - main + paths: + - 'apps/java-sdk/**' + +jobs: + publish: + name: Publish to Maven Central + runs-on: blacksmith-2vcpu-ubuntu-2404 + steps: + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.x' + + - name: Install version check dependencies + run: pip install requests packaging + + - name: Run version check script + id: version_check + run: | + VERSION_INCREMENTED=$(python .github/scripts/check_version_has_incremented.py java ./apps/java-sdk com.firecrawl:firecrawl-java) + echo "VERSION_INCREMENTED=$VERSION_INCREMENTED" >> $GITHUB_ENV + + - name: Set up JDK 11 + if: ${{ env.VERSION_INCREMENTED == 'true' }} + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: '11' + + - name: Cache Gradle packages + if: ${{ env.VERSION_INCREMENTED == 'true' }} + uses: actions/cache@v4 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ${{ runner.os }}-gradle-${{ hashFiles('apps/java-sdk/**/*.gradle.kts', 'apps/java-sdk/gradle/wrapper/gradle-wrapper.properties') }} + restore-keys: | + ${{ runner.os }}-gradle- + + - name: Grant execute permission for gradlew + if: ${{ env.VERSION_INCREMENTED == 'true' }} + working-directory: ./apps/java-sdk + run: chmod +x gradlew + + - name: Build + if: ${{ env.VERSION_INCREMENTED == 'true' }} + working-directory: ./apps/java-sdk + run: ./gradlew build -x test + + - name: Publish to Maven Central + if: ${{ env.VERSION_INCREMENTED == 'true' }} + working-directory: ./apps/java-sdk + env: + ORG_GRADLE_PROJECT_mavenCentralUsername: ${{ secrets.MAVEN_CENTRAL_USERNAME }} + ORG_GRADLE_PROJECT_mavenCentralPassword: ${{ secrets.MAVEN_CENTRAL_PASSWORD }} + ORG_GRADLE_PROJECT_signingInMemoryKey: ${{ secrets.GPG_SIGNING_KEY }} + ORG_GRADLE_PROJECT_signingInMemoryKeyPassword: ${{ secrets.GPG_SIGNING_PASSWORD }} + run: ./gradlew publishAndReleaseToMavenCentral --no-configuration-cache diff --git a/apps/java-sdk/README.md b/apps/java-sdk/README.md index c205c738e6..6fc05e9444 100644 --- a/apps/java-sdk/README.md +++ b/apps/java-sdk/README.md @@ -339,7 +339,7 @@ FirecrawlClient client = FirecrawlClient.builder() ```bash # Clone the repository (if you haven't already) -git clone https://github.com/mendableai/firecrawl.git +git clone https://github.com/firecrawl/firecrawl.git cd firecrawl/apps/java-sdk # Build the project diff --git a/apps/java-sdk/build.gradle.kts b/apps/java-sdk/build.gradle.kts index 3ec9671476..2bf8bb9277 100644 --- a/apps/java-sdk/build.gradle.kts +++ b/apps/java-sdk/build.gradle.kts @@ -1,6 +1,6 @@ plugins { `java-library` - `maven-publish` + id("com.vanniktech.maven.publish") version "0.30.0" } group = "com.firecrawl" @@ -9,8 +9,6 @@ version = "1.0.0" java { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 - withSourcesJar() - withJavadocJar() } repositories { @@ -39,29 +37,35 @@ tasks.withType { } } -publishing { - publications { - create("mavenJava") { - from(components["java"]) +mavenPublishing { + publishToMavenCentral(com.vanniktech.maven.publish.SonatypeHost.CENTRAL_PORTAL) + signAllPublications() - pom { - name.set("Firecrawl Java SDK") - description.set("Java SDK for the Firecrawl web scraping API") - url.set("https://github.com/mendableai/firecrawl") + coordinates("com.firecrawl", "firecrawl-java", version.toString()) - licenses { - license { - name.set("MIT License") - url.set("https://opensource.org/licenses/MIT") - } - } + pom { + name.set("Firecrawl Java SDK") + description.set("Java SDK for the Firecrawl web scraping API") + url.set("https://github.com/firecrawl/firecrawl") - scm { - url.set("https://github.com/mendableai/firecrawl") - connection.set("scm:git:git://github.com/mendableai/firecrawl.git") - developerConnection.set("scm:git:ssh://github.com/mendableai/firecrawl.git") - } + licenses { + license { + name.set("MIT License") + url.set("https://opensource.org/licenses/MIT") } } + + developers { + developer { + name.set("Firecrawl") + url.set("https://firecrawl.dev") + } + } + + scm { + url.set("https://github.com/firecrawl/firecrawl") + connection.set("scm:git:git://github.com/firecrawl/firecrawl.git") + developerConnection.set("scm:git:ssh://github.com/firecrawl/firecrawl.git") + } } } From f202e06e9c9137c13efd6dc12777c4fca9b44550 Mon Sep 17 00:00:00 2001 From: "firecrawl-spring[bot]" <254786068+firecrawl-spring[bot]@users.noreply.github.com> Date: Sun, 1 Mar 2026 09:02:00 -0500 Subject: [PATCH 2/3] fix(java-sdk): use correct Maven Central secret names in publish workflow (#2952) Co-authored-by: firecrawl-spring[bot] <254786068+firecrawl-spring[bot]@users.noreply.github.com> Co-authored-by: micahstairs --- .github/workflows/publish-java-sdk.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish-java-sdk.yml b/.github/workflows/publish-java-sdk.yml index fe464ae3d5..608274a062 100644 --- a/.github/workflows/publish-java-sdk.yml +++ b/.github/workflows/publish-java-sdk.yml @@ -61,8 +61,8 @@ jobs: if: ${{ env.VERSION_INCREMENTED == 'true' }} working-directory: ./apps/java-sdk env: - ORG_GRADLE_PROJECT_mavenCentralUsername: ${{ secrets.MAVEN_CENTRAL_USERNAME }} - ORG_GRADLE_PROJECT_mavenCentralPassword: ${{ secrets.MAVEN_CENTRAL_PASSWORD }} + ORG_GRADLE_PROJECT_mavenCentralUsername: ${{ secrets.MAVEN_USERNAME }} + ORG_GRADLE_PROJECT_mavenCentralPassword: ${{ secrets.MAVEN_PASSWORD }} ORG_GRADLE_PROJECT_signingInMemoryKey: ${{ secrets.GPG_SIGNING_KEY }} ORG_GRADLE_PROJECT_signingInMemoryKeyPassword: ${{ secrets.GPG_SIGNING_PASSWORD }} run: ./gradlew publishAndReleaseToMavenCentral --no-configuration-cache From 725e5a5ea9c98e9ceaa8f503ffe7e473e45f0937 Mon Sep 17 00:00:00 2001 From: "firecrawl-spring[bot]" <254786068+firecrawl-spring[bot]@users.noreply.github.com> Date: Sun, 1 Mar 2026 09:04:45 -0500 Subject: [PATCH 3/3] feat(java-sdk): add workflow_dispatch trigger to publish workflow (#2953) Co-authored-by: firecrawl-spring[bot] <254786068+firecrawl-spring[bot]@users.noreply.github.com> Co-authored-by: micahstairs --- .github/workflows/publish-java-sdk.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/publish-java-sdk.yml b/.github/workflows/publish-java-sdk.yml index 608274a062..af9819a81b 100644 --- a/.github/workflows/publish-java-sdk.yml +++ b/.github/workflows/publish-java-sdk.yml @@ -1,6 +1,7 @@ name: Publish Java SDK on: + workflow_dispatch: push: branches: - main