Skip to content

Commit

Permalink
Add automatic release workflow (#134)
Browse files Browse the repository at this point in the history
* Add automatic release workflow

* Increment version

* Update developer guide

---------

Co-authored-by: kaklakariada <[email protected]>
  • Loading branch information
kaklakariada and kaklakariada authored Sep 14, 2024
1 parent 22a74f8 commit 2b03c68
Show file tree
Hide file tree
Showing 6 changed files with 127 additions and 51 deletions.
35 changes: 35 additions & 0 deletions .github/workflows/github_release.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#!/bin/bash

set -o errexit
set -o nounset
set -o pipefail

base_dir="$( cd "$(dirname "$0")/../.." >/dev/null 2>&1 ; pwd -P )"
readonly base_dir
readonly build_dir="$base_dir/build"
readonly release_artifacts_dir="$build_dir/release-artifacts"

cd "$base_dir"
echo "Reading project version from Gradle project at ${base_dir}..."
project_version=$(./gradlew properties --console=plain --quiet | grep "^version:" | awk '{print $2}')
readonly project_version
echo "Read project version '$project_version' from Gradle project"

mkdir -p "$release_artifacts_dir"
cp -v "$build_dir/libs/portmapper-$project_version-all.jar" "$release_artifacts_dir/portmapper-$project_version.jar"
cp -v "$build_dir/libs-checksums/portmapper-$project_version-all.jar.sha512" "$release_artifacts_dir/portmapper-$project_version.jar.sha512"

release_artifacts=$(find "$release_artifacts_dir" -type f)
readonly release_artifacts

readonly title="Release $project_version"
readonly tag="$project_version"
echo "Creating release:"
echo "Git tag : $tag"
echo "Title : $title"
echo "Artifacts: $release_artifacts"

# shellcheck disable=SC2086
release_url=$(gh release create --latest --title "$title" --target main "$tag" $release_artifacts)
readonly release_url
echo "Release URL: $release_url"
4 changes: 2 additions & 2 deletions .github/workflows/gradle.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,11 @@ jobs:
uses: gradle/actions/setup-gradle@v4

- name: Build with Gradle
run: ./gradlew build --warning-mode summary -PjavaVersion=${{ matrix.java }}
run: ./gradlew build --info --warning-mode all -PjavaVersion=${{ matrix.java }}

- name: Sonar analysis
if: ${{ env.DEFAULT_JAVA == matrix.java && env.SONAR_TOKEN != null }}
run: ./gradlew sonarqube -Dsonar.token=$SONAR_TOKEN --info --warning-mode=summary
run: ./gradlew sonarqube -Dsonar.token=$SONAR_TOKEN --info --warning-mode all
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
Expand Down
57 changes: 57 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
name: Release

on:
workflow_dispatch:
inputs:
skip-deploy-maven-central:
description: "Skip deployment to Maven Central"
required: true
type: boolean
default: false

jobs:
release:
runs-on: ubuntu-latest
defaults:
run:
shell: "bash"
concurrency:
group: ${{ github.workflow }}
cancel-in-progress: false
permissions:
contents: write # Required for creating GitHub release
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Fail if not running on main branch
if: ${{ github.ref != 'refs/heads/main' }}
uses: actions/github-script@v7
with:
script: |
core.setFailed('Not running on main branch, github.ref is ${{ github.ref }}. Please start this workflow only on main')
- uses: actions/setup-java@v4
with:
distribution: "temurin"
java-version: 11

- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4

- name: Build
run: ./gradlew build --info --warning-mode all

- name: Publish to Maven Central
if: ${{ !inputs.skip-deploy-maven-central }}
run: ./gradlew publishToSonatype closeAndReleaseSonatypeStagingRepository --info --warning-mode all
env:
ORG_GRADLE_PROJECT_sonatypeUsername: ${{ secrets.OSSRH_USERNAME }}
ORG_GRADLE_PROJECT_sonatypePassword: ${{ secrets.OSSRH_PASSWORD }}
ORG_GRADLE_PROJECT_signingKey: ${{ secrets.OSSRH_GPG_SECRET_KEY }}
ORG_GRADLE_PROJECT_signingPassword: ${{ secrets.OSSRH_GPG_SECRET_KEY_PASSWORD }}

- name: Create GitHub Release
run: ./.github/workflows/github_release.sh
env:
GH_TOKEN: ${{ github.token }}
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [2.2.4] - 2024-09-14

### Refactoring

- [PR #118](https://github.com/kaklakariada/portmapper/pull/118): Upgrade dependencies
- [PR #133](https://github.com/kaklakariada/portmapper/pull/133): Upgrade dependencies
- [PR #134](https://github.com/kaklakariada/portmapper/pull/134): Add automatic release process

## [2.2.3] - 2023-03-19

Expand Down
40 changes: 16 additions & 24 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ plugins {
id 'com.github.johnrengelman.shadow' version '8.1.1'
id "io.github.gradle-nexus.publish-plugin" version "2.0.0"
id 'com.github.ben-manes.versions' version '0.51.0'
id 'org.gradle.crypto.checksum' version '1.4.0'
}

repositories {
Expand All @@ -19,7 +20,7 @@ repositories {
flatDir { dirs 'lib' }
}

version = '2.2.3'
version = '2.2.4'
group 'com.github.kaklakariada'

java {
Expand Down Expand Up @@ -71,6 +72,17 @@ jar {

tasks["build"].dependsOn(shadowJar)

task createSha512ChecksumExecutableJar(type: org.gradle.crypto.checksum.Checksum, dependsOn: [tasks.shadowJar]) {
files = files(tasks.shadowJar.outputs.files)
outputDir = new File(project.buildDir, "libs-checksums")
algorithm = org.gradle.crypto.checksum.Checksum.Algorithm.SHA512
appendFileNameToChecksum = false
}

tasks.shadowJar.configure {
finalizedBy createSha512ChecksumExecutableJar
}

task run(type: JavaExec, dependsOn: shadowJar) {
classpath = shadowJar.outputs.files
mainClass = mainClass
Expand Down Expand Up @@ -118,14 +130,6 @@ sonar {

tasks["sonarqube"].dependsOn(tasks["jacocoTestReport"])

def getOptionalProperty(String name) {
if(project.hasProperty(name)) {
return project.property(name)
}
logger.info("Project property '${name}' not available. Please it to ~/.gradle/gradle.properties")
return null
}

publishing {
publications {
mavenJava(MavenPublication) {
Expand Down Expand Up @@ -156,22 +160,12 @@ publishing {
}
}
}

repositories {
maven {
def releasesRepoUrl = "https://oss.sonatype.org/service/local/staging/deploy/maven2/"
def snapshotsRepoUrl = "https://oss.sonatype.org/content/repositories/snapshots/"
url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl
allowInsecureProtocol = false
credentials(PasswordCredentials) {
username = getOptionalProperty("ossrhUsername")
password = getOptionalProperty("ossrhPassword")
}
}
}
}

signing {
def signingKey = findProperty("signingKey")
def signingPassword = findProperty("signingPassword")
useInMemoryPgpKeys(signingKey, signingPassword)
sign publishing.publications.mavenJava
}

Expand All @@ -180,8 +174,6 @@ nexusPublishing {
repositories {
sonatype {
stagingProfileId = "4f1b95618be44"
username = getOptionalProperty("ossrhUsername")
password = getOptionalProperty("ossrhPassword")
}
}
}
Expand Down
39 changes: 14 additions & 25 deletions doc/developer_guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@

PortMapper is available as a Maven dependency at [Maven Central](https://repo1.maven.org/maven2/com/github/kaklakariada/portmapper/). Use the following coordinates:

* Gradle: `com.github.kaklakariada:portmapper:2.2.3`
* Gradle: `com.github.kaklakariada:portmapper:2.2.4`
* Maven:

```xml
<dependency>
<groupId>com.github.kaklakariada</groupId>
<artifactId>portmapper</artifactId>
<version>2.2.3</version>
<version>2.2.4</version>
</dependency>
```

Expand Down Expand Up @@ -41,31 +41,20 @@ java -jar build/libs/portmapper-*.jar
./gradlew dependencyUpdates
```

## Publish to Maven Central
### Creating a Release

1. Add the following to your `~/.gradle/gradle.properties`:
#### Preparations

```properties
ossrhUsername=<your maven central username>
ossrhPassword=<your maven central passwort>
1. Checkout the `main` branch, create a new branch.
2. Update version number in `build.gradle` and `README.md`.
3. Add changes in new version to `CHANGELOG.md`.
4. Commit and push changes.
5. Create a new pull request, have it reviewed and merged to `main`.

signing.keyId=<gpg key id (last 8 chars)>
signing.password=<gpg key password>
signing.secretKeyRingFile=<path to secret keyring file>
```
#### Perform the Release

2. Increment version number in `build.gradle` and `README.md`, commit and push.
3. Optional: run the following command to do a dry-run:

```sh
./gradlew clean check build publishToSonatype closeSonatypeStagingRepository --info
```

4. Run the following command to publish to Maven Central:

```sh
./gradlew clean check build publishToSonatype closeAndReleaseSonatypeStagingRepository --info
```

5. Create a new [release](https://github.com/kaklakariada/portmapper/releases) on GitHub.
1. Start the release workflow
* Run command `gh workflow run release.yml --repo kaklakariada/portmapper --ref main`
* or go to [GitHub Actions](https://github.com/kaklakariada/portmapper/actions/workflows/release.yml) and start the `release.yml` workflow on branch `main`.
2. Update title and description of the newly created [GitHub release](https://github.com/kaklakariada/portmapper/releases).
6. After some time the release will be available at [Maven Central](https://repo1.maven.org/maven2/com/github/kaklakariada/portmapper/).

0 comments on commit 2b03c68

Please sign in to comment.