diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 52e66b44..65adf95b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -53,7 +53,6 @@ jobs: release_version=$(grep "^ext.tempto_version" build.gradle | cut -d"'" -f2 | sed 's/-SNAPSHOT//') echo "release_version=$release_version" echo "release_version=$release_version" >> $GITHUB_ENV - echo "next_release_msg=Update build.gradle to next development version" >> $GITHUB_ENV - name: Get last release version id: advance_version @@ -76,26 +75,27 @@ jobs: echo "last_version=$last_version" echo "next_version=$next_version" - - name: Generate CHANGELOG.md - id: generate_changelog - run: | - # Get commits between the latest version and HEAD, excluding changelog commits - changelog=$(git log $last_version..HEAD --pretty=format:"- [%h](https://github.com/${{ github.repository }}/commit/%H) %s" | grep -v "${{ env.next_release_msg }}") - echo "Generating CHANGELOG.md" - echo -e "## Changelog for ${{ env.release_version }}\n\n$changelog\n" > CHANGELOG.md - cat CHANGELOG.md - - name: Update release version and commit run: | # Update the version in build.gradle sed -i "s/ext.tempto_version = '.*'/ext.tempto_version = '${{ env.release_version }}'/" build.gradle - git add CHANGELOG.md build.gradle - git commit -m "Update CHANGELOG.md and build.gradle for version ${{ env.release_version }}" + git add build.gradle + git commit -m "[release-action] release version ${{ env.release_version }}" - name: Add release tag run: | + git checkout -b release-${{ env.release_version }} git tag -a ${{ env.release_version }} -m "Release ${{ env.release_version }}" + - name: Update release version in build.gradle + run: | + git checkout master + # Update the version in build.gradle + sed -i "s/ext.tempto_version = '.*'/ext.tempto_version = '${{ env.next_version}}'/" build.gradle + git add build.gradle + git commit -m "[release-action] prepare for next development iteration" + git checkout release-${{ env.release_version }} + - name: Set up GPG key run: | echo "${{ secrets.GPG_SECRET }}" > ${{ env.GPG_KEY_FILE }} @@ -119,17 +119,11 @@ jobs: cat gradle.properties export NEXUS_USERNAME="${{ secrets.NEXUS_USERNAME }}" export NEXUS_PASSWORD="${{ secrets.NEXUS_PASSWORD }}" - ./gradlew sign publish + ./gradlew sign publish publishToMavenCentral env: GPG_TTY: $(tty) - - - name: Update release version in build.gradle - run: | - # Update the version in build.gradle - sed -i "s/ext.tempto_version = '.*'/ext.tempto_version = '${{ env.next_version}}'/" build.gradle - git add build.gradle - git commit -m "${{ env.next_release_msg }}" - name: Push changes and tags run: | + git checkout master git push origin master --tags diff --git a/build.gradle b/build.gradle index 98761cc7..54489cd3 100644 --- a/build.gradle +++ b/build.gradle @@ -197,10 +197,10 @@ configure(subprojects - expected_result_generator - tempto_examples) { } } } - repositories { maven { - url = uri('https://oss.sonatype.org/service/local/staging/deploy/maven2/') + name = 'ossrh-staging-api' + url = 'https://ossrh-staging-api.central.sonatype.com/service/local/staging/deploy/maven2/' credentials { username = System.getenv('NEXUS_USERNAME') password = System.getenv('NEXUS_PASSWORD') @@ -210,3 +210,43 @@ configure(subprojects - expected_result_generator - tempto_examples) { } } +tasks.register('publishToMavenCentral') { + group = 'publishing' + description = 'Publishes all Maven publications produced by this project to Maven Central.' + dependsOn subprojects.collect { it.tasks.matching { it.name == 'publish' } }.flatten() + doLast { + def username = System.getenv('NEXUS_USERNAME') + def password = System.getenv('NEXUS_PASSWORD') + + if (!username || !password) { + throw new org.gradle.api.GradleException( + "NEXUS_USERNAME and NEXUS_PASSWORD environment variables must be set to publish to Maven Central." + ) + } + + def namespace = System.getenv('NEXUS_NAMESPACE') ?: "io.prestodb" + def credentials = "${username}:${password}" + def token = credentials.bytes.encodeBase64().toString() + + def url = "https://ossrh-staging-api.central.sonatype.com/manual/upload/defaultRepository/${namespace}?publishing_type=automatic" + def connection = new URL(url).openConnection() + connection.connectTimeout = 30_000 + connection.readTimeout = 30_000 + connection.setRequestMethod('POST') + connection.setRequestProperty('Authorization', "Bearer ${token}") + connection.setRequestProperty('Content-Type', 'application/json') + connection.setRequestProperty('Accept', 'application/json') + connection.setDoOutput(true) + + def responseCode = connection.getResponseCode() + def responseBody = responseCode < 400 ? + connection.getInputStream().text : + connection.getErrorStream().text + + if (responseCode < 400) { + logger.lifecycle("Successfully triggered automatic Maven Central publishing: ${responseBody}") + } else { + throw new org.gradle.api.GradleException("Failed to publish to Maven Central. HTTP ${responseCode}: ${responseBody}") + } + } +}